iOS 9 Autolayout:一个居中的正方形

时间:2015-10-16 19:32:10

标签: ios autolayout interface-builder constraints ios9

这似乎比现在更容易。

无论方向如何,我都试图在其绘制的任何iOS设备中将宽高比为1:1(平方)的UIView居中。

详细信息: 我的观点有一个关于timeInterval更新的绘图。我正在使用全屏视图并在每次抽奖中计算我的方块。在方向改变时,整个观点都变成了地狱。我假设如果视图是方形的,我可以信任方向更改动画。

我的约束反复失败,这就是为什么它看起来应该更容易:

View (Square)
    Constraints
        aspect 1:1
Constraints
    View.centerX = centerX
    View.centerY = centerY
    View.leading ≥ leadingMargin + 5 @ 800
    View.top ≥ Top Layout Guide.bottom + 5 @ 800
    trailingMargin ≥ View.trailing + 5 @ 800
    Bottom Layout Guide.top ≥ View.bottom + 5 @ 800

我拥有250岁的内容拥抱优惠 我的内容抗压力为750左右

这留下了约束错误:
  - 缺少约束:需要约束:X位置或宽度
  - 缺少约束:需要约束:Y位置或高度

我的困惑在于我无法锁定到一个维度,因为在旋转时我需要锁定另一个维度。

如上所述......这似乎应该更容易。 将一个边界为5的正方形UIView置于较薄的维度中心 (纵向为5面,横向为5面,顶部和底部)

建议热烈赞赏,解释将无济于事。

enter image description here

2 个答案:

答案 0 :(得分:1)

这是我刚刚放在一起的方法。我无法在IB中完全执行此操作,但至少运行时代码仅限于激活/停用约束,而不必添加/删除或计算/更改任何大小。

在我的故事板中,我有一个带有以下约束的内部UIView

  • 中心X
  • 中心Y
  • 领先于superview = 5,优先级= 999
  • 尾随空格到superview = 5,优先级= 999
  • superview的顶层空间= 5,优先级= 1000
  • 底部空间到superview = 5,优先级= 1000

我为最后四个约束创建了IBOutlets,这是我的视图控制器 -

class ViewController: UIViewController {

    @IBOutlet var leadingConstraint: NSLayoutConstraint!
    @IBOutlet var trailingConstraint: NSLayoutConstraint!
    @IBOutlet var topConstraint: NSLayoutConstraint!
    @IBOutlet var bottomConstraint: NSLayoutConstraint!

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    override func viewWillAppear(animated: Bool) {
        super.viewWillAppear(animated)
        self.setConstraintsForSize(self.view.frame.size)
    } 

    override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {
        self.setConstraintsForSize(size)
    }

    func setConstraintsForSize(size:CGSize) {
        if (size.width > size.height) {
            self.leadingConstraint.active=false;
            self.trailingConstraint.active=false;
            self.topConstraint.active=true;
            self.bottomConstraint.active=true;
        } else {
            self.leadingConstraint.active=true;
            self.trailingConstraint.active=true;
            self.topConstraint.active=false;
            self.bottomConstraint.active=false;
        }
    }  
}

适用于iPhone和iPad,包括带窗口/分屏模式的iPad

答案 1 :(得分:0)

广场需要指定其大小。

Square centerX = Parent centerX
Square centerY = Parent centerY

此时,视图居中,但没有任何内容可让autolayout确定视图的大小。

Square width = 200
Square aspect = 1

如果你想让正方形成为父亲宽度的一部分,那也很简单。

Square width = Parent width * 0.5 //or any other multiplier

您需要调整宽度约束,具体取决于您希望方块在横向上的显示方式。

要拥有“可能的最大方块”,您可以以编程方式将宽度约束设置为min(parentWidth, parentHeight)并调整方向。

或者,leading, trailing, centerX, centerY, and aspect应该会得到类似的结果。任何一组约束都需要能够在逻辑上确定位置和大小而不会产生歧义。

<强>更新
在IB:

 Square centerX = Parent centerX
 Square centerY = Parent centerY
 Square aspect = 1

在代码中:

 if parent width > parent height
 Square width = parent height - 2 * margin

 else
 Square width = parent width - 2 * margin

旋转时调整