我正在创建一个名为CTCycleClock的自定义UIView,其子视图名为CTCycleSlider。它会对一个手势做出反应,因此它可以在一个轴上旋转(就像在轮盘赌桌上从上方看一样)。
为实现这一目标,主视图CTCycleClock在CTCycleSlider子视图上创建了两个约束,使其在X和Y上居中。
示例:
此外,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];
所以我的问题是:如何让子视图首先拥抱一定范围的超视图帧,还要设置其宽度和高度固定?
编辑:关于为什么我需要设置宽度/高度固定的约束的一些说明。
当我不设置宽度/高度固定,并且用户触摸旋转滚轮时,您会得到以下结果:
在上图中,我在子视图上设置了约束,将顶部/前导/宽度/高度设置为超视图。当用户尚未旋转车轮子视图时,这很有效,但是当他们这样做时,自动布局约束会强制矩形UIView变小,因此它完全适合超视图。
因此问题仍然存在:如何创建最初将子视图正确调整到超视图的约束,但是然后设置固定的宽度/高度,以便在旋转时,它保持相同的大小?
答案 0 :(得分:0)
...我怎样才能让子视图首先拥抱一个superview框架 一定的余量,还要设定其宽度和高度固定吗?
我不明白你的问题。如果您使图像视图拥有固定边距(在所有边上)的超视图,则图像视图的大小由超视图决定。
您可以将图像视图固定在两侧(例如顶部和左侧)并指定尺寸。然后到其他两侧的距离将根据超视图的大小而变化。或者您可以将其置于超级视图中并修复大小,然后所有边距将根据超级视图的大小而变化。