奇怪的行为与自动布局和框架更改与iOS 9
问题描述:
我试图创建一个视图控制器来模拟经典的体重秤。我有一个UIView子类(DragView)来表示权重,另一个UIView子类(ContainerView)来模拟板块的尺度。奇怪的行为与自动布局和框架更改与iOS 9
当一个DragView拖动到ContainerView上时,我触发一个动画,将DragView放置在ContainerView中(如果需要,更改大小)。但是,如果用户在ContainerView外部释放DragView,则DragView将被动画到其原始位置和大小。
在这里可以看到的DragView(绿色)和两个ContainerView(在上面的“板”明确颜色)
的DragView的原始帧被设定为约束(比例宽度,顶尖和领先)。一切看起来都很好,但是当我将DragView设置回原来的位置时,我就知道了。
看到DragView的框架区别?这是为什么发生?
以下是我的代码的相关部分。
DragView.m
- (id)initWithCoder:(NSCoder *)aDecoder
{
self = [super initWithCoder:aDecoder];
if (self) {
_originalFrame = self.frame;
}
return self;
}
- (void)animateBackToOrigin
{
[UIView animateWithDuration:0.1 animations:^{
self.frame = _originalFrame;
}];
}
我在这两种方法检查_originalFrame
值和它返回的值相同。
答:
我的错误是设定_originalFrame内initWithCoder
,layoutSubViews
是正确的地方。因为每次设置视图时都会调用layoutSubViews
,所以我添加了一个检查(使用CGRectIsEmpty
),以便仅在没有值的情况下设置框架。
- (void)layoutSubviews
{
if (CGRectIsEmpty(_originalFrame)) {
_originalFrame = self.frame;
}
}
答
它在initWithCoder的早期阶段:取得结果框架。该视图只是实例化,并没有通过布局过程进行处理。我认为,最好的地方是layoutSubviews方法。
你把我放在正确的路上,找到了解决办法。我用答案更新了问题。谢谢。 – WedgeSparda