我在我的控制器中有两个UIView成员,progressLineView和buttonsView。在某些时候,我称之为这种方法:
- (void) drawPlayProgressLine{
progressLineView = [[UIView alloc] initWithFrame:CGRectMake(0.0, 0.0, 1, buttonsView.frame.size.height)];
progressLineView.backgroundColor = [UIColor whiteColor];
[buttonsView addSubview:progressLineView];
}
一切正常,我还有一个方法可以改变视图的位置:
- (void) moveProgressLine{
CGRect frame = progressLineView.frame;
frame.origin.x++;
progressLineView.frame = frame;
}
在调用moveProgressLine
方法几次之后我想再次调用drawPlayProgressLine
,而不是将视图完全移动到起始位置,它会创建一个新视图。调用的drawPlayProgressLine
越多,我在屏幕上看到的视图就越多,但我只需要一个。
我不明白当我只创建一个对象时会发生这种情况。如何移动视图而不是每次都创建一个新视图?另一个问题:如何完全删除它(直到调用drawPlayProgressLine
方法再次创建它)
答案 0 :(得分:0)
您应该在创建之前检查它是否已创建,并在必要时移动它:
- (void) drawPlayProgressLine{
if(progressLineView == nil)
{
progressLineView = [[UIView alloc] init];
progressLineView.backgroundColor = [UIColor whiteColor];
[buttonsView addSubview:progressLineView];
}
progressLineView.frame = CGRectMake(0.0, 0.0, 1, buttonsView.frame.size.height);
}
答案 1 :(得分:0)
您可能没有使父视图无效。不会创建新对象,而是在移动它们后将其显示留在屏幕上。
至于第二个问题:
[progressLineView removeFromSuperview];
[progressLineView release];
progressLineView = nil;
答案 2 :(得分:0)
我不明白当我只创建一个对象时会发生这种情况。
每次调用-drawPlayProgressLine
方法时,都会创建一个新视图。称之为10次,你可以获得10次观看。
如何移动视图而不是每次都创建一个新视图?
每次都不要通过-drawPlayProgressLine
创建视图。相反,您可以执行以下任一操作:
创建视图控制器的视图层次结构时,创建progressLineView
一次。 -viewDidLoad
是一个完美的地方。
检查progressLineView
的值,并仅在当前为零时创建。
无论您选择哪种方式,假设progressLineView
是一个实例变量,您都可以完全按照-moveProgressLine
方法执行操作。也就是说,只需使用progressLineView
就像它已经存在一样,因为它确实存在。 BTW,一种移动视图的简单方法是修改它的center
属性:
CGPoint *c = progressLineView.center;
c.x += 25.0;
progressLineView.center = c;
另一个问题:怎样才能完全消除它(直到 调用drawPlayProgressLine方法再次创建它)
一种方法是在您不使用视图时隐藏视图。另一种方法是将其从超级视图中删除(如果保留它则释放它),然后将progressLineView
设置为nil。因此,如果progressLineView
是ivar,请执行以下操作:
[progressLineView removeFromSuperview];
[progressLineView release]; // if you're not using ARC and have retained it
progressLineView = nil;