1

我在数组中添加 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.

无论添加多少次视图,如何才能带来完美的输出?

我想听听你的解释..!

4

6 回答 6

3

来自苹果文档

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

这意味着,addSubview多次调用以添加相同的子视图只会在父视图上添加一次(因为接收者将是相同的)。

解决方案:您必须制作要作为子视图重复的视图的多个副本。

希望有帮助!

于 2013-10-04T07:18:28.743 回答
3

我认为问题在于,如果您将两次对象插入到数组中,因为它是同一个对象,它将绘制(当您调用addSubview方法时)它的最新引用。它不是一个副本,它是同一个对象。

所以,如果你这样做:

UIView *a,*b,*c,*d;

NSArray *array = @[a,a,b,c,d];

而你给他们一个不同的地方视图,你会看到绘制了最新的引用 A 视图。您的setViews方法将在第一个位置绘制“a”,当您再次访问同一视图时,它将从第一个位置删除它并在第二个位置绘制它。

因此,如果您想解决它,请在再次绘制之前创建它们的副本。创建视图的新实例。

希望对您有所帮助!

于 2013-10-04T07:41:10.907 回答
2

addSubView您只能通过方法在子视图层次结构中添加一次视图。而你正在这样做。所以重复视图只添加一次。

于 2013-10-04T07:13:08.410 回答
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];
于 2013-10-04T07:18:29.867 回答
0

您添加的视图不止一次出现在同一个框架上,因为在将它们添加为子视图时您没有更改框架。因此,重复的视图共享相同的位置,因此彼此重叠。在将它们添加为子视图之前,您需要以编程方式更改重复视图的框架

于 2013-10-04T07:19:55.350 回答
0

找到了解决方案..!采取重复。

UIView *subview;
NSData *tempArchive = [NSKeyedArchiver archivedDataWithRootObject:[views objectAtIndex:0]];
subview = [NSKeyedUnarchiver unarchiveObjectWithData:tempArchive];
[testView1 addSubview: subview];

为每个视图这样做给了我解决方案..!

于 2013-10-04T09:09:56.830 回答