iOS纵向和横向自动布局和尺寸等级

iOS纵向和横向自动布局和尺寸等级,ios,Ios,我使用自动布局和大小类设计布局。现在我有了这个肖像布局 单击“更改”按钮时,蓝色视图的边框和红色视图的边框将交换 @IBAction func change(sender: AnyObject) { let frame = view1.frame view1.frame = view2.frame view2.frame = frame } 现在看来: 然后我将iPhone的方向更改为横向,我希望红色视图将保持在顶部位置,但是,它将更改为: 有谁能帮我想

我使用自动布局和大小类设计布局。现在我有了这个肖像布局

单击“更改”按钮时,蓝色视图的边框和红色视图的边框将交换

    @IBAction func change(sender: AnyObject) {

    let frame = view1.frame
    view1.frame = view2.frame
    view2.frame = frame
}
现在看来:

然后我将iPhone的方向更改为横向,我希望红色视图将保持在顶部位置,但是,它将更改为:

有谁能帮我想一想如何实现这一点吗?谢谢你的帮助! 以下是示例项目:

我刚刚提交了一个对您的github回购的拉取请求,该请求包含了我对该问题的解决方案。下面是我所做工作的概述:

1) 我从情节提要中删除了这两个视图,并以编程方式将它们添加到
viewController

2) 现在,约束以编程方式添加到
viewController

3) 点击
Change
按钮时,将删除约束,然后将其添加回与以前相反的位置(即view1常量变为view2约束,view2约束变为view1约束)

以下是一些相关代码:

@IBAction func change(sender: AnyObject) {
    // Remove existing constraints
    self.firstView.removeConstraints(self.firstView.constraints)
    self.secondView.removeConstraints(self.secondView.constraints)
    self.firstView.removeFromSuperview()
    self.secondView.removeFromSuperview()

    // Decide which view will recieve which constraints now based on their current sizes
    if firstView.frame.height == 50 {
        self.createAutoLayoutForViews(self.secondView, view2: self.firstView)
    } else {
        self.createAutoLayoutForViews(self.firstView, view2: self.secondView)
    }
}
要查看完整的实现,请查看github repo上的pull请求或fork


注意:我只是将视图设置为随机大小。如果希望它们的大小不同,则需要更改这两个视图的自动布局约束

我刚刚在github repo上提交了一个pull请求,该请求提供了解决此问题的方法。下面是我所做工作的概述:

1) 我从情节提要中删除了这两个视图,并以编程方式将它们添加到
viewController

2) 现在,约束以编程方式添加到
viewController

3) 点击
Change
按钮时,将删除约束,然后将其添加回与以前相反的位置(即view1常量变为view2约束,view2约束变为view1约束)

以下是一些相关代码:

@IBAction func change(sender: AnyObject) {
    // Remove existing constraints
    self.firstView.removeConstraints(self.firstView.constraints)
    self.secondView.removeConstraints(self.secondView.constraints)
    self.firstView.removeFromSuperview()
    self.secondView.removeFromSuperview()

    // Decide which view will recieve which constraints now based on their current sizes
    if firstView.frame.height == 50 {
        self.createAutoLayoutForViews(self.secondView, view2: self.firstView)
    } else {
        self.createAutoLayoutForViews(self.firstView, view2: self.secondView)
    }
}
要查看完整的实现,请查看github repo上的pull请求或fork


注意:我只是将视图设置为随机大小。如果希望它们的大小不同,则需要更改两个视图的自动布局约束

似乎这可能是一个自动布局问题。。。交换视图时是否更新约束?你会发布相关的代码吗?@JeffLewis,你好,我已经将示例项目上传到Git了。你需要改变布局的约束条件,这会有所帮助you@harish,您的意思是我需要更改布局,以便在更改为wA hR尺寸等级的景观时将红色视图设置在顶部位置?我不想设置固定约束,我希望红色视图在纵向模式下保持顶部(横向模式),在纵向模式下保持底部(横向模式)。希望我能清楚地描述这个问题,你不能使用自动布局和设置框架。将该视图设置为顶部(或另一个向下)动画时,需要更改其约束。如果在下一次自动布局引擎执行其工作时更改帧(如现在所做的),它将根据其约束将红色视图移回其所在的位置(设置帧位置将被忽略)。似乎这可能是一个自动布局问题。。。交换视图时是否更新约束?你会发布相关的代码吗?@JeffLewis,你好,我已经将示例项目上传到Git了。你需要改变布局的约束条件,这会有所帮助you@harish,您的意思是我需要更改布局,以便在更改为wA hR尺寸等级的景观时将红色视图设置在顶部位置?我不想设置固定约束,我希望红色视图在纵向模式下保持顶部(横向模式),在纵向模式下保持底部(横向模式)。希望我能清楚地描述这个问题,你不能使用自动布局和设置框架。将该视图设置为顶部(或另一个向下)动画时,需要更改其约束。如果下次自动布局引擎执行其工作时更改帧(就像现在一样),它将根据其约束将红色视图移回其所在位置(设置帧位置将被忽略)。