contentOffset von UIScrollView während der rotation
Ich manuell aktualisieren möchten der contentOffset
einer UIScrollView
während der rotation ändert. Die scroll-view füllt den Bildschirm und hat eine flexible Breite und flexibler Höhe.
Ich versuche momentan ein update der contentOffset in willRotateToInterfaceOrientation
wie diese:
- (void) willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
[Utils logPoint:myScrollView.contentOffset tag:@"initial"];
myScrollView.contentOffset = CGPointMake(modifiedX, modifiedY);
[Utils logPoint:myScrollView.contentOffset tag:@"modified"];
}
-(void) didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation {
[Utils logPoint:myScrollView.contentOffset tag:@"final"];
}
Jedoch, der Letzte Wert ist nicht der geänderte Wert, und es irgendwie zu sein scheint, von ihm beeinflusst, aber es ist nicht ersichtlich für mich wie.
Diese sind einige der Ergebnisse, die ich bekomme:
initial: (146.000000;-266.000000)
modified: (81.000000;-108.000000)
final: (59.000000;-0.000000)
initial: (146.000000;-266.000000)
modified: (500.000000;500.000000)
final: (59.000000;500.000000)
initial: (146.000000;-266.000000)
modified: (-500.000000;-500.000000)
final: (-0.000000;-0.000000)
Wie aktualisiere ich die contentOffset einer scroll-view während einer rotation ändern?
- Haben Sie versucht, ändern der contentOffset in
willAnimateRotationToInterfaceOrientation
statt? Eine animation-block vorhanden sein sollten, dann vielleicht das Ergebnis anders. - Ja, und Es funktioniert gut. Trotzdem würde ich gerne wissen, warum es verhält sich nicht wie erwartet, wenn ich es ändern in willRotateToInterfaceOrientation.
- Meine Vermutung wäre, dass der Rahmen der Elternteil nur die änderungen nach
willRotateToInterfaceOrientation
Sie eine andere contentOffset, aber das ist man änderte sich sofort wieder, weil der superview-Rahmen auch, nur ändert sich dann. Für das OS ist es, wie Sie sich geändert haben würde den Rahmen einige Zeit früher, weder in Bezug auf die anstehende rotation. - Würden Sie mir Ihren Kommentar als Antwort? Ich denke, Sie sind nützlich und verdienen upvotes.
- Gute Idee. Es ist nicht so, dass ich nicht wollen, dass diese Punkte... 😉
Du musst angemeldet sein, um einen Kommentar abzugeben.
Konvertieren mein Kommentar zu einer Antwort 🙂
Versuchen
contentOffset
innerhalbwillAnimateRotationToInterfaceOrientation:duration:
statt. Eine animation-block vorhanden sein sollten, dann, und das OS was Ihre änderungen zu contentOffset, wie die Zugehörigkeit zu den Veränderungen, verursacht durch die rotation.Wenn Sie ändern contentOffset vor, wie es aussieht ist das system nicht, Achtung diese änderungen, wie die Zugehörigkeit zu der Drehung, und immer noch gilt-rotation-Anpassung, diesmal ausgehend von Ihrem neuen Dimensionen.
viewWillTransitionToSize
oderwillTransitionToTraitCollection
Folgenden snippets funktioniert der trick, wenn paging aktiviert ist UIScrollView und page-offset beibehalten werden.
Erklären, eine Eigenschaft, die berechnet position currentPage vor der Drehung, und legen Sie es auf -1 in
viewDidLoad
Überschreiben dann die
willRotateToInterfaceOrientation:toInterfaceOrientation:duration
- Methode und weisen berechneten Wert zu.Dann sorgen wir dafür, dass vor der rotation durchgeführt wird, setzen wir unsere scrollview Inhalt offset korrekt, so zu konzentrieren, dass es zu unserer
lastPageBeforeRotate
Antwort aktualisiert für iOS 8+
Implementieren viewWillTransitionToSize:withTransitionCoordinator: im controller.
Beispiel: