如何在iOS中的横向模式下更改按钮位置?

时间:2017-08-11 09:40:14

标签: ios swift3 autolayout

在此我需要在横向模式下更改删除按钮的位置,并且需要在步进器旁边显示任何人都可以帮助我如何实现这一点,这里是我需要的空白区域的图像显示删除按钮

enter image description here

1 个答案:

答案 0 :(得分:2)

假设您已经处理了方向并且您正确地接收了事件,我发现如果您创建双重约束并操纵它们的优先级,则效果最佳。

在故事板中,将按钮放在其中一个位置上,并添加所需的所有约束。将所有优先级设置为900(稍后将解释为什么不是1000)并确认布局正常。

现在将这些约束优先级设置为100并开始为其他布局添加约束。将这些约束优先级设置为900,并确认布局也适用于此场景。

此时,您需要将一组的优先级更改为900,将其他组的优先级更改为100以交换模式。所以现在进入编码...

您将需要这些约束的出口,拖动所有这些约束,命名并添加然后更改每个约束的优先级将是痛苦的。但幸运的是,您可以使用数组,因此在代码中添加以下内容:

@IBOutlet var portraitConstraints: [NSLayoutConstraint]?
@IBOutlet var landscapeConstraints: [NSLayoutConstraint]?

现在只需将所有约束拖动到这两个数组作为出口。

其余的很直接。类似的东西:

func setMode(mode: LayoutMode, animated: Bool) {
    switch mode {
    case .portrait:
        portraitConstraints?.forEach { $0.priority = 900 }
        landscapeConstraints?.forEach { $0.priority = 100 }
    case .landscape:
        portraitConstraints?.forEach { $0.priority = 100 }
        landscapeConstraints?.forEach { $0.priority = 900 }
    }
    UIView.animate(withDuration: animated ? 0.3 : 0.0) { 
        self.view.layoutIfNeeded()
    }
}

关于不将约束优先级设置为1000:

不允许更改优先级设置为1000的约束的优先级。不知道为什么,不关心原因。

编辑:这似乎不清楚所以让我举一个例子来说明你的案例:

假设您有一个视图,其中包含名为inputContainer的“Mobile”,“1”,“20.00KD”,“ - / +”,名为deleteButton的删除按钮和左侧的图片视图叫imageView

现在,纵向模式可以将约束设置为:

  • inputContainer.top = superView.top + t
  • inputContainer.leading = imageView.trailing + a
  • deleteButton.leading = inputContainer.leading
  • deleteButton.top = inputContainer.bottom + b
  • deleteButton.bottom = superView.bottom - t

然后在风景中你会有:

  • inputContainer.center.y = superView.center.y
  • inputContainer.leading = imageView.trailing + a
  • deleteButton.center.y = switchView.center.y
  • deleteButton.leading = inputContainer.trailing + b

现在将其中一个设置为900的优先级,其他设置为故事板中的100个。然后将所有这些约束连接到代码中的相应数组中。就是这样。