2014-09-16 13 views
9

In iOS 8 gibt es ein Problem oder eine Funktion. Wenn MPVolumeView angezeigt wird, wird es animiert, z. B. von 0 auf seine Breite zu erweitern. Wie kann ich dieses Verhalten beheben? Es gab kein solches Problem auf iOS 7.MPVolumeView Animation auf iOS 8

+0

Ja, das sieht definitiv wie ein Fehler aus. Es kommt nur zum ersten Mal MPVolumeView-Instanz zu einem Superview hinzugefügt. Wenn Sie es entfernen und erneut hinzufügen, wird es nur wie erwartet angezeigt. –

+0

Ich habe ein Radar vor ein paar Tagen für dieses Problem eingereicht: http://openradar.appspot.com/radar?id=5308200412774400 –

+3

Ich hatte das gleiche Problem und was geholfen hat, MPVolumeView Unterklasse und überschreiben einzelne Methode '- (CGRect) volumeSliderRectForBounds: (CGRect) Grenzen { Rückgrenzen; } '. Leider ist es eher ein Workaround. Und ich habe nicht überprüft, wie es funktioniert, wenn die Route-Taste (zum Beispiel für Airplay) angezeigt werden sollte. Auf der anderen Seite zeigt Apple diesen Button in Apps nicht mehr, da er seit iOS7 im Control Center präsentiert wird, also zeige ich es nicht so gut und für mich funktioniert diese Lösung gut. – Anastasia

Antwort

0

Ich bestätige, dass dieses Problem noch in iOS 8 besteht. Die von Anastasia in einem der obigen Kommentare (mit dem Überschreiben von volumeSliderRectForBounds) zur Verfügung gestellte Problemumgehung scheint zu funktionieren, aber nur wenn Route-Taste nicht ist Geschenk. Wenn es vorhanden ist, überlappt der Schieberegler die Routenknopf und es kann nicht mehr gedrückt werden.

Ich habe eine einfache Modifikation ihrer Lösung, vielleicht kann jemand es als Workaround verwenden, bis Apple repariert, dass oder eine bessere Lösung zur Verfügung gestellt wird.

- (CGRect)volumeSliderRectForBounds:(CGRect)bounds 
{ 
    if (self.showsRouteButton) { 
     NSInteger spacer = 10; /* Space between Route button and Volume slider */ 
     CGRect routeButtonRect = [self routeButtonRectForBounds:bounds]; 
     bounds.size.width -= (routeButtonRect.size.width + spacer); 
    } 
    return bounds; 
} 

Ich mag es nicht, den Abstandhalter hardcoding, aber ich konnte nicht finden, wie man es dynamisch berechnet.

2

Eine Möglichkeit, dieses Verhalten zu entfernen, ist die Unterklasse MPVolumeView und einige zusätzliche Arbeit nach [super layoutSubviews].

- (void)layoutSubviews 
{ 
    [super layoutSubviews]; 

    [self cg_recursiveRemoveAnimationsOnView:self]; 
} 

- (void)cg_recursiveRemoveAnimationsOnView:(UIView *)view 
{ 
    [view.layer removeAllAnimations]; 
    for (UIView *subview in view.subviews) { 
     [self cg_recursiveRemoveAnimationsOnView:subview]; 
    } 
} 

Dadurch werden alle eingefügten Animationen entfernt. Also sei sicher, dass du das willst, denn das ist ziemlich der Overkill. Man könnte auch einfach die Animationen position und bounds entfernen (siehe removeAnimationForKey:).

+0

Warum nicht 'UIView.performWithoutAnimation' verwenden - viel einfacher –

+0

Sie meinen" super layoutSubviews "mit' -performWithoutAnimation'? Dies hat nicht funktioniert, da die Animationen anscheinend an anderer Stelle erstellt wurden und auch nicht jede Ebene in MPVolumeView einen 'UIView'-Delegaten hat. – CipherCom

+0

Es sollte eine ähnliche Funktion wie Ihre Methode ausführen. Wenn nicht, ist die Animation eine CA-Animation, die noch seltsamer ist. –