Xcode 视图隐藏视图和旋转时不满意的布局

Xcode 视图隐藏视图和旋转时不满意的布局,xcode,interface-builder,uistackview,Xcode,Interface Builder,Uistackview,我有一个视图控制器,我想在其中隐藏某些子视图、标签等,这取决于trait集合是什么。例如,水平压缩时,我想隐藏的一侧有标签,垂直压缩时,我想隐藏的顶部和底部有标签 因为我想隐藏整个界面部分,所以听起来UIStackView会让这更容易。同样,我正在尽我所能在Interface Builder/Xcode(9.1 9B55)中而不是在代码中,尝试保持简单 设计的主要元素是一个棋盘,它: 长宽比始终为1:1 在视图中尽可能大 然后,根据当前特征集合,我要移动和隐藏标签及其周围的其他项目 我已经开

我有一个视图控制器,我想在其中隐藏某些子视图、标签等,这取决于trait集合是什么。例如,水平压缩时,我想隐藏的一侧有标签,垂直压缩时,我想隐藏的顶部和底部有标签

因为我想隐藏整个界面部分,所以听起来UIStackView会让这更容易。同样,我正在尽我所能在Interface Builder/Xcode(9.1 9B55)中而不是在代码中,尝试保持简单

设计的主要元素是一个棋盘,它:

  • 长宽比始终为1:1
  • 在视图中尽可能大
然后,根据当前特征集合,我要移动和隐藏标签及其周围的其他项目

我已经开始构建一个水平堆栈视图、对齐和分布设置为“填充”。其中有两个项目,boardView(紫色)和labelView(黄色)

labelView中有两个标签,在视图中为这些标签的布局设置了约束

boardView具有纵横比1:1(@1000)的约束:

我为堆栈视图设置了以下约束,将其固定到superview(底部除外):

  • Safe Area.trailing=堆栈视图。trailing(@1000)
  • 安全区域.leading=堆栈视图.leading(@1000)
  • Safe Area.top=堆栈视图.top(@1000)
  • 安全区域.bottom>=堆栈视图.bottom(@1000)
