我有UITableView
个自定义UITableViewCell
。在此UITableViewCell
内部有一些UILabel
和一个UIView
来包含一些元素。我的布局看起来像这样:
|-TableCell
|-ContentView
|-containerView
| |- assignTime (UILabel)
| |- assignIcon (UIImage)
| |- secondaryAssignTime (UILabel)
| |- secondaryAssignIcon (UIImage)
|-Button 1
我的UILabels
绑定到一个NSTimer
设置,每半秒启动一次。计时器显示设定时间和现在之间的差异。所有这一切都很好。问题发生在我移动Container View
时我可以移动它,但只要NSTimer
触发并更新Timer标签中的文本,视图就会重置回原来的位置。现在,这只发生在文本中,如果我更新图像没有发生异常,Container View
会保留在我放置的位置。
以下是我用于更新Container View's
职位的代码:
-(void) updateIndent{
int indent = 20;
CGRect f = self.contentView.frame;
f.size.width = f.size.width - self.myUnit.depth * indent;
f.origin.x = f.origin.x + self.myUnit.depth * indent;
self.containerView.frame = f;
[self.containerView updateConstraints];
}
用于更新定时器和图像的代码:
-(void) updateCountdown{
Assignment *a = [self.myUnit getPrimaryAssignment];
if(a){
[self.assignTime setText:[a getTimeRemaining]];
[self.assignIcon setBackgroundImage:[a getIcon] forState:UIControlStateNormal];
} else {
[self.assignTime setText:@""];
[self.assignIcon setBackgroundImage:nil forState:UIControlStateNormal];
}
Assignment *s = [_myUnit getSecondaryAssignment];
if(s){
[self.secondaryAssignTime setText:[s getTimeRemaining]];
[self.secondaryAssignIcon setBackgroundImage:[s getIcon] forState:UIControlStateNormal];
} else {
[self.secondaryAssignTime setText:@""];
[self.secondaryAssignIcon setBackgroundImage:nil forState:UIControlStateNormal];
}
}
因此,回顾一下,当我调用updateIndent
时,视图会按预期更新。当我调用updateCountdown
时,如果调用了setText
方法,则视图会重置回其原始位置。
修改
我尝试将所有内容移到containerView
之外,但它仍然具有相同的效果。我还试图通过将其替换为文字字符串并仍然相同来查看它是否与我的getTimeRemaining
有关。我更新了我的文字,containerView
重置了它的位置。
编辑2
我添加了一些断点,看看我是否能够确切地看到视图重置的时间。我在这些行中添加了断点
Assignment *a = [self.myUnit getPrimaryAssignment];
Assignment *s = [_myUnit getSecondaryAssignment];
[self.secondaryAssignIcon setBackgroundImage:[s getIcon] forState:UIControlStateNormal];
在updateIndent
[self.containerView updateConstraints];
我发现视图在这些地方都没有移动到新的位置。理论上,视图应该在updateCountdown
被调用的时候更新。
编辑3
我决定在updateIndent
updateCountdown
之后致电NSTimer
。我发现只有在文本发生变化时才会更新视图,而在调用setText
时不。所以,我对事件的顺序有了更好的理解。
updateIndent
被调用,视图获得新的位置updateCountdown
将计时器文本设置为“00:00”清除缩进updateIndent
来设置缩进updateCountdown
将计时器文本设置为“00:00”缩进未更改 updateIndent
来设置缩进updateCountdown
将计时器文本设置为“00:01”清除缩进答案 0 :(得分:0)
我终于能够解决这个问题了。我为我正在编辑的约束创建了一个出口。因此,我不是使用上面描述的updateIndent
方法,而是将其重新设计为只更新一个约束。
self.indentMargin.constant = self.myUnit.depth * indent;