我在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中看到该视图。有谁可以帮我解决这个错误?
答案 0 :(得分:4)
视图只能有一个超级视图。如果视图已经具有超视图并且该视图不是接收者,则此方法会在使接收器成为新的超级视图之前删除先前的超视图。
使用此代码
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一起使用。