iOS iPhone能否克隆UIView并使其绘制到两个UIView上?

14

我在思考一种方法,让一个UIView能够在另一个UIView上进行渲染,同时也可以在第一个UIView上进行渲染。所以,我有一个主要的UIView和它的边界,这个UIView也在另一个UIView中进行渲染。

这是否可能?是否需要大量的层操作?


除了创建一个新实例,它本身能以其他方式呈现吗?毕竟它是一个对象。 - jmstone617
4个回答

15

不知道你的真实意图是什么,但这个方法会导致视图被绘制两次,用户交互等在第二个视图上将不起作用。此外,这种解决方案无法处理不同帧大小的情况。

要克隆的视图的标题

@interface SrcView : UIView
@property(nonatomic, readonly, strong) UIView *cloneView;
@end

@interface CloneView : UIView
@property(nonatomic, weak) UIView *srcView;
- (id)initWithView:(UIView *)src;
@end

你想要克隆的视图的实现

#import "SrcView.h"
#import "CloneView.h"

@implementation SrcView
@synthesize cloneView;

- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx{
    [cloneView setNeedsDisplay];
}

- (UIView *)cloneView {
    if (!cloneView) {
        cloneView = [[CloneView alloc] initWithView:self];
    }
    return cloneView;
}

@end

@implementation CloneView
@synthesize srcView;

- (id)initWithView:(UIView *)src {
    self = [super initWithFrame:src.frame];
    if (self) {
        srcView = src;
    }
    return self;
}

- (void)drawRect:(CGRect)rect
{
    [srcView.layer renderInContext:UIGraphicsGetCurrentContext()];
}

@end

现在你可以调用cloneView并将其添加到想要的位置。


5

在StackOverflow上似乎经常会有这样的问题,例如:

iphone, ipad Duplicate UIView - Cloned View

Copying the drawn contents of one UIView to another

UIView duplicate

Duplicate, clone or copy UIView

但如果我要做这件事,我的第一步是获取到我想要复制的UIView,然后递归地迭代所有它的 subviews,然后将它们作为子视图进行复制并添加到我想要复制主UIView的UIView中。

我不认为这里会涉及太多层操作,但你可能需要找出如何以编程方式重新建立输出和/或操作。


2
当您将它们添加为子视图时,实质上是将这些项目移动到另一个父视图下,而不是复制。 - Ege Akpinar

4

想要通过一行代码克隆视图并更新两个视图并不容易,因为它们的底层CALayer是不同的。但是,如果要复制一个UIView,可以使用以下新方法:使用UIView的方法:

- (UIView *)snapshotViewAfterScreenUpdates:(BOOL)afterUpdates

这是绘制视图的最快方法。在iOS 7中可用。


0
创建另一个你希望“克隆”的UIView实例,并将其添加为另一个视图的子视图。你并不真正克隆一个UIView对象,而只是创建它的另一个实例。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接