2015-10-07 79 views
0

我试图创建一个视图控制器来模拟经典的体重秤。我有一个UIView子类(DragView)来表示权重,另一个UIView子类(ContainerView)来模拟板块的尺度。奇怪的行为与自动布局和框架更改与iOS 9

当一个DragView拖动到ContainerView上时,我触发一个动画,将DragView放置在ContainerView中(如果需要,更改大小)。但是,如果用户在ContainerView外部释放DragView,则DragView将被动画到其原始位置和大小。

在这里可以看到的DragView(绿色)和两个ContainerView(在上面的“板”明确颜色)

enter image description here

的DragView的原始帧被设定为约束(比例宽度,顶尖和领先)。一切看起来都很好,但是当我将DragView设置回原来的位置时,我就知道了。

enter image description here

看到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内initWithCoderlayoutSubViews是正确的地方。因为每次设置视图时都会调用layoutSubViews,所以我添加了一个检查(使用CGRectIsEmpty),以便仅在没有值的情况下设置框架。

- (void)layoutSubviews 
{ 
    if (CGRectIsEmpty(_originalFrame)) { 
    _originalFrame = self.frame; 
    } 
} 

回答

0

它在initWithCoder的早期阶段:取得结果框架。该视图只是实例化,并没有通过布局过程进行处理。我认为,最好的地方是layoutSubviews方法。

+0

你把我放在正确的路上,找到了解决办法。我用答案更新了问题。谢谢。 – WedgeSparda

0

当自动布局存在时,如果您弄乱框架,将会发生不好的事情。 尝试改变整个框架,改变对象的.origin

+0

我曾考虑过这个问题,但在很多情况下,尺寸也会改变。 – WedgeSparda