将视图添加到滚动视图

Vaq*_*ita 2 objective-c uiscrollview ios4 ios

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

用于将视图添加到ScrollView的代码:

在.h文件中

UIView *customView_;

@property (nonatomic, retain) IBOutlet UIView *customView;
Run Code Online (Sandbox Code Playgroud)

在.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];
    }
Run Code Online (Sandbox Code Playgroud)

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

WDU*_*DUK 5

为什么会这样呢?

有关的文件 addSubview:

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

有了这个代码

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

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

不幸的是,UIView没有遵循该NSCopying协议。因此,您无法使用创建直接副本copy。您将需要创建一个工厂方法来为您创建视图,如下所示:

-(UIView)createCustomView {
    ...
}
Run Code Online (Sandbox Code Playgroud)

然后在for循环中调用它:

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

这可能超出了您的.xib文件范围。有关如何使它与Interface Builder配合使用的信息,请参考此答案