13

大家好,

我是一个菜鸟,几天来我一直在努力解决这个问题。

我正在通过 UItouch 将图像添加到视图中。该视图包含一个背景,在该背景上添加了新图像。如何清除从子视图中添加的图像,而不删除作为背景的 UIImage。非常感谢任何帮助。提前致谢。

这是代码:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *) event { 
NSUInteger numTaps = [[touches anyObject] tapCount];

if (numTaps==2) {
    imageCounter.text =@"two taps registered";      

//__ remove images  
    UIView* subview;
    while ((subview = [[self.view subviews] lastObject]) != nil)
        [subview removeFromSuperview];

    return;

}else {

    UITouch *touch = [touches anyObject];
    CGPoint touchPoint = [touch locationInView:self.view];
    CGRect myImageRect = CGRectMake((touchPoint.x -40), (touchPoint.y -45), 80.0f, 90.0f); 
    UIImageView *myImage = [[UIImageView alloc] initWithFrame:myImageRect];

    [myImage setImage:[UIImage imageNamed:@"pg6_dog_button.png"]];
     myImage.opaque = YES; // explicitly opaque for performance


    [self.view addSubview:myImage];
    [myImage release];

    [imagesArray addObject:myImage];

    NSNumber *arrayCount =[self.view.subviews count];
    viewArrayCount.text =[NSString stringWithFormat:@"%d",arrayCount];
    imageCount=imageCount++;
    imageCounter.text =[NSString stringWithFormat:@"%d",imageCount];

}

}

4

2 回答 2

29

您需要一种将添加的UIImageView对象与背景区分开来的方法UIImageView。我可以想到两种方法来做到这一点。

方法 1:为添加的对象分配UIImageView一个特殊的标签值

每个UIView对象都有一个tag属性,它只是一个整数值,可用于标识该视图。您可以将每个添加的视图的标记值设置为 7,如下所示:

myImage.tag = 7;

然后,要删除添加的视图,您可以单步执行所有子视图,只删除标签值为 7 的子视图:

for (UIView *subview in [self.view subviews]) {
    if (subview.tag == 7) {
        [subview removeFromSuperview];
    }
}

方法2:记住背景视图

另一种方法是保留对背景视图的引用,以便您可以将其与添加的视图区分开来。IBOutlet为背景制作一个UIImageView并在 Interface Builder 中以通常的方式分配它。然后,在删除子视图之前,请确保它不是背景视图。

for (UIView *subview in [self.view subviews]) {
    if (subview != self.backgroundImageView) {
        [subview removeFromSuperview];
    }
}
于 2010-11-09T18:04:23.197 回答
0

仅在一个功能代码行中为方法 #1 提供更快速的代码:

self.view.subviews.filter({$0.tag == 7}).forEach({$0.removeFromSuperview()})
于 2016-10-03T13:58:13.430 回答