我有一个UITableView
并带有自定义UITableViewCell
。在这个UITableViewCell
里面有几个UILabel
s和一个UIView
包含一些元素。我的布局看起来是这样的:移动UITableViewCell中的视图在调用UILabel SetText后重置
|-TableCell
|-ContentView
|-containerView
| |- assignTime (UILabel)
| |- assignIcon (UIImage)
| |- secondaryAssignTime (UILabel)
| |- secondaryAssignIcon (UIImage)
|-Button 1
我UILabels
被束缚在单一NSTimer
集火每隔半秒钟。定时器显示设定时间和现在之间的差异。所有这些工作正常。当我移动Container View
时会出现问题,我可以将其移动,但NSTimer
一旦触发并更新了定时器标签中的文本,视图就会重置回原来的位置。现在,这只发生在文本上,如果我更新图像没有不寻常的事情发生,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
重置其位置。
EDIT 2
我加了一些断点,看看我能清楚地看到,当视图自行复位。我加了断点这些线路
Assignment *a = [self.myUnit getPrimaryAssignment];
Assignment *s = [_myUnit getSecondaryAssignment];
[self.secondaryAssignIcon setBackgroundImage:[s getIcon] forState:UIControlStateNormal];
而且这条线后updateIndent
[self.containerView updateConstraints];
我发现,认为不会移动到新位置在这些地方。从理论上讲,视图应该在updateCountdown
被调用的时候更新。
编辑3
我决定在NSTimer
updateCountdown
之后调用updateIndent
。我发现只有当文本改变时才会更新视图,而不是只是在调用setText
时。所以,我对事件的顺序有了更好的理解。
updateIndent
被调用,查看获得新的位置- 定时器火灾,并呼吁
updateCountdown
设置定时器文本为“00:00”清除缩进 updateIndent
被调用来设置缩进- 定时器火灾并呼叫
updateCountdown
设置计时器文本为“00:00”缩进不变 updateIndent
被调用来设置缩进 起
- 定时器火灾,并呼吁
updateCountdown
设置定时器文本为“0时01分”清除缩进