首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有容器视图的iPad纵向和景观模式的不同大小类

带有容器视图的iPad纵向和景观模式的不同大小类
EN

Stack Overflow用户
提问于 2016-03-10 11:37:06
回答 3查看 1K关注 0票数 4

我已经找到了this问题,并尝试实现已经给出的解决方案。然而,我遇到了一个问题。

我的初始视图控制器有两个容器视图,它们都有自己的视图控制器。我已经创建了一个根视图控制器,它被分配给初始视图控制器。这个类中的代码如下所示。

代码语言:javascript
复制
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类不会像它应该的那样响应。其中一个容器视图控制器将开始在横向和纵向模式中执行奇怪的操作,如下所示。

当我不分配rootviewcontroller控制器时,它将如下所示

而在肖像模式下,它应该是这样的

有人知道这里可能出了什么问题吗?为什么它不按需要更改size类。

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

我希望这能显示一切需要的东西。

编辑:由于某种原因,我无法把所有的截图都放进去

EN

回答 3

Stack Overflow用户

发布于 2016-03-21 09:33:15

viewWillTransitionToSize上,您还需要调用超级,将事件传递给下一个响应者(您的responder控制器).

代码语言:javascript
复制
override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {
    super.viewWillTransitionToSize(size, withTransitionCoordinator: coordinator)
    willTransitionToPortrait = size.height > size.width
}
票数 2
EN

Stack Overflow用户

发布于 2018-04-21 16:05:13

意识到这已经两年多了但是..。

我只是碰到了我认为类似的问题。您可能忘记的是,'overrideTraitCollectionForChildViewController‘只覆盖视图,因此该方法不会对容器执行任何操作,因为它们位于根节点。

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

代码语言:javascript
复制
@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];
}

如果您有任何限制是不同的纵向和景观,您将需要调整这些在代码以及。

我想您也可以通过将视图控制器与容器嵌入到另一个视图控制器中来解决这个问题。

票数 0
EN

Stack Overflow用户

发布于 2016-03-21 10:29:17

我已经从存储库中克隆了您的代码:https://github.com/MaikoHermans/sizeClasses.git和编辑的代码--将下面的代码放入控制器中--这将很好地工作&不会影响您在iPads中的设计。导入UIKit

代码语言:javascript
复制
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的特性,视图布局也一样,但是看起来很好。我尝试过多种方法,但尚未成功,将更新我的答案。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35915396

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档