我正在iOS 9中实现新功能,用于通过分屏进行2个应用程序的多任务处理的新iPad。
在用户拖动应用视图尺寸句柄之后,我似乎无法找到分屏调整完成时的completion
方法。
我如何通知我的应用程序我的应用程序是在分屏中运行的?
注意:这与UISplitViewController
不同。我指的是分屏中2个应用程序的多任务处理,而不是UISplitViewController
答案 0 :(得分:0)
当用户更改分屏大小时,根视图将为新大小布置其子视图,因此您可以在视图控制器中实现viewDidlayoutSubviews
。
-(void)viewDidLayoutSubviews
{
if(!CGSizeEqualToSize(self.lastFrameSize,self.view.frame.size))
{
NSLog(@"Size changed:(%f x %f)",self.view.frame.size.width, self.view.frame.size.height);
}
self.lastFrameSize=self.view.frame.size;
}
答案 1 :(得分:0)
有多种方法可以响应拆分屏幕视图配置的更改。根据您的响应方式,您可能必须使用不同的方法。
首先,最好使用Autolayout和Storyboard约束,这些约束允许您的视图自然地适应大多数或全部视图大小更改。
在某些情况下,您可能需要在分屏改变显着时进行布局更改,并将可用屏幕空间从全屏或几乎全屏移动到iOS调用的屏幕空间紧凑演示文稿。如果拖动视图句柄足以跨越此边界,则可以通过此视图控制器方法获取回调:
- (void)traitCollectionDidChange:(UITraitCollection*)previousTraitCollection {
if (self.traitCollection.horizontalSizeClass == UIUserInterfaceSizeClassCompact) {
NSLog(@"split screen area now compact!");
} else if (self.traitCollection.horizontalSizeClass == UIUserInterfaceSizeClassRegular) {
NSLog(@"split screen area now regular!");
}
}
override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
if self.traitCollection.horizontalSizeClass == .compact {
print("split screen area now compact!")
}
}
从压缩更改为常规尺寸时会调用这些方法,反之亦然。不适用于拆分屏幕视图手柄的每个调整。在其他情况下,需要不同的代码。
与以编程方式处理轮换的情况一样,您可能希望实现此方法,该方法将为您提供最终视图大小:
viewWillTransitionToSize:withTransitionCoordinator:
即使更改不足以跨越Regular-Compact边界,也会调用此方法。检查传递给您的方法的size
参数,并查看示例,该示例显示您可以放置在转换之前,期间和之后调用的代码的位置。
- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id <UIViewControllerTransitionCoordinator>)coordinator
{
[super viewWillTransitionToSize:size withTransitionCoordinator:coordinator];
// Code here will execute before the rotation begins.
// Equivalent to placing it in the deprecated method -[willRotateToInterfaceOrientation:duration:]
[coordinator animateAlongsideTransition:^(id<UIViewControllerTransitionCoordinatorContext> context) {
// Place code here to perform animations during the rotation.
// You can pass nil or leave this block empty if not necessary.
} completion:^(id<UIViewControllerTransitionCoordinatorContext> context) {
// Code here will execute after the rotation has finished.
// Equivalent to placing it in the deprecated method -[didRotateFromInterfaceOrientation:]
}];
}
我认为使用trait variations and size classes in your storyboards也很有用,虽然这不是这个问题的具体答案。