Документация 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 не соответствует действительности?
представленный контроллер представления всегда в полноэкранном режиме не соответствует пользовательскому переходу iOS 7?
Ответы (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 права, но, вероятно, не полностью объясняет описание настоящего метода.