Контроллер просмотра не автоматически поворачивается после отмены интерактивного перехода на увольнение для представленного контроллера представления

У меня есть контроллер представления, представляющий другой контроллер представления с modalPresentationStyle = UIModalPresentationCustom . Вещи настроены так, что часть представления контроллера представления отображается под представлением представления представления. В этом состоянии контроллер представления представления по-прежнему правильно выполняет автоматическое вращение, и я обрабатываю поворот для представленного контроллера представления с помощью автоматического отключения.

Теперь я пытаюсь реализовать интерактивное отклонение представленного контроллера представлений с помощью API-интерфейса iOS 7 с настраиваемым представлением. Это работает, за исключением того, что, когда интерактивное увольнение отменено, обработка автовращения перестает работать. (Он работает снова после того, как представленный диспетчер представлений отклонен позже.) Почему это происходит, и как я могу это исправить?

EDIT : Вот код, который вы можете запустить, чтобы продемонстрировать проблему. Вид появляется снизу, и вы можете отбросить его, вытащив его. Если вы отмените увольнение, не пропуская его полностью, представление диспетчера представления представления больше не отвечает на вращения, и представление представленного представления диспетчера имеет испорченный макет.

EDIT : Вот ссылка на код ниже как проект Xcode: https://drive.google.com/file/d/0BwcBqUuDfCG2YlhVWE1QekhUWlk/edit?usp=sharing

Извините за массивный дамп кода, но я не знаю, что я делаю неправильно. Вот эскиз того, что происходит: ViewController1 представляет ViewController2 . ViewController1 реализует UIViewControllerTransitioningDelegate , поэтому он возвращает анимационные / интерактивные контроллеры для переходов. ViewController2 имеет распознаватель жесты, который управляет интерактивным увольнением; он реализует UIViewControllerInteractiveTransitioning для использования в качестве интерактивного контроллера для увольнения. Он также держит ссылку на контроллер анимации для увольнения, чтобы завершить переход, если пользователь слишком сильно перетаскивает представление. Наконец, есть два объекта контроллера анимации. PresentAnimationController устанавливает ограничения PresentAnimationController для обработки поворотов для представления представления контроллера представления, а DismissAnimationController завершает увольнение.

ViewController1.h

 #import <UIKit/UIKit.h> @interface ViewController1 : UIViewController <UIViewControllerTransitioningDelegate> @end 

ViewController1.m

 #import "ViewController1.h" #import "ViewController2.h" #import "PresentAnimationController.h" #import "DismissAnimationController.h" @implementation ViewController1 - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; if (self) { self.title = @"View 1"; self.navigationItem.prompt = @"Press “Present” and then swipe down to dismiss."; self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Present" style:UIBarButtonItemStylePlain target:self action:@selector(pressedPresentButton:)]; } return self; } - (void)viewDidLoad { [super viewDidLoad]; self.view.backgroundColor = [UIColor whiteColor]; // Some subview just to check if layout is working. UIView * someSubview = [[UIView alloc] initWithFrame:self.view.bounds]; someSubview.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; someSubview.backgroundColor = [UIColor orangeColor]; someSubview.layer.borderColor = [UIColor redColor].CGColor; someSubview.layer.borderWidth = 2; [self.view addSubview:someSubview]; } // -------------------- - (void)pressedPresentButton:(id)sender { ViewController2 * presentedVC = [[ViewController2 alloc] initWithNibName:nil bundle:nil]; presentedVC.modalPresentationStyle = UIModalPresentationCustom; presentedVC.transitioningDelegate = self; [self presentViewController:presentedVC animated:YES completion:nil]; } // -------------------- // View Controller Transitioning Delegate Methods. - (id <UIViewControllerAnimatedTransitioning>)animationControllerForPresentedController:(UIViewController *)presented presentingController:(UIViewController *)presenting sourceController:(UIViewController *)source { return [[PresentAnimationController alloc] init];; } - (id <UIViewControllerAnimatedTransitioning>)animationControllerForDismissedController:(UIViewController *)dismissed { DismissAnimationController * animationController = [[DismissAnimationController alloc] init]; ViewController2 * presentedVC = (ViewController2 *)self.presentedViewController; if (presentedVC.dismissalIsInteractive) { presentedVC.dismissAnimationController = animationController; } return animationController; } - (id <UIViewControllerInteractiveTransitioning>)interactionControllerForPresentation:(id <UIViewControllerAnimatedTransitioning>)animator { return nil; } - (id <UIViewControllerInteractiveTransitioning>)interactionControllerForDismissal:(id <UIViewControllerAnimatedTransitioning>)animator { ViewController2 * presentedVC = (ViewController2 *)self.presentedViewController; if (presentedVC.dismissalIsInteractive) { return presentedVC; } else { return nil; } } @end 

