具有容器视图的iPad纵向和横向模式的不同尺寸类别

时间:2016-03-10 11:37:06

标签: ios swift ipad storyboard size-classes

我发现了this问题,我试图实施已经给出的解决方案。但是我遇到了一个问题。

我的初始视图控制器有两个容器视图,它们都有自己的视图控制器。我已经创建了一个分配给初始视图控制器的根视图控制器。这个类中的代码看起来像这样。

class RootViewController: UIViewController {

var willTransitionToPortrait: Bool!
var traitCollection_CompactRegular: UITraitCollection!
var traitCollection_AnyAny: UITraitCollection!

override func viewDidLoad() {
    super.viewDidLoad()
    setupReferenceSizeClasses()
    // Do any additional setup after loading the view.
}

override func viewWillAppear(animated: Bool) {
    willTransitionToPortrait = self.view.frame.size.height > self.view.frame.size.width
}

override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {
    willTransitionToPortrait = size.height > size.width
}

func setupReferenceSizeClasses(){
    let traitCollection_hCompact = UITraitCollection(horizontalSizeClass: .Compact)
    let traitCollection_vRegular = UITraitCollection(verticalSizeClass: .Regular)
    traitCollection_CompactRegular = UITraitCollection(traitsFromCollections: [traitCollection_hCompact, traitCollection_vRegular])

    let traitCollection_hAny = UITraitCollection(horizontalSizeClass: .Unspecified)
    let traitCollection_vAny = UITraitCollection(verticalSizeClass: .Unspecified)
    traitCollection_AnyAny = UITraitCollection(traitsFromCollections: [traitCollection_hAny, traitCollection_vAny])
}

override func overrideTraitCollectionForChildViewController(childViewController: UIViewController) -> UITraitCollection? {
    let traitCollectionForOverride = ((willTransitionToPortrait) != nil) ? traitCollection_CompactRegular : traitCollection_AnyAny

    return traitCollectionForOverride;
}

然而,当我运行它时,size类不会像它应该的那样响应。其中一个容器视图控制器将开始在横向和纵向模式下表现得很奇怪,如下所示。

landscape mode portrait mode

当我不分配rootviewcontroller时,它将如下所示 landscape mode portrait mode

虽然它在纵向模式下看起来像这样 portrait mode how it should look

有谁知道这里可能出现的问题?为什么它不会像所希望的那样改变大小等级。

修改 就像@Muhammad Yawar Ali这里问的是我设置的所有大小类位置的截图。我没有任何约束的警告或错误,因此这些屏幕截图包含更新的视图。

enter image description here enter image description here

我希望这能显示所需的一切。

编辑: 出于某种原因,我无法输入所有截图

3 个答案:

答案 0 :(得分:2)

viewWillTransitionToSize你需要调用super,将事件传递给下一个响应者(你的rootviewcontroller)......

override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {
    super.viewWillTransitionToSize(size, withTransitionCoordinator: coordinator)
    willTransitionToPortrait = size.height > size.width
}

答案 1 :(得分:0)

意识到这已经超过两年但是......

我刚刚遇到了我认为类似的问题。你可能会忘记的是' overrideTraitCollectionForChildViewController'仅覆盖视图子项,因此此方法不会对容器执行任何操作,因为它们位于根目录中。

我解决了这个问题,将我的两个容器放在Interface Builder的UIStackView中,并在代码中创建了这个堆栈的属性,然后根据方向更新了轴。例如,在Objective-C中:

@property (weak, nonatomic) IBOutlet UIStackView *rootStack;

// ...

- (UITraitCollection *)overrideTraitCollectionForChildViewController:(UIViewController *)childViewController
{
    if (UI_USER_INTERFACE_IDIOM() != UIUserInterfaceIdiomPad) {
        return [super overrideTraitCollectionForChildViewController:childViewController];
    }

    if (CGRectGetWidth(self.view.bounds) < CGRectGetHeight(self.view.bounds)) {
        self.rootStack.axis = UILayoutConstraintAxisVertical;
        return [UITraitCollection traitCollectionWithHorizontalSizeClass:UIUserInterfaceSizeClassCompact];
    }
    else {
        self.rootStack.axis = UILayoutConstraintAxisHorizontal;
        return [UITraitCollection traitCollectionWithHorizontalSizeClass:UIUserInterfaceSizeClassRegular];
}

如果您在纵向和横向之间有任何不同的约束,您还需要在代码中调整这些约束。

我想你也可以通过在另一个视图控制器中嵌入带有容器的视图控制器来解决这个问题。

答案 2 :(得分:-1)

我已从存储库克隆您的代码:https://github.com/MaikoHermans/sizeClasses.git 并且编辑后的代码将以下代码放在您的控制器中它将工作正常&amp;不会影响你的iPad设计。     导入UIKit

class RootViewController: UIViewController {

   override func viewDidLoad() {
      super.viewDidLoad()
      // Do any additional setup after loading the view.
   }

   override func overrideTraitCollectionForChildViewController(childViewController: UIViewController) -> UITraitCollection? {
      if view.bounds.width < view.bounds.height {
         return UITraitCollection(horizontalSizeClass: .Unspecified)
      } else {
         return UITraitCollection(horizontalSizeClass: .Regular)
      }
   }
}

您可以尝试使用此代码,但有一个问题我认为它不能正确更新ipads的特性和视图布局保持不变但看起来不错。我尝试了多种方法,但没有成功,但会更新我的答案。