【问题标题】:How do I override a size class?如何覆盖尺寸等级?
【发布时间】:2015-08-13 20:10:15
【问题描述】:

我有一个视图控制器。基本上,我想检查一些条件,如果这些条件为真,我想手动设置它的尺寸等级(覆盖它的默认尺寸等级)。

为此,我必须覆盖它的 UITraitCollection。我做了一些研究,并且能够找到这个功能:

setOverrideTraitCollection(collection: UITraitCollection!, forChildViewController childViewController: UIViewController!)

该函数允许我覆盖子视图控制器的特征集合,但我希望视图控制器能够覆盖它自己的特征。

所以回顾一下,我想做以下事情。当视图控制器加载时,我希望它检查一些条件。如果它们是真的,我希望视图控制器将其大小类覆盖为自定义类。

感谢您的帮助!

【问题讨论】:

  • 在此处查看建议的答案:stackoverflow.com/questions/27735341/…
  • @RoryMcKinnel 谢谢!我仍然很困惑。您的回答谈到了表格视图和单元格,我不确定这与大小类有何关系。您确实提到 traitCollection 可以在 iOS 8 中访问,但它是只读属性。抱歉,我对 iOS 编程完全陌生,所以你的回答有点过头了。
  • @sloik 谢谢!我看了看,似乎他们正在updateForcedTraitCollection 中设置特征属性。但是,由于某种原因,他们没有为视图本身设置属性,而是为名为“viewController”的子项设置了它。我不确定他们为什么要这样做。我想更新视图本身的大小类,而不是子视图。
  • 接受的答案建议覆盖traitCollection 属性的getter。 traitCollection 包含系统使用的尺寸等级信息。如果你为你的 UIViewController 覆盖它,那么系统将使用你返回的 sizeclass 而不是它的默认值。至少这是理论。

标签: ios cocoa user-interface


【解决方案1】:

我只是重写了UIViewControllertraitCollection方法,效果很好!

// This is so we can get 'Regular' size class layout on an iPhone in landscape
- (UITraitCollection *)traitCollection
{
    UITraitCollection *traitCollection = super.traitCollection;
    UIDevice *device = [UIDevice currentDevice];

    if (device.userInterfaceIdiom == UIUserInterfaceIdiomPhone && (device.orientation == UIDeviceOrientationLandscapeLeft || device.orientation == UIDeviceOrientationLandscapeRight)) {
        if (traitCollection.horizontalSizeClass == UIUserInterfaceSizeClassCompact) {
            UITraitCollection *regularCollection = [UITraitCollection traitCollectionWithHorizontalSizeClass:UIUserInterfaceSizeClassRegular];
            traitCollection = [UITraitCollection traitCollectionWithTraitsFromCollections:@[traitCollection, regularCollection]];
        }
    }

    return traitCollection;
}

【讨论】:

    【解决方案2】:

    您可以使用包装视图控制器。实施'setOverrideTraitCollection(collection:UITraitCollection!,forChildViewController childViewController:UIViewController!)' 在其中,并将您的主视图控制器重构为该包装器的子级。

    【讨论】:

      【解决方案3】:

      这就是它为我工作的方式(我正在为 iPad 寻找相同的解决方案来区分纵向/横向模式而不使用 childViewController):

      1. 我使用单独的类作为 UIViewController 的子类

      TraitCollectionOverrideViewController.h 文件:

      #import <UIKit/UIKit.h>
      @interface TraitCollectionOverrideViewController : UIViewController
      @end
      

      TraitCollectionOverrideViewController.m 文件只有 traitCollection 属性的 getter 方法:

      - (UITraitCollection *)traitCollection {
          if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) {
              return super.traitCollection;
          } else {
              UITraitCollection *traitCollection_hCompact = [UITraitCollection traitCollectionWithHorizontalSizeClass:UIUserInterfaceSizeClassCompact];
              UITraitCollection *traitCollection_vRegular = [UITraitCollection traitCollectionWithVerticalSizeClass:UIUserInterfaceSizeClassRegular];
              UITraitCollection *traitCollection_CompactRegular = [UITraitCollection traitCollectionWithTraitsFromCollections:@[traitCollection_hCompact, traitCollection_vRegular]];
      
              UITraitCollection *traitCollection_hRegular = [UITraitCollection traitCollectionWithHorizontalSizeClass:UIUserInterfaceSizeClassRegular];
              UITraitCollection *traitCollection_RegularRegular = [UITraitCollection traitCollectionWithTraitsFromCollections:@[traitCollection_hRegular, traitCollection_vRegular]];
      
              BOOL willTransitionToPortrait = self.view.frame.size.height > self.view.frame.size.width;
      
              UITraitCollection *traitCollectionForOverride = willTransitionToPortrait ? traitCollection_CompactRegular : traitCollection_RegularRegular;
              return traitCollectionForOverride;
          } 
      }
      

      我将其定制为 iPad 纵向模式使用 Custom/Regular 尺寸等级和 iPad 横向模式使用标准 Regular/Regular 尺寸等级

      1. 然后在我的真实视图控制器类中,我只使用这个自定义类的子类: @interface ForecastViewController : TraitCollectionOverrideViewController

      2. 然后是您需要做的最后一部分 - 在情节提要中设置与您需要的尺寸等级相关的约束。

      【讨论】:

        猜你喜欢
        • 2021-12-14
        • 2015-12-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-10-06
        • 1970-01-01
        • 2015-04-05
        • 2015-08-14
        相关资源
        最近更新 更多