9

这是它发生的视频:

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;
    }
}

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

这是故事板布局:

在此处输入图像描述

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

4

1 回答 1

6

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

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

如果没有看到更多关于你的观点、约束和出口的信息,我不能给你最终的代码,但你会以这样的方式结束:

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

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

希望能帮助到你。

于 2013-06-12T19:36:21.247 回答