我在数组中添加UIViews。在按钮上单击,我将它们添加到另一个视图。完美的工作。
问题是,当我在数组中添加一个以上的视图时。视图只设置一次。
这是我的代码。
-(IBAction)buttonClick:(id)sender {
UIView *view1 = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 80, 80)];
view1.backgroundColor = [UIColor redColor];
UIView *view2 = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 80, 80)];
[view2 setBackgroundColor:[UIColor orangeColor]];
UIView *view3 = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 80, 80)];
[view3 setBackgroundColor:[UIColor greenColor]];
UIView *view4 = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 80, 80)];
[view4 setBackgroundColor:[UIColor blueColor]];
NSArray *views = [NSArray arrayWithObjects:view2, view2, view1, view4, view3, nil];
[self setViews:views];
}
-(void) setViews:(NSArray*)views {
[testView1 addSubview: [views objectAtIndex:0]];
[testView2 addSubview: [views objectAtIndex:1]];
[testView3 addSubview: [views objectAtIndex:2]];
[testView4 addSubview: [views objectAtIndex:3]];
[testView5 addSubview: [views objectAtIndex:4]];
}
输出为
对于NSArray *views = [NSArray arrayWithObjects:view1, view2, view4, view4, view3, nil];
,输出为
对于NSArray *views = [NSArray arrayWithObjects:view1, view2, view3, view4, view4, nil];
,输出为
我说得更清楚了。对于[NSArray arrayWithObjects:view1, view1, view1, view1, view1, nil];
,testView1,2,3,4为空,view1
添加到testView5
。
无论添加多少次视图,如何才能带来完美的输出?
我想听听您的解释..!
答案 0 :(得分:4)
我认为问题是如果你将一个对象插入一个数组,因为它是同一个对象,它将绘制(当你调用addSubview
方法时)它的最新引用。它不是副本,它是同一个对象。
所以,如果你这样做:
UIView *a,*b,*c,*d;
NSArray *array = @[a,a,b,c,d];
你给他们一个不同的地方视图,你会看到绘制最新引用的A视图。您的setViews
方法会在第一个位置绘制'a',当您再次访问同一个视图时,它会将其从第一个位置删除,然后在第二个位置绘制。
因此,如果您想要解决它,请在再次绘制之前创建它们的副本。创建视图的新实例。
希望有所帮助!
答案 1 :(得分:3)
视图只能有一个超级视图。如果视图已经具有超视图并且该视图不是接收者,则此方法会在使接收器成为新的超级视图之前删除先前的超视图。
这意味着,多次调用addSubview
以添加相同的子视图只会在superview上添加一次(因为接收器将是相同的)。
解决方案:您必须将要重复的视图的多个副本作为子视图重复。
希望有所帮助!
答案 2 :(得分:2)
您可以通过addSubView
方法在子视图层次结构中仅添加一次视图。
而你正在这样做。所以重复视图只添加一次。
答案 3 :(得分:1)
只需为重复视图初始化具有相同帧的另一个对象。像:
UIView *view1 = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 80, 80)];
view1.backgroundColor = [UIColor redColor];
UIView *view2 = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 80, 80)];
[view2 setBackgroundColor:[UIColor orangeColor]];
UIView *view21 = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 80, 80)];
[view21 setBackgroundColor:[UIColor orangeColor]];
UIView *view3 = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 80, 80)];
[view3 setBackgroundColor:[UIColor greenColor]];
UIView *view4 = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 80, 80)];
[view4 setBackgroundColor:[UIColor blueColor]];
NSArray *views = [NSArray arrayWithObjects:view2, view21, view1, view4, view3, nil];
[self setViews:views];
答案 4 :(得分:1)
找到解决方案..!重复。
UIView *subview;
NSData *tempArchive = [NSKeyedArchiver archivedDataWithRootObject:[views objectAtIndex:0]];
subview = [NSKeyedUnarchiver unarchiveObjectWithData:tempArchive];
[testView1 addSubview: subview];
为每个视图执行此操作为我提供了解决方案..!
答案 5 :(得分:0)
您添加的视图多次出现在同一帧上,因为在将其添加为子视图时不会更改帧。因此,重复的视图共享相同的位置,因此彼此重叠。在将它们添加为子视图
之前,您需要以编程方式更改重复视图的帧