在AutoLayout中重置固定的宽度和高度

时间:2014-01-11 16:37:34

标签: ios objective-c autolayout

我正在创建一个名为CTCycleClock的自定义UIView,其子视图名为CTCycleSlider。它会对一个手势做出反应,因此它可以在一个轴上旋转(就像在轮盘赌桌上从上方看一样)。

为实现这一目标,主视图CTCycleClock在CTCycleSlider子视图上创建了两个约束,使其在X和Y上居中。

示例:

enter image description here

此外,CTCycleSlider子视图在自身上创建了两个约束,用于设置特定的宽度和高度。这是必要的,因为否则在旋转时,磁盘会使其自身变大。

这很好,也很正确。但是当superview有更大的尺寸时(例如在iPad上),我不知道如何告诉AutoLayout子视图有一个新的固定宽度和高度等于superview。

这就是我在superview中设置约束的方法:

NSLayoutConstraint *centerX = [NSLayoutConstraint
                              constraintWithItem:subview
                              attribute:NSLayoutAttributeCenterX
                              relatedBy:NSLayoutRelationEqual
                              toItem:self
                              attribute:NSLayoutAttributeCenterX
                              multiplier:1.f constant:0.f];
NSLayoutConstraint *centerY = [NSLayoutConstraint
                               constraintWithItem:subview
                               attribute:NSLayoutAttributeCenterY
                               relatedBy:NSLayoutRelationEqual
                               toItem:self
                               attribute:NSLayoutAttributeCenterY
                               multiplier:1.f constant:0.f];

[self addConstraint:centerX];
[self addConstraint:centerY];

这就是我在子视图中设置约束的方法,其中self.widthAndHeight目前在iPhone上硬编码为320,在iPad上硬编码为450:

NSLayoutConstraint *w = [NSLayoutConstraint
                         constraintWithItem:self
                         attribute:NSLayoutAttributeWidth
                         relatedBy:NSLayoutRelationEqual
                         toItem:nil
                         attribute:NSLayoutAttributeWidth
                         multiplier:1.0f
                         constant:self.widthAndHeight];
NSLayoutConstraint *h = [NSLayoutConstraint
                         constraintWithItem:self
                         attribute:NSLayoutAttributeHeight
                         relatedBy:NSLayoutRelationEqual
                         toItem:nil
                         attribute:NSLayoutAttributeWidth
                         multiplier:1.0f
                         constant:self.widthAndHeight];

[self addConstraint:w];
[self addConstraint:h];

所以我的问题是:如何让子视图首先拥抱一定范围的超视图帧,还要设置其宽度和高度固定?

编辑:关于为什么我需要设置宽度/高度固定的约束的一些说明。

当我不设置宽度/高度固定,并且用户触摸旋转滚轮时,您会得到以下结果:

wheel rotated but is made smaller because of missing width/height constraints

在上图中,我在子视图上设置了约束,将顶部/前导/宽度/高度设置为超视图。当用户尚未旋转车轮子视图时,这很有效,但是当他们这样做时,自动布局约束会强制矩形UIView变小,因此它完全适合超视图。

因此问题仍然存在:如何创建最初将子视图正确调整到超视图的约束,但是然后设置固定的宽度/高度,以便在旋转时,它保持相同的大小?

1 个答案:

答案 0 :(得分:0)

  

...我怎样才能让子视图首先拥抱一个superview框架   一定的余量,还要设定其宽度和高度固定吗?

我不明白你的问题。如果您使图像视图拥有固定边距(在所有边上)的超视图,则图像视图的大小由超视图决定。

您可以将图像视图固定在两侧(例如顶部和左侧)并指定尺寸。然后到其他两侧的距离将根据超视图的大小而变化。或者您可以将其置于超级视图中并修复大小,然后所有边距将根据超级视图的大小而变化。