【问题标题】:iOS 9 iPad split screen completion/finished notificationiOS 9 iPad 分屏完成/完成通知
【发布时间】:2016-05-17 15:03:10
【问题描述】:

我正在为新 iPad 实现 iOS 9 中的新功能,即多任务处理具有分屏的 2 个应用程序。

在用户拖动应用视图大小手柄后,我似乎找不到completion 方法何时完成分屏调整。

我如何确切地通知我的应用我的应用正在分屏运行?

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

【问题讨论】:

标签: ios objective-c ipad ios9 multitasking


【解决方案1】:

有多种方法可以响应对分屏视图配置的更改。根据您想要的响应方式,您可能需要使用不同的方法。

  • 首先,最好使用 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!")
   }
}

这些方法在从 Compact 更改为 Regular 尺寸时调用,反之亦然。并非针对分屏视图句柄的每次调整。在其他情况下,则需要不同的代码。

与以编程方式处理旋转一样,您可能希望实现此方法,它将为您提供最终视图大小:

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

【讨论】:

    【解决方案2】:

    当用户更改分屏尺寸时,根视图会根据新尺寸布置其子视图,因此您可以在视图控制器中实现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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-01
      相关资源
      最近更新 更多