Ich habe einen View-Controller, der einen anderen View-Controller mit modalPresentationStyle = UIModalPresentationCustom
präsentiert. Die Dinge sind so eingerichtet, dass ein Teil der Ansicht des präsentierenden Ansichts-Controllers unter der Ansicht des präsentierten Ansichts-Controllers erscheint. In diesem Zustand verarbeitet der darstellende Ansicht-Controller die automatische Drehung immer noch korrekt und ich handle die Drehung für den präsentierten Ansichts-Controller mithilfe des automatischen Layouts.
Ich versuche jetzt, den vorgestellten View-Controller interaktiv zu verwerfen, indem ich die API für die benutzerdefinierte View-Controller-Überleitung von iOS 7 verwende. Es funktioniert, außer dass, wenn die interaktive Kündigung abgebrochen wird, die Handhabung der Autorotation nicht mehr funktioniert. (Es funktioniert wieder, nachdem der vorgestellte View-Controller später beendet wurde.) Warum passiert das und wie kann ich das beheben?
BEARBEITEN : Hier ist Code, den Sie ausführen können, um das Problem zu demonstrieren. Eine Ansicht wird von unten angezeigt, und Sie können sie durch Wischen ausblenden. Wenn Sie die Kündigung abbrechen, indem Sie sie nicht ganz durchziehen, reagiert die Ansicht des präsentierenden Ansichtscontrollers nicht mehr auf Rotationen, und die Ansicht des präsentierten Ansichtscontrollers weist ein verwirrtes Layout auf.
BEARBEITEN : Hier ist der Link zum folgenden Code als Xcode-Projekt: Ссылка
Entschuldigung für den massiven Code-Dump, aber ich weiß nicht, was ich falsch mache. Hier ist eine Skizze von dem, was vor sich geht: ViewController1
präsentiert ViewController2
. ViewController1
implementiert UIViewControllerTransitioningDelegate
, sodass die Animations- / interaktiven Controller für die Übergänge zurückgegeben werden. ViewController2
hat einen Pan-Gesten-Erkenner, der die interaktive Entlassung antreibt; Es implementiert UIViewControllerInteractiveTransitioning
, um als interaktiver Controller für die Kündigung zu dienen. Es behält auch einen Verweis auf den Animationscontroller für die Ablehnung bei, um den Übergang zu beenden, wenn der Benutzer die Ansicht weit genug nach unten zieht. Schließlich gibt es zwei Animationscontroller-Objekte. PresentAnimationController
richtet die Auto-Layout-Einschränkungen ein, um Drehungen für die Ansicht des präsentierten Ansichts-Controllers zu verarbeiten, und DismissAnimationController
beendet die Entlassung.
ViewController1.h
%Vor%ViewController1.m
%Vor%ViewController2.h
%Vor%ViewController2.m
%Vor%PresentAnimationController.h
%Vor%PresentAnimationController.m
%Vor%DismissAnimationController.h
%Vor%DismissAnimationController.m
%Vor%AppDelegate.m
%Vor% Ich glaube, ich habe dein Problem gefunden. In Ihrem PresentAnimationController.m geben Sie toVC.view.translatesAutoresizingMaskIntoConstraints = NO;
an und Sie legen alle Ihre Einschränkungen in dem von Ihnen festgelegten Abschlussblock fest
- (void)animateTransition:
Kommentieren Sie diese Zeile und alle Constraints und addConstraint:
Aufrufe und es sollte funktionieren
BEARBEITEN:
Ich habe gesehen, dass es nur funktioniert, wenn die Geste abgebrochen wurde und nicht, wenn die Ansicht anfänglich angezeigt wird. Kommentiere alles im Completion-Block außer
aus [transitionContext completeTransition:YES];
Tags und Links iphone ios ios7 uiviewcontroller auto-rotation