向Scroll View添加视图

时间:2012-11-20 10:43:55

标签: objective-c ios uiscrollview ios4

我在My Viewcontroller中有一个滚动视图。我还创建了一个视图并将其连接到IBOutlet变量。我需要在Scroll视图中添加许多视图。

向ScrollView添加视图的代码:

在.h文件中

UIView *customView_;

@property (nonatomic, retain) IBOutlet UIView *customView;

在.m文件中:

@synthesize customView = customView_;

    for (int i = 0; i < 2; i++) {

        UIView *tempView = customView;
        tempView.frame = CGRectMake(i * 187, 0, 187, 133);
        [scrollView addSubview:tempView];
    }

但是使用上面的代码,我只能看到一个位置:187,0,187,133。如果我将代码更改为(int i = 0; i < 3; i++) {,我只能在374,0,187,133中看到该视图。有谁可以帮我解决这个错误?

1 个答案:

答案 0 :(得分:4)

为什么会这样?

Documentation for addSubview:

  

视图只能有一个超级视图。如果视图已经具有超视图并且该视图不是接收者,则此方法会在使接收器成为新的超级视图之前删除先前的超视图。

使用此代码

UIView *tempView = customView;
tempView.frame = CGRectMake(i * 187, 0, 187, 133);
[scrollView addSubview:tempView];

您尝试将相同视图添加两次/三次。使用文档中的注释,这将删除前一个,并将其添加到新位置。 (虽然superview是您的情况下的接收器,但它仍然不意味着它会复制您的视图并再次添加它。)

解决方案

不幸的是,UIView不符合NSCopying协议。因此,您无法使用copy创建它的直接副本。您需要创建一个工厂方法,为您创建视图,如下所示:

-(UIView)createCustomView {
    ...
}

然后在for循环中调用它:

UIView *tempView = [self createCustomView];
tempView.frame = CGRectMake(i * 187, 0, 187, 133);
[scrollView addSubview:tempView];

这可能会超出.xib文件的范围。请参阅this answer,了解如何使其与Interface Builder一起使用。