我设置这些约束以确保boardView不会溢出superview:


  • boardView.width我认为您可以在没有“已安装”属性的情况下实现您想要的: 只需为纵向模式设置“隐藏”:


    更新20171205-更新到Xcode 9.2(9C40b),行为也一样。我一直在尝试使用它,但它并不能真正解决我的问题。在hR上隐藏nameView时,nameView中项目的约束会出错。您也可以将它们隐藏起来,但如果布局比此(非常精简)示例更复杂,则这似乎无法缩放。installed属性的问题是,“卸载”后控制器无法获得
    leftView
    。它已从superview中删除,controller无法从xib加载它,因为它只发生在vc生命周期的开始。解决方案是使用插座来
    leftView
    stackView
    并调用
    [self.stackView removeArrangedSubview:self.leftView]
    [self.stackView addArrangedSubview:self.leftView]
    视图中将过渡大小:withTransitionCoordinator:
    方法,具体取决于屏幕方向。我发誓我曾经在WWDC视频中看到过将UIStackView的一部分隐藏起来的“已安装”技巧,这就是为什么我认为这是“苹果方式”的原因关于在IB中删除视图的问题。我已经浏览了所有WWDC视频,我可以找到参考堆栈视图,但到目前为止我没有找到。我找到了,WWDC 2017,Interface Builder中的自动布局技术,从29:00开始。你是对的,乔沙德。他用来根据大小分类隐藏东西的属性实际上是“隐藏的”,而不是“安装的”。hidden属性似乎将包含的视图保持在UIStackView的排列子视图中。将你的答案标记为答案,我为没有在你的答案过期之前给你奖金而道歉。我要说的是,当我最初看到这个演示时让我兴奋不已的这项技术,似乎用处有限。。。当我使用它来隐藏堆栈视图中的项时,包括所有子视图等,我会得到这些隐藏项的各种缺失约束错误。UIStackView似乎没有像视频中暗示的那样处理从自动布局过程中删除这些内容。也许这对于一个超级简单的设计是可行的,但我不知道这对于任何实际的应用程序是如何起作用的。
    2017-12-03 19:25:55.710381-0600 TestLayoutSIngleView[31439:3231004] [LayoutConstraints] Unable to simultaneously satisfy constraints.
        Probably at least one of the constraints in the following list is one you don't want. 
        Try this: 
            (1) look at each constraint and try to figure out which you don't expect; 
            (2) find the code that added the unwanted constraint or constraints and fixes it. 
    (
        "<NSLayoutConstraint:0x60400009b8a0 UIView:0x7fe920603e90.width == UIView:0x7fe920603e90.height   (active)>",
        "<NSLayoutConstraint:0x60000009ced0 UIStackView:0x7fe92050bd70.leading == UILayoutGuide:0x6000001b5d20'UIViewSafeAreaLayoutGuide'.leading   (active)>",
        "<NSLayoutConstraint:0x60000009d100 UIStackView:0x7fe92050bd70.top == UILayoutGuide:0x6000001b5d20'UIViewSafeAreaLayoutGuide'.top   (active)>",
        "<NSLayoutConstraint:0x60000009d150 UILayoutGuide:0x6000001b5d20'UIViewSafeAreaLayoutGuide'.trailing == UIStackView:0x7fe92050bd70.trailing   (active)>",
        "<NSLayoutConstraint:0x60000009d1a0 UILayoutGuide:0x6000001b5d20'UIViewSafeAreaLayoutGuide'.bottom >= UIStackView:0x7fe92050bd70.bottom   (active)>",
        "<NSLayoutConstraint:0x60000009e5a0 'UISV-canvas-connection' UIStackView:0x7fe92050bd70.leading == UIView:0x7fe920603e90.leading   (active)>",
        "<NSLayoutConstraint:0x60000009ce30 'UISV-canvas-connection' UIStackView:0x7fe92050bd70.top == UIView:0x7fe920603e90.top   (active)>",
        "<NSLayoutConstraint:0x60000009e5f0 'UISV-canvas-connection' V:[UIView:0x7fe920603e90]-(0)-|   (active, names: '|':UIStackView:0x7fe92050bd70 )>",
        "<NSLayoutConstraint:0x60000009cde0 'UISV-canvas-connection' H:[UIView:0x7fe920603e90]-(0)-|   (active, names: '|':UIStackView:0x7fe92050bd70 )>",
        "<NSLayoutConstraint:0x60000009e7d0 'UIView-Encapsulated-Layout-Height' UIView:0x7fe92050b8f0.height == 375   (active)>",
        "<NSLayoutConstraint:0x60000009e780 'UIView-Encapsulated-Layout-Width' UIView:0x7fe92050b8f0.width == 667   (active)>",
        "<NSLayoutConstraint:0x60000009d060 'UIViewSafeAreaLayoutGuide-bottom' V:[UILayoutGuide:0x6000001b5d20'UIViewSafeAreaLayoutGuide']-(0)-|   (active, names: '|':UIView:0x7fe92050b8f0 )>",
        "<NSLayoutConstraint:0x60000009d010 'UIViewSafeAreaLayoutGuide-left' H:|-(0)-[UILayoutGuide:0x6000001b5d20'UIViewSafeAreaLayoutGuide'](LTR)   (active, names: '|':UIView:0x7fe92050b8f0 )>",
        "<NSLayoutConstraint:0x60000009d0b0 'UIViewSafeAreaLayoutGuide-right' H:[UILayoutGuide:0x6000001b5d20'UIViewSafeAreaLayoutGuide']-(0)-|(LTR)   (active, names: '|':UIView:0x7fe92050b8f0 )>",
        "<NSLayoutConstraint:0x60000009cfc0 'UIViewSafeAreaLayoutGuide-top' V:|-(0)-[UILayoutGuide:0x6000001b5d20'UIViewSafeAreaLayoutGuide']   (active, names: '|':UIView:0x7fe92050b8f0 )>"
    )
    
    Will attempt to recover by breaking constraint 
    <NSLayoutConstraint:0x60400009b8a0 UIView:0x7fe920603e90.width == UIView:0x7fe920603e90.height   (active)>