将所有子视图转换

5
我有一个UIView在一个scrollView中,它包含大约100个子视图。这些子视图看起来都一样,是同一个类的实例。我有一个变换,想要将其应用于每个子视图。但是变换需要随着缩放比例的改变而改变。
如何最好地应用变换到所有视图上?目前,我正在实现layoutSubviews,获取子视图数组,并将每个子视图的变换设置为新的变换。
有没有更优化的方法来做到这一点?
更新:
我想要变换的视图是地图上的标记(pins)。当我使用scrollView进行缩放时,它们需要缩小(即它们对用户看起来大小相同),并保持锁定在相同的位置。
- (void)layoutSubviews
{
    CGAffineTransform transform = CGAffineTransformMakeScale(1.0/self.zoomValue, 1.0/self.zoomValue);

    for(UIView *view in self.subviews){
        view.transform = transform;
    }    
}

...

- (void)scrollViewDidZoom:(UIScrollView *)scrollView
{
    self.mapMarkerContainer.zoomValue = scrollView.zoomScale;
    [self.mapMarkerContainer setNeedsLayout];
}

你当前的实现有什么问题吗? - Paul.s
每次调用scrollViewDidZoom时,我都会调用layoutSubviews。性能有点慢。 - GWed
你不是几个小时前刚问过这个问题吗?http://stackoverflow.com/questions/9150075/rendering-a-transform-once-for-multiple-views/9150385#9150385 - Nick Lockwood
1
这是一个不同的问题,如果你阅读。 - GWed
你能让我们看一下你用来应用变换的代码吗? - Paul.s
显示剩余5条评论
3个回答

6

既然你要对所有子视图应用相同的变换,那么CALayersublayerTransform属性似乎非常合适。

- (void)layoutSubviews
{
    CGAffineTransform transform = CGAffineTransformMakeScale(1.0/self.zoomValue, 1.0/self.zoomValue);

    self.layer.sublayerTransform = CATransform3DMakeAffineTransform(transform);
}

很酷,这绝对值得一试。你知道它的性能是否比我当前的实现更好吗? - GWed
尝试了一下,性能确实更好了,但它并没有完全做到以前的那样。以前每个视图都是围绕其中心点缩放的(这使它们相对于地图保持在同一位置),现在不再发生这种情况——它们相对于彼此保持在同一位置,这是错误的。有什么想法吗? - GWed
@Gaz_Edge 我认为 sublayerTransform 影响的是图层的边界而不是设置子图层的变换。那么,我猜我的建议对你来说行不通。抱歉造成困惑。 - Costique
好的,谢谢你的尝试。你有其他关于最佳实现方式的想法吗?我只是想为我的代码未来的性能做好准备。希望确保我以最有效率的方式进行操作。 - GWed

3

经过一些调查研究,发现我的初始方法是最有效的:

- (void)layoutSubviews
{
    CGAffineTransform transform = CGAffineTransformMakeScale(1.0/self.zoomValue, 1.0/self.zoomValue);

    for(UIView *view in self.subviews){
        view.transform = transform;
    }    
}

有时候我想你只能接受 iPhone 处理数据的速度有限这个事实。

0

您考虑过创建一个中间的子视图来容纳您的100个子视图吗? 您只需要设置中间子视图的变换,就完成了。


我确实考虑过这个问题。我需要保持子视图在父视图中的相同位置。我正在应用比例变换。 - GWed
我想要转换的视图是地图上的标记。当我放大时,我希望它们在屏幕上保持相同的大小,并且在地图上的相同点上。 - GWed
你尝试过从视图自动调整大小掩码中删除 UIViewAutoresizingFlexibleRightMarginUIViewAutoresizingFlexibleLeftMargin 吗? - sergio
试着想一下地图上的标记。当我放大时,我需要将它们缩小,并保持在同一位置。自动调整大小太基础了,不是吗? - GWed

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