为什么当我在平移单元格时更改UIImageView的图像时,整个视图会重置一秒钟?

时间:2013-06-08 00:13:03

标签: ios objective-c uiview uigesturerecognizer uipangesturerecognizer

以下是有关它的视频:

http://cl.ly/3V0D3U1m3w0E

基本上,如果我在平移时更改UIImageView(X)的图像属性,它会将视图中的所有控件恢复到原始的未打开位置。 (它们都嵌入在UIView中,所以我可以“平移单元格”,而UIImageViews在视图之外并且是独立的。)

如果我不更改图像:

http://cl.ly/3T1N1G33320G

为了记录,我在用户平均一定数量时更改图像,我相信80分。

以下是代码:

// Only allow the cell to be moved 100 pixels left or right
if (xPos <= 100 && xPos >= -100) {
    // Move our cell to the xPos we defined
    CGRect slidingViewFrame = self.slidingView.frame;
    slidingViewFrame.origin = CGPointMake(xPos - 100, 0);
    self.slidingView.frame = slidingViewFrame;

    if (xPos >= 80) {
        if (_removeIconIsActive == NO) {
            // Change remove icon to a red, active state and animate the change
            self.removeIconImageView.image = [UIImage imageNamed:@"remove-icon-active.png"];

            _removeIconIsActive = YES;
        }

        CGRect removeIconFrame = self.removeIconImageView.frame;
        removeIconFrame.origin = CGPointMake(40, 35);
        self.removeIconImageView.frame = removeIconFrame;
    }
}

视图在故事板中设置,但移动和操作都是在代码中完成的。

这是故事板布局:

enter image description here

这是处理细胞平移的完整方法:https://gist.github.com/anonymous/c51c7cb2997c89094f08

1 个答案:

答案 0 :(得分:6)

如果您使用自动布局,则根本不应修改框架属性。框架是应用布局约束的结果,而不是“写入”属性。

我想你会有一个约束来设置你的视图的x位置。为该约束创建IBOutlet,而不是修改frame,修改约束的constant属性。然后拨打该视图的layoutIfNeeded

如果没有详细了解您的观点,约束和出口,我无法给您最终的代码,但您会以这样的结尾:

self.leftConstraint.constant = xPos - 100.f;
[self.slidingView setNeedsUpdateConstraints];
[self.slidingView layoutIfNeeded];

我对正在发生的事情的解释是,设置图像会改变图像视图的固有大小,这会使约束重新计算,将所有内容都回到起始位置。只要您滑动另一个像素,您就会再次启动,frame属性再次获胜。

希望它有所帮助。