如何删除在 UIViewController 上某个特定点绘制的 UIImageView?

Posted

技术标签:

【中文标题】如何删除在 UIViewController 上某个特定点绘制的 UIImageView?【英文标题】:How do I remove a UIImageView drawn at some specific point on my UIViewController? 【发布时间】:2012-08-23 12:21:41 【问题描述】:

每次我想在视图控制器窗口上的某个特定 x-y 坐标处绘制图像(在本例中为“goodCell.png”..)时,我都会调用以下方法,包括适当的参数:

-(void)paintGoodCellatX:(int)xAxis andY:(int)yAxis onViewController:(UIViewController*)playingViewController

    int x = 32*(xAxis - 1);
    int y = 384 - (32* yAxis);

    UIImage* myImage = [UIImage imageNamed:@"goodCell.png"];
    UIImageView* myImageView = [[UIImageView alloc] initWithImage:myImage];
    myImageView.frame = CGRectMake(x,y, 32, 32);
    [playingViewController.view addSubview:myImageView];


如果稍后在我的代码中我想删除以上在某个特定 x 和 y 坐标处绘制的图像之一,我该怎么做?

鉴于此代码,我对绘制的 ImageView 没有任何保留(因此我不能使用 [myImageView removeFromSuperView]; 之类的东西,因为名称 myImageView 没有定义任何内容),除了它的坐标。那么有没有办法在 View Controller 窗口上的特定 x-y 坐标处删除/删除 UIImageView 或其他解决此问题的方法?

谢谢

【问题讨论】:

你想在 UIImage 上画一些东西。所以为了撤销,你检查过 NSUndoManager developer.apple.com/library/mac/#documentation/Cocoa/Reference/… 【参考方案1】:

在您的视图中添加一个标签,为您提供一个有意义的标识符。使用 myImageView.tag = XXX;

然后使用 [playingViewController viewWithTag:XXX] 获取要移除的视图的 UIImageView 句柄。

标签是一个整数,它可以是存储这些 X/Y 位置的 NSArray 的偏移量,或者是存储这些值的 NSDictionary 的键?

【讨论】:

因此,即使myImageView 对象会不断变化并在 ViewController 的窗口上定义一些新位置(每次调用该方法),myImageView.tag = ... 仍将“指向”同一个位置,如果我将它添加到此方法之外存在的数组中,对吗? 标签只是一个数字标识符。它在您的视图中必须是唯一的。它“附加”到视图上。然后,您可以通过 viewWithTag 通过此标记值从层次结构中检索视图。所以你需要一个 NSDictionary 或其他一些模型对象来允许你将你的 X/Y 坐标映射到这个标签 #. 不,使用“标签”,您可以跟踪对象,而不是屏幕上的位置。因此,如果您在位置 A 定义一个带有标签 1 的视图并将其移动到位置 B,然后在同一位置 A 上添加另一个带有标签 2 的视图并删除带有标签 1 的视图,则位置 B 的视图将被删除。 @lukaswelte 关于将 X/Y 坐标编码为 XXXYYY 的想法是一个新颖的想法,相同的概念但不需要 NSDictionary... (旁注)CSmith,你在我写我的时候发表了你的评论,显然我评论开头的“不”不适合你:)【参考方案2】:

您可以给每个视图一个由点计算的标签,例如 3 位 x 比 3 位 y 轴作为标签

对于 x=312 y=567 会是

myImageView.tag = 312567;

有了这个,你总是可以识别视图

另一种更好的可能性是将所有添加的内容存储在 NSArray 中。 如果要删除一个特定视图,则必须遍历数组并检查该点是否在视图的边界内 所以或多或少:

为了创造;

NSMutableArray *imageViewArray = [[NSMutableArray alloc] init];
-(void)paintGoodCellatX:(int)xAxis andY:(int)yAxis onViewController:(UIViewController*)playingViewController

    int x = 32*(xAxis - 1);
    int y = 384 - (32* yAxis);

    UIImage* myImage = [UIImage imageNamed:@"goodCell.png"];
    UIImageView* myImageView = [[UIImageView alloc] initWithImage:myImage];
    myImageView.frame = CGRectMake(x,y, 32, 32);
    [playingViewController.view addSubview:myImageView];
    [imageViewArray add:myImageView];

删除:

for(UIImageView *mv in imageViewArray) 
 if(CGRectContainsPoint(mv.bounds, yourCGPoint)) 
  [mv removeFromSuperview];

【讨论】:

是的,因为 CSmith 已经建议使用标签并将这些值存储在全局范围的 NSArray 中是我猜的最佳方式。感谢你们俩。如果我能接受 2 个答案就好了! :) 如果你像我建议的那样制定标签“命名约定”,你不需要在数组中存储任何东西......数组是不需要标签的第二种解决方案,也可以删除多个视图包含此点的 我认为 Luka P. 正在寻找的是一种在某个位置删除视图的方法,因此如果使用您的标签(如 111222 和 333444)创建 2 个视图,然后将它们反转,请查看标签 111222 将位于 (333, 444) 位置,因此如果您想通过删除带有标签 333444 的视图来删除此视图,您将删除错误的视图! (哇,这很难解释,哈哈) 这就是为什么我提出了第二种解决方案,将图像视图存储在一个数组中,然后真正检查图像视图的实际位置是否包括他想要删除图像视图的点。解决方案他可以随心所欲地移动和转换视图,而无需考虑标签是否需要更改 好的,我现在有点迷失了,但是一旦我准备好了,我会发布我最终选择/理解的解决方案。顺便说一句,我不会移动视图。如果有任何意义或不同,只需在特定点删除和创建视图。无论如何,我会在它准备好时发布:)

以上是关于如何删除在 UIViewController 上某个特定点绘制的 UIImageView?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 UIviewController 子类中禁用 UIMenuControll(剪切、复制、粘贴、全选、删除)?

执行 segue 后如何删除 UIViewController?

如何在tecplot中获取曲线上某一点的数值

如何修改Windows上某块网卡的MTU的值

如何查看电脑上某程序的源代码 如计算器

从 UIViewController 中的 UITableView 中删除核心数据