2015-10-16 72 views
1

这看起来应该是更容易,它目前正在。iOS 9 Autolayout:一个居中的方形

我试图在任何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
内容抱死Prioity我有750

内容抗压

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

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

如上所述...这似乎应该更容易。 以较薄的维度以5的边框居中放置一个Square UIView。
(纵向5个,纵向5个,上方横向5个)

建议热烈赞赏,解释将是无法帮助的。

enter image description here

+1

您希望广场有可用的最大尺寸,仍然是方形的?然后集中它?确切地说,是 – luk2302

+0

@ luk2302。 –

+0

您是否有工作解决方案并寻找更简单的版本,或者您是否要求提供任何工作解决方案? – luk2302

回答

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 

调整此上旋转

+0

Stefan,你能否澄清这是在IB约束还是在代码中完成的。为了清晰起见,我编辑了上述内容。 –

+0

@LordAndrei我更新了我的答案。对我来说最明显的解决方案是在IB中添加简单和固定的约束条件,并在代码中添加一个约束条件,以便可以改变/很棘手的方形宽度。有可能有很多其他方式来做到这一点,但这似乎最明显。 –

+1

需要注意的一件事是,IB将显示该视图的错误,因为没有定义宽度/高度。没关系;您将以编程方式添加缺失的约束。或者你可以在IB中为肖像添加约束,并在旋转时调整它以删除编辑xib/storyboard时的错误。 –

1

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

在我的故事板我有以下限制

  • 中心X
  • 芯Y
  • 前导空格内的UIView到上海华= 5,优先级= 999
  • 尾随空间的SuperView = 5,优先级= 999
  • 超级视图的顶部空间= 5,优先级= 1000
  • 超级视图的底部空间= 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的在窗口/分屏模式