我创建了一个名为CTCycleClock的名为CTCycleSlider的子视图的自定义UIView。它对一个手势作出反应,以便它可以在一个轴上旋转(就像从上面看轮盘表一样)。在AutoLayout中重置固定宽度和高度
为了实现这一点,在主视图CTCycleClock创建对CTCycleSlider子视图两个约束其居中于X和Y
实施例:
此外,CTCycleSlider子视图创建两个约束本身设置了特定的宽度和高度。这是必要的,否则在旋转时,磁盘会变大。
这工作很好,正确。但是当超视图的尺寸更大时(比如在iPad上),我不知道如何告诉AutoLayout子视图有一个新的固定宽度和高度等于超视图。
这是我在上海华设置约束:
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目前硬编码到320上iPhone和450上ipad公司:
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];
所以我的问题是:我怎样才能让一个子视图拥有一定的余量先拥抱超级视图框架,但也设置其宽度和高度固定?
编辑:一些澄清,为什么我需要约束,设置宽度/高度固定。
当我将不设置宽度/高度固定,用户触摸旋转轮盘,你会得到以下结果:
在上图中,我给自己定将top/lead/width/height设置为superview的子视图的约束条件。当用户还没有旋转车轮子视图时,这很好用,但是当他们这样做时,自动布局约束迫使矩形UIView更小,因此它完全适合超级视图。
因此,问题仍然存在:如何创建约束条件,最初将子视图的大小正确调整到超级视图,但随后在旋转时设置固定的宽度/高度,它保持相同的大小?
增加了一些说明。我把它集中在超级视图中。我不想修复这个大小,它应该依赖于superview。但似乎我被迫,因为否则它会调整轮换。顺便说一句,它不是一个图像,而是一个自定义绘制的视图(即它覆盖了drawRect)。 –
因此,将自定义视图的高度和宽度设置为与超级视图相同的大小。 –
我该怎么做?我不知道做这件事的正确地点。问题是我需要在layoutSubviews被调用之前设置这些固定宽度/高度约束,但是在那个阶段,superview的宽度/高度还不知道(因为layoutSubviews先在子视图上调用,然后在superviews,据我所知)。 –