UIViews和CALayers的同步层次结构

时间:2014-06-16 11:03:38

标签: ios uiview calayer uiview-hierarchy

我有以下层次结构: 视图     scrollview(启用滚动和缩放)         containerview             imageview(带地图)     按钮的视图     导航面板的视图

在图片视图中,我必须提出一些兴趣点(取决于用户选择的类别): 问题是:     如果我将它们附加到容器视图,他们获得正确的位置是非常容易的,         但是在缩放时,它们会随图像一起变焦,并且应该保持相同的尺寸(1)     如果我将它们附加到滚动视图我什么都没看到..     如果我将它们附加到主视图,我有两个问题:         1在滚动视图和按钮等视图之间找到它们的层次结构位置(它们位于应用程序的顶部,应该只是在地图上但在控制面板,按钮等下方         2使用convertPoint:toView与缩放和滚动完成协调     如果我添加一个视图(滚动视图下的容器视图的兄弟),它们显示正常,但我没有用户输入(他们没有收到  触摸)     如果我将兄弟子视图转换为CALayer,我不会显示子图层(POI)。

(1)我试图通过应用CGAffineTransform使用容器视图并覆盖setTransform,reverseTransform = CGAffineTransformInvert(transform);但是我在向它传递一个带有视图引用的数组时遇到了问题

在这种情况下,您会建议做什么? 非常感谢你!

S上。

1 个答案:

答案 0 :(得分:0)

我最后将子视图添加到containerView,我已经将其子类化了:

- (void)setTransform:(CGAffineTransform)transform
{
    [super setTransform:transform];

    CGAffineTransform invertedTransform = CGAffineTransformInvert(transform);
    for (UIView *view in self.subviews)
    {
        if ([view isKindOfClass:[MarkerClass class]]) {
            [view setTransform:invertedTransform];
        }
    }
}

唯一的问题是,在缩放containerView之前,屏幕上会出现一个短版本的标记。

经过一段时间后,我发现我也会覆盖addSubview,以这种方式进行初始转换:

-(void)addSubview:(UIView *)view {
    [super addSubview:view];
    if ([view isKindOfClass:[MarkerClass class]]) {
     CGAffineTransform invertedTransform = CGAffineTransformInvert(self.transform);
        [view setTransform:invertedTransform];
    }
}