如何撤消和/或清除添加到 UIView 的 UIImageView?

Posted

技术标签:

【中文标题】如何撤消和/或清除添加到 UIView 的 UIImageView?【英文标题】:How do I undo and/or clear an added UIImageView to my UIView? 【发布时间】:2012-10-03 00:01:21 【问题描述】:

我有一个项目,我将选定的图像添加到 UIView。添加图像后,我可以移动、旋转和缩放该图像。但是假设我选择了错误的图像并且我想撤消。处理这样的事情的正确方法是什么?另外,假设我添加了多个但想从视图中清除所有这些,那么正确的方法是什么?

这是我目前正在尝试的:

-(IBAction)undoButtonTapped

    self.stampedImageView.image = nil;

这将成功撤消上一个操作,但仅此而已。假设我添加了两个或更多图像。也许我想撤消一项或多项操作,但不是全部。这只会撤消最近的操作。

例子:

User adds three stamps
To undo 2 stamps:  tap the undo button twice
To delete all stamps:  tap the delete button once

我已经知道如何一键删除所有图章。见下文。

删除代码:

UIView * subview;
while ((subview = [[imageView subviews] lastObject]) != nil)

    [subview removeFromSuperview];

【问题讨论】:

让我试着理解。首先,您打算如何撤消一个或多个操作?当用户点击 UNDO 按钮时,您是否会提示并询问他们希望撤消多少个 UNDO?另外,为什么不使用 removeFromSuperview 方法呢? 【参考方案1】:

您可以遍历视图的子视图,测试特定子视图是否为图像视图,然后根据需要调用 removeFromSuperview。子视图中的视图将与它们添加的顺序相同,因此要删除最后 n 项,您需要从末尾枚举图像视图数组。例如,此方法将删除最后添加的 3 个图像视图:

-(IBAction)deleteThree:(id)sender 
    NSIndexSet *indxs = [self.view.subviews indexesOfObjectsPassingTest:^BOOL(id obj, NSUInteger idx, BOOL *stop) 
        return [obj isKindOfClass:[UIImageView class]];
    ];

    __block int i = 0;
    [indxs enumerateIndexesWithOptions:NSEnumerationReverse usingBlock:^(NSUInteger idx, BOOL *stop) 
        [[self.view.subviews objectAtIndex:idx] removeFromSuperview];
        i++;
        if (i==3) 
            *stop = YES;
    ];

【讨论】:

以上是关于如何撤消和/或清除添加到 UIView 的 UIImageView?的主要内容,如果未能解决你的问题,请参考以下文章

如何管理添加到 UIView 中的子视图?

运行宏excel后清除“撤消”历史按钮

如何使用数组添加撤消列表?

如何撤消 HTML5 Canvas 绘图应用程序的橡皮擦操作

斯威夫特:清除 UIView

如何使 UIView 从纯色背景色淡化为清除背景色?