ViewController2.h

 #import <UIKit/UIKit.h> #import "DismissAnimationController.h" @interface ViewController2 : UIViewController <UIViewControllerInteractiveTransitioning> @property (weak, nonatomic) UIView * contentView; @property (nonatomic, readonly) BOOL dismissalIsInteractive; @property (strong, nonatomic) DismissAnimationController * dismissAnimationController; @end 

ViewController2.m

 #import "ViewController2.h" @interface ViewController2 () @property (strong, nonatomic) id<UIViewControllerContextTransitioning> transitionContext; @end @implementation ViewController2 - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; if (self) { _dismissalIsInteractive = NO; } return self; } - (void)viewDidLoad { [super viewDidLoad]; self.view.backgroundColor = [UIColor colorWithWhite:0 alpha:0.5]; // Set up content view. CGRect frame = UIEdgeInsetsInsetRect(self.view.bounds, UIEdgeInsetsMake(15, 15, 15, 15)); UIView * contentView = [[UIView alloc] initWithFrame:frame]; self.contentView = contentView; contentView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; contentView.backgroundColor = [UIColor cyanColor]; contentView.layer.borderColor = [UIColor blueColor].CGColor; contentView.layer.borderWidth = 2; [self.view addSubview:contentView]; // Set up pan dismissal gesture recognizer. UIPanGestureRecognizer * panGesture = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(dismissalPan:)]; [self.view addGestureRecognizer:panGesture]; } // -------------------- - (void)dismissalPan:(UIPanGestureRecognizer *)panGesture { switch (panGesture.state) { case UIGestureRecognizerStateBegan: { _dismissalIsInteractive = YES; [self.presentingViewController dismissViewControllerAnimated:YES completion:nil]; break; } case UIGestureRecognizerStateChanged: { CGPoint translation = [panGesture translationInView:self.view]; CGFloat percent; if (translation.y > 0) { percent = translation.y / self.view.bounds.size.height; percent = MIN(percent, 1.0); } else { percent = 0; } // Swiping content view down. CGPoint center; center.x = CGRectGetMidX(self.view.bounds); center.y = CGRectGetMidY(self.view.bounds); if (translation.y > 0) { center.y += translation.y; // Only allow swiping down. } self.contentView.center = center; self.view.backgroundColor = [UIColor colorWithWhite:0 alpha:(0.5 * (1.0 - percent))]; [self.transitionContext updateInteractiveTransition:percent]; break; } case UIGestureRecognizerStateEnded: // Fall through. case UIGestureRecognizerStateCancelled: { _dismissalIsInteractive = NO; id<UIViewControllerContextTransitioning> transitionContext = self.transitionContext; self.transitionContext = nil; DismissAnimationController * dismissAnimationController = self.dismissAnimationController; self.dismissAnimationController = nil; CGPoint translation = [panGesture translationInView:self.view]; if (translation.y > 100) { // Complete dismissal. [dismissAnimationController animateTransition:transitionContext]; } else { // Cancel dismissal. void (^animations)() = ^() { CGPoint center; center.x = CGRectGetMidX(self.view.bounds); center.y = CGRectGetMidY(self.view.bounds); self.contentView.center = center; self.view.backgroundColor = [UIColor colorWithWhite:0 alpha:0.5]; }; void (^completion)(BOOL) = ^(BOOL finished) { [transitionContext cancelInteractiveTransition]; [transitionContext completeTransition:NO]; }; [UIView animateWithDuration:0.5 delay:0 options:UIViewAnimationOptionCurveEaseOut animations:animations completion:completion]; } break; } default: { break; } } } // -------------------- // View Controller Interactive Transitioning Methods. - (void)startInteractiveTransition:(id<UIViewControllerContextTransitioning>)transitionContext { self.transitionContext = transitionContext; } @end 

