iOS 9 iPad分屏完成/完成通知

时间:2016-02-08 01:44:30

标签: ios objective-c ipad ios9 multitasking

我正在iOS 9中实现新功能,用于通过分屏进行2个应用程序的多任务处理的新iPad。

在用户拖动应用视图尺寸句柄之后,我似乎无法找到分屏调整完成时的completion方法。

我如何通知我的应用程序我的应用程序是在分屏中运行的?

注意:这与UISplitViewController不同。我指的是分屏中2个应用程序的多任务处理,而不是UISplitViewController

2 个答案:

答案 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调用的屏幕空间紧凑演示文稿。如果拖动视图句柄足以跨越此边界,则可以通过此视图控制器方法获取回调:

的OBJ-C

- (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也很有用,虽然这不是这个问题的具体答案。