为啥当我在平移单元格时更改 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 文本颜色