Ios 使用containerviews实现不同尺寸的iPad纵向和横向模式
我发现了这个问题,并尝试实施已经给出的解决方案。然而,我遇到了一个问题 我的初始视图控制器有两个容器视图,它们都有自己的视图控制器。我已经创建了一个分配给初始视图控制器的根视图控制器。此类中的代码如下所示Ios 使用containerviews实现不同尺寸的iPad纵向和横向模式,ios,swift,ipad,storyboard,size-classes,Ios,Swift,Ipad,Storyboard,Size Classes,我发现了这个问题,并尝试实施已经给出的解决方案。然而,我遇到了一个问题 我的初始视图控制器有两个容器视图,它们都有自己的视图控制器。我已经创建了一个分配给初始视图控制器的根视图控制器。此类中的代码如下所示 class RootViewController: UIViewController { var willTransitionToPortrait: Bool! var traitCollection_CompactRegular: UITraitCollection! var traitC
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;
}
但是,当我运行它时,大小类不会像它应该的那样响应。其中一个容器视图控制器在横向和纵向模式下都会表现出奇怪的行为,如下图所示
当我不分配rootviewcontroller时,它将如下所示
而在纵向模式下应该是这样的
有人知道这里可能出了什么问题吗?为什么它不按预期更改大小类
编辑
就像@Muhammad Yawar Ali问的,这里是我设置的所有尺寸等级的位置截图。我没有关于任何约束的警告或错误,因此这些屏幕截图包含更新的视图
我希望这显示出所需要的一切
编辑:
由于某些原因,我无法在
视图willTransitionOnToSize
上输入所有屏幕截图,您还需要调用super,以便将事件传递给下一个响应者(您的rootviewcontroller)
我已从存储库克隆了您的代码: 编辑后的代码将下面的代码放入控制器中,它将正常工作&不会影响您在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)
}
}
}
类RootViewController:UIViewController{
重写func viewDidLoad(){
super.viewDidLoad()
//加载视图后执行任何其他设置。
}
override func overrideTraitCollectionForChildViewController(childViewController:UIViewController)->UITraitCollection{
如果view.bounds.width
您可以尝试使用这段代码,但有一个问题,我认为它不能正确更新iPad的特性,视图布局保持不变,但看起来不错。我尝试了多种方法,但尚未成功。我将更新我的答案 意识到这已经超过两年了,但是 我刚刚遇到了一个类似的问题。您可能忘记的是,“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];
}
@property(弱的,非原子的)ibstackview*rootStack;
// ...
-(UIRaitCollection*)重写用于childViewController的RaitCollectionFor:(UIViewController*)childViewController
{
如果(用户界面习惯用法()!=UIUserInterfaceIdiomPad){
返回[super overrideTraitCollectionForChildViewController:childViewController];
}
if(CGRectGetWidth(self.view.bounds)
如果纵向和横向之间存在任何不同的约束,则还需要在代码中调整这些约束
我想你也可以通过在另一个视图控制器中嵌入带有容器的视图控制器来解决这个问题。我已经在所有需要的方向上应用了这些约束。当我在任何iPhone设备上运行它时,它们都能正常工作。它在任何iPad上都不能工作devices@NoSixties您能确认您要应用的尺寸吗ng约束?要在所有设备上使用约束,您必须在wAny*hAny基值维度中应用它们。为了使设计在多个设备上工作,您必须在多个维度中添加约束。请看我刚才所做的编辑。我已更改了所有大小类,我尝试将所有屏幕截图放入其中,但由于某些原因,我无法执行o发布更多截图,而不是当前的截图has@NoSixties选择wRegular常规维度并设计ipad视图记住,如果您对Wany任意维度应用约束,它们将影响所有分辨率和设备,但在wRegular*hRegular约束中,仅影响ipad和landscap视图。@NoSixties可以将代码添加到git并共享吗寻找解决方案?我应用了super,但不幸的是它没有改变任何东西
@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];
}