我将转到基于UIPresentationController的视图控制器演示文稿,但是遇到了一些与API混淆的地方。
我有一个自定义的侧边栏式视图控制器演示(类似于LookInside 2014年演示代码)。
这个类集群(UIPresentationController、UIViewControllerTransitioningDelegate和UIViewControllerAnimatedTransitioning)在常规大小类视图上从屏幕边缘显示一个视图控制器作为侧边栏,并在紧凑大小类视图上显示与全屏相同的视图控制器。
在可调整大小的iPad目标上进行测试显示了正确的行为:我将水平大小类设置为"Compact“,视图控制器从侧栏切换到全屏。
但是,我想要更多的粒度。当设备处于横向方向时,我想在iPhone 6和6+上使用侧边栏样式的视图控制器表示,并在纵向方向上对所有iPhones使用全屏样式表示。
所以用我的方法
- (void) viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator我实现了一些逻辑来检测侧边栏是否占用了屏幕的太多,假设我使用了以下条件:
//If my sidebar is going to occupy more than half the new width of the view...
if( self.sidebarTransitionController.width > size.width / 2.0 )
{
//Override the presentation controller's trait collection with Compact horizontal size class
sidebarPresentationController.overrideTraitCollection = [UITraitCollection traitCollectionWithHorizontalSizeClass:UIUserInterfaceSizeClassCompact];
}
else
{
//Otherwise override the trait collection with Regular
sidebarPresentationController.overrideTraitCollection = [UITraitCollection traitCollectionWithHorizontalSizeClass:UIUserInterfaceSizeClassRegular];
}不过,这没什么用。UIPresentationController.overrideTraitCollection的文档声明:
使用此属性可指定要应用于呈现视图控制器和表示视图控制器的任何特征。您指定的特征覆盖当前对视图控制器有效的所有现有特征。此属性的默认值为零。 为该属性分配一个新值将导致表示控制器转换到新的一组特征,这可能会导致对所示接口的动画。
将新值分配给表示控制器并不会导致呈现的接口发生任何改变。(即使我在从overrideTraitCollection对象中创建UIPresentationController时指定了UIViewControllerTransitioningDelegate。)
我遗漏了什么?是否有可能在更细粒度的级别上使用UIPresentationController执行自适应表示?
发布于 2015-08-18 15:13:09
是否有可能在更细粒度的级别上使用
UIPresentationController执行自适应表示?
不容易。
我建议以下其中一种选择:
viewWillTransitionToSize:withTransitionCoordinator:并解散,然后重新呈现呈现的视图控制器,进行任何您想要的更改,例如提供不同的表示样式或表示控制器。这可以在不花费太多时间的情况下给出好的结果。发布于 2016-03-05 03:18:23
使用:
- (UIModalPresentationStyle)adaptivePresentationStyleForPresentationController:(UIPresentationController *)controller
traitCollection:(UITraitCollection *)traitCollection NS_AVAILABLE_IOS(8_3);它被称为旋转,即使大小类没有改变,所以是一个很好的地方来做你的成语/定向特定的适应。请记住,iPhone 6可以在放大模式下运行。
发布于 2016-04-08 04:12:52
我也遇到了同样的问题。从size类解释设备方向是可能的,虽然不是完全明确,但下面的解释对我来说是可行的。
来自编程iOS 9:深入研究视图、视图控制器和框架的一本很棒的书,里面有很多重要的细节,比如:
horizontalSizeClass,verticalSizeClass一个UIUserInterfaceSizeClass值,.Regular或.Compact。这些被称为大小类。 size类组合在一起具有以下含义: 垂直和水平大小类都是.Regular:我们运行在iPad上 垂直大小类是.Regular,但是水平大小类是.Compact:我们在一个iPhone上运行,该应用程序具有纵向方向。(或者,我们可能在一个iPad上运行一个分屏iPad多任务配置;参见第9章)。 垂直和水平大小类都是.Compact:我们在一个iPhone上运行( iPhone 6+除外),该应用程序是面向景观的。 垂直尺寸类是.Compact,水平大小类是.Regular:我们运行在iPhone 6+的横向方向上。
例如,在视图主计长中:
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "ShowComposeView" {
segue.destinationViewController.presentationController!.delegate = self
segue.destinationViewController.modalPresentationStyle = .PageSheet
}
}
func adaptivePresentationStyleForPresentationController(controller: UIPresentationController, traitCollection: UITraitCollection) -> UIModalPresentationStyle {
// If we do an adaptive presentation, and adapt from Page Sheet to Form Sheet,
// then on iPhone 6 we will get the nice rounded corners of the nav bar
// in both portrait and landscape. (From pg. 298 of Programming iOS 9)
// We want this behaviour on iPhone in Portrait orientation only.
if traitCollection.horizontalSizeClass == .Compact && traitCollection.verticalSizeClass == .Regular {
return .FormSheet
}
else {
return .PageSheet
}
}https://stackoverflow.com/questions/29539877
复制相似问题