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

Posted

技术标签:

【中文标题】为啥当我在平移单元格时更改 UIImageView 的图像时,整个视图会重置一秒钟?【英文标题】:Why when I change the image of the UIImageView while panning the cell does the whole view reset for a second?为什么当我在平移单元格时更改 UIImageView 的图像时,整个视图会重置一秒钟? 【发布时间】:2013-06-08 00:13:02 【问题描述】:

这是发生的视频:

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

【问题讨论】:

我建议你粘贴更多代码。 我添加了故事板布局和所有平移单元格代码,我不知道还要提供什么。 我建议把你的非机密代码放到一个新项目中,放到GitHub上。通过您粘贴的代码我找不到问题,我认为代码不完整。 检查你的自动布局约束,我相信这是这种奇怪行为的关键 我认为@Gabriele Petronella 是对的。你可以检查一下。否则请拆分您的代码并将其发布到 GitHub。 【参考方案1】:

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

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

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

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

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

希望对你有帮助。

【讨论】:

除了在情节提要中检查自动布局之外,我实际上并没有在任何地方使用它。这仍然适用吗? 这里的项目被简化为通过 + 添加文本(这将为您提供要与之交互的单元格)的能力。然后,您可以滑动单元格并查看问题。向右滑动显示更改的问题。向左滑动表明没有问题。 cl.ly/2g3X3O083i3l 您的单元格显然在其 xib 中显示了约束,因此即使您不使用,它们也在起作用。我下载了你的项目,为你的故事板禁用了自动布局(右侧面板的第一个“选项卡”),并测试了滑动手势。我看不到您在视频中显示的闪光灯。当然,你所有的 UI 都坏了,因为你在 Interface Builder 中使用 Auto Layout 设计了它。所以,要么你使用自动布局来移动东西,要么你必须重新设计你的整个 UI。 对于任何阅读的人来说,是的,当我使用自动布局约束并更改约束的常量来移动图像视图时,我确实修复了它。

以上是关于为啥当我在平移单元格时更改 UIImageView 的图像时,整个视图会重置一秒钟?的主要内容,如果未能解决你的问题,请参考以下文章

当我在 ios 中展开和折叠 TableList 单元格时如何更改 UILabel 文本颜色

选择单元格时更改图像

选择表格视图单元格时显示自定义 UIImageView

使用平移手势选择多个表格视图单元格

为啥当我滚动我的 tabelview 单元格时我的 imageview 正在缩小?

UICollectionView 单元格没有动画运动