UIView创作和定位

时间:2012-08-20 19:54:06

标签: objective-c ios uiview

我在我的控制器中有两个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方法再次创建它)

3 个答案:

答案 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;