представленный контроллер представления всегда в полноэкранном режиме не соответствует пользовательскому переходу iOS 7?

Документация Apple (https://developer.apple.com/library/ios/documentation/uikit/reference/UIViewController_Class/Reference/Reference.html#//apple_ref/occ/instm/UIViewController/presentViewController:animated:завершение:) Говорит: «На iPhone и iPod touch представленный вид всегда отображается в полноэкранном режиме». Но в iOS 7 есть настраиваемый API перехода контроллера представления. Уже есть много демонстраций, которые показывают, что «presentedViewController» может быть любого размера, который мы хотим. В этом случае документ Apple не соответствует действительности?


person Andy    schedule 24.03.2014    source источник
comment
Документы Apple в порядке. Я думаю, вы просто забываете, что когда вы настраиваете переход, вы можете делать все, что хотите, с рамкой/границами/краями и т. д.   -  person Aaron    schedule 24.03.2014
comment
По умолчанию iPhone 6+ с альбомной ориентацией адаптирует полноэкранную презентацию к модальному листу формы, поэтому технически документация неверна. iPhone 6+ даже автоматически переключается между полноэкранным режимом и модальным листом формы, когда вы переключаетесь между книжной и альбомной ориентацией.   -  person Geoff Hackworth    schedule 15.08.2015
comment
@Aaron Документы несколько вводят в заблуждение. Да, технически вы правы, говоря, что представленное представление является полноэкранным, но это бесполезно для большинства пользователей документации API. Документы Apple необходимо обновить, чтобы четко указать, что представленные представления могут иметь полностью настраиваемый внешний вид, включая внешний вид, который не отображается в полноэкранном режиме. Это больше, чем небольшая проблема стиля: это основная проблема удобства использования, которая внезапно делает API более привлекательным и понятным.   -  person Womble    schedule 23.11.2016


Ответы (1)


Я считаю, что Apple по-прежнему права, хотя, возможно, и вводит в заблуждение. По умолчанию он будет отображаться в полноэкранном режиме, но если вы предоставите собственный делегат перехода, вы сможете делать с фреймом все, что хотите, и т. д.

Что Apple имеет в виду под полным экраном (в этом контексте, я думаю), так это то, что его края простираются до максимальной высоты и ширины устройства. Раньше это ограничивалось такими вещами, как панель навигации или другие панели инструментов, которые могли быть добавлены, но по умолчанию в iOS 7 они больше не учитываются.

Однако с пользовательским переходом теперь вы можете иметь меньший контроллер представления, наложенный на другой контроллер представления, изменив размер его кадра во время перехода. Пример см. в потрясающем посте об API перехода Тихана и Лакса:

http://www.teehanlax.com/blog/custom-uiviewcontroller-transitions/

Вот метод -animateTransition для установки фрейма в контроллере представления to на значение, которое явно не будет полноэкранным. Обратите внимание на строки, в которых установлена ​​переменная endFrame:

- (void)animateTransition:(id <UIViewControllerContextTransitioning>)transitionContext {
    // Grab the from and to view controllers from the context
    UIViewController *fromViewController = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];
    UIViewController *toViewController = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];

    // Set our ending frame. We'll modify this later if we have to
    CGRect endFrame = CGRectMake(80, 280, 160, 100);   // <- frame is only 160 x 100

    if (self.presenting) {
        fromViewController.view.userInteractionEnabled = NO;

        [transitionContext.containerView addSubview:fromViewController.view];
        [transitionContext.containerView addSubview:toViewController.view];

        CGRect startFrame = endFrame;
        startFrame.origin.x += 320;

        toViewController.view.frame = startFrame;

        [UIView animateWithDuration:[self transitionDuration:transitionContext] animations:^{
            fromViewController.view.tintAdjustmentMode = UIViewTintAdjustmentModeDimmed;
            toViewController.view.frame = endFrame;
        } completion:^(BOOL finished) {
            [transitionContext completeTransition:YES];
        }];
    }
    else {
        toViewController.view.userInteractionEnabled = YES;

        [transitionContext.containerView addSubview:toViewController.view];
        [transitionContext.containerView addSubview:fromViewController.view];

        endFrame.origin.x += 320;

        [UIView animateWithDuration:[self transitionDuration:transitionContext] animations:^{
            toViewController.view.tintAdjustmentMode = UIViewTintAdjustmentModeAutomatic;
            fromViewController.view.frame = endFrame;
        } completion:^(BOOL finished) {
            [transitionContext completeTransition:YES];
        }];
    }
}

Таким образом, при предоставлении пользовательского перехода контроллер представления, из которого вы выполняете переход из и в, будет иметь те края и/или рамки, которые вы для них укажете. Они не становятся внезапно полноэкранными, когда вы начинаете настраиваемый переход, поэтому Apple права, но, вероятно, не полностью объясняет описание настоящего метода.

person Aaron    schedule 24.03.2014