PresentAnimationController.h

 #import <Foundation/Foundation.h> @interface PresentAnimationController : NSObject <UIViewControllerAnimatedTransitioning> @end 

PresentAnimationController.m

 #import "PresentAnimationController.h" #import "ViewController2.h" @implementation PresentAnimationController - (void)animateTransition:(id <UIViewControllerContextTransitioning>)transitionContext { UIViewController * fromVC = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey]; ViewController2 * toVC = (ViewController2 *)[transitionContext viewControllerForKey:UITransitionContextToViewControllerKey]; UIView * containerView = [transitionContext containerView]; CGPoint toCenter = fromVC.view.center; CGRect toBounds = fromVC.view.bounds; toVC.view.center = toCenter; toVC.view.bounds = toBounds; [toVC.view layoutIfNeeded]; [containerView addSubview:fromVC.view]; [containerView addSubview:toVC.view]; CGRect contentViewEndFrame = toVC.contentView.frame; CGRect contentViewStartFrame = contentViewEndFrame; contentViewStartFrame.origin.y += contentViewStartFrame.size.height; toVC.contentView.frame = contentViewStartFrame; UIColor * endBackgroundColor = toVC.view.backgroundColor; toVC.view.backgroundColor = [UIColor clearColor]; void (^animations)() = ^() { toVC.contentView.frame = contentViewEndFrame; toVC.view.backgroundColor = endBackgroundColor; }; void (^completion)(BOOL) = ^(BOOL finished) { toVC.view.autoresizingMask = UIViewAutoresizingNone; toVC.view.translatesAutoresizingMaskIntoConstraints = NO; NSLayoutConstraint * centerXConstraint = [NSLayoutConstraint constraintWithItem:toVC.view attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:fromVC.view attribute:NSLayoutAttributeCenterX multiplier:1 constant:0]; NSLayoutConstraint * centerYConstraint = [NSLayoutConstraint constraintWithItem:toVC.view attribute:NSLayoutAttributeCenterY relatedBy:NSLayoutRelationEqual toItem:fromVC.view attribute:NSLayoutAttributeCenterY multiplier:1 constant:0]; NSLayoutConstraint * widthConstraint = [NSLayoutConstraint constraintWithItem:toVC.view attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:fromVC.view attribute:NSLayoutAttributeWidth multiplier:1 constant:0]; NSLayoutConstraint * heightConstraint = [NSLayoutConstraint constraintWithItem:toVC.view attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:fromVC.view attribute:NSLayoutAttributeHeight multiplier:1 constant:0]; [containerView addConstraint:centerXConstraint]; [containerView addConstraint:centerYConstraint]; [containerView addConstraint:widthConstraint]; [containerView addConstraint:heightConstraint]; [transitionContext completeTransition:YES]; }; [UIView animateWithDuration:0.5 delay:0 options:UIViewAnimationOptionCurveEaseOut animations:animations completion:completion]; } - (NSTimeInterval)transitionDuration:(id <UIViewControllerContextTransitioning>)transitionContext { return 0.5; } @end 

DismissAnimationController.h

 #import <Foundation/Foundation.h> @interface DismissAnimationController : NSObject <UIViewControllerAnimatedTransitioning> @end 

DismissAnimationController.m

 #import "DismissAnimationController.h" #import "ViewController2.h" @implementation DismissAnimationController - (void)animateTransition:(id <UIViewControllerContextTransitioning>)transitionContext { ViewController2 * fromVC = (ViewController2 *)[transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey]; UIViewController * toVC = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey]; UIView * containerView = [transitionContext containerView]; [containerView addSubview:toVC.view]; [containerView addSubview:fromVC.view]; void (^animations)() = ^() { CGRect contentViewEndFrame = fromVC.contentView.frame; contentViewEndFrame.origin.y = CGRectGetMaxY(fromVC.view.bounds) + 15; fromVC.contentView.frame = contentViewEndFrame; fromVC.view.backgroundColor = [UIColor clearColor]; }; void (^completion)(BOOL) = ^(BOOL finished) { if ([transitionContext isInteractive]) { [transitionContext finishInteractiveTransition]; } [transitionContext completeTransition:YES]; }; [UIView animateWithDuration:0.5 delay:0 options:UIViewAnimationOptionCurveLinear animations:animations completion:completion]; } - (NSTimeInterval)transitionDuration:(id <UIViewControllerContextTransitioning>)transitionContext { return 0.5; } @end 

AppDelegate.m

 #import "AppDelegate.h" #import "ViewController1.h" @implementation AppDelegate - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; ViewController1 * vc = [[ViewController1 alloc] initWithNibName:nil bundle:nil]; UINavigationController * nav = [[UINavigationController alloc] initWithRootViewController:vc]; self.window.rootViewController = nav; [self.window makeKeyAndVisible]; return YES; } @end 

  • Swift TableView в UIView не отображает данные
  • Swift ViewController Фон становится черным с альфой
  • Просмотр содержимого контроллера при использовании Interface Builder
  • Отправить сообщение делегата от UIPopover на главный UIViewController
  • iOS: Как узнать, вызван ли viewDidLoad?
  • какая разница между контроллером и классом View
  • Бесконечная прокрутка по таблицеView, размещенная внутри UIViewController в Swift
  • Функция вызова из другого ViewController
  • One Solution collect form web for “Контроллер просмотра не автоматически поворачивается после отмены интерактивного перехода на увольнение для представленного контроллера представления”

    Кажется, я нашел твою проблему. в вашем CurrentAnimationController.m вы указываете toVC.view.translatesAutoresizingMaskIntoConstraints = NO; и вы установите все свои ограничения в блоке завершения, который вы установили - (void)animateTransition:

    Прокомментируйте, что строка и все ограничения и addConstraint: вызовы, и она должна работать

    РЕДАКТИРОВАТЬ:

    Просто видел, что он работал только тогда, когда жест был отменен, а не когда вид изначально отображается. Прокомментируйте все в блоке завершения, за исключением

    [transitionContext completeTransition:YES];

    Interesting Posts

    Как сохранить большое (60 МБ +) изображение в библиотеке фотографий?

    Использование логотипа facebook в приложении iOS

    IOS ошибка фликкера при переполнении css: прокрутка изменяется на переполнение: скрыто

    Упорядоченные массивы с Firebase

    iOS проверяет, существует ли делегат перед вызовом метода

    iOS 8 – имя пользователя UITextField обеспечивает запись, когда становится первым ответчиком ПОСЛЕ текстового поля пароля

    Панель навигации исчезает, если перезагружать данные с помощью UISearchController

    Активное шумоподавление через наушники iPhone по умолчанию

    Непубличные селекторы

    Что означает значение -> в объекте C

    Как использовать Vuforia?

    Оптимизация запроса на основные данные

    iOS UITableViewAutomaticDimension RowHeight Плохая производительность / Прыжки

    Непризнанный селектор, отправленный экземпляру при архивировании данных (NSCoding)

    Массив из словарных клавиш в быстрых

    PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.