我已经找到了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类不会像它应该的那样响应。其中一个容器视图控制器将开始在横向和纵向模式中执行奇怪的操作,如下所示。


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


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

有人知道这里可能出了什么问题吗?为什么它不按需要更改size类。
编辑,像@Muhammad Yawar Ali这样问,这里是我设置的所有大小类的位置的屏幕截图。我没有任何约束的警告或错误,所以这些屏幕截图包含更新的视图。


我希望这能显示一切需要的东西。
编辑:由于某种原因,我无法把所有的截图都放进去
发布于 2016-03-21 09:33:15
在viewWillTransitionToSize上,您还需要调用超级,将事件传递给下一个响应者(您的responder控制器).
override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {
super.viewWillTransitionToSize(size, withTransitionCoordinator: coordinator)
willTransitionToPortrait = size.height > size.width
}发布于 2018-04-21 16:05:13
意识到这已经两年多了但是..。
我只是碰到了我认为类似的问题。您可能忘记的是,'overrideTraitCollectionForChildViewController‘只覆盖视图子,因此该方法不会对容器执行任何操作,因为它们位于根节点。
我解决了这个问题,将我的两个容器放在Interface中的UIStackView中,并在代码中创建了这个堆栈的一个属性,然后根据方向更新这个轴。例如,在目标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];
}如果您有任何限制是不同的纵向和景观,您将需要调整这些在代码以及。
我想您也可以通过将视图控制器与容器嵌入到另一个视图控制器中来解决这个问题。
发布于 2016-03-21 10:29:17
我已经从存储库中克隆了您的代码:https://github.com/MaikoHermans/sizeClasses.git和编辑的代码--将下面的代码放入控制器中--这将很好地工作&不会影响您在iPads中的设计。导入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的特性,视图布局也一样,但是看起来很好。我尝试过多种方法,但尚未成功,将更新我的答案。
https://stackoverflow.com/questions/35915396
复制相似问题