保持UIScrollView的子视图不会调整大小?

时间:2012-10-19 19:31:54

标签: iphone ios cocoa uiscrollview

我有一个UIScrollView,其中viewForZoomingInScrollView返回了几个级别的视图子视图。在缩放期间,我希望其中一些子视图调整大小,而其他子视图则不调整大小。无论我尝试什么,所有子视图都会调整大小。在我想要不调整大小的子视图的超级视图中,我设置了autoResizesSubviews = NO,并且还尝试了contentMode = UIViewContentModeCenter。我还尝试将所有相关视图的autoresizingMask设置为UIViewAutoresizingNone。有什么想法吗?我无法重构子视图的层次结构。

4 个答案:

答案 0 :(得分:15)

UIScrollView的缩放视图的子视图是"调整大小"通过改变它们的变换,而不是改变它们的界限等。你的问题的一个简单的解决方案是捕捉在缩放视图上设置的变换,将其反转,并将其应用于子视图,取消滚动应用的缩放变换图。

viewForZoomingInScrollView返回的视图中,覆盖-setTransform:,并浏览相关的所有子视图并应用反转变换:

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

    CGAffineTransform invertedTransform = CGAffineTransformInvert(transform);
    for (UIView *view in subviewsNotToBeResized) 
    {
        [view setTransform:invertedTransform];
    }
}

答案 1 :(得分:0)

UIScrollView缩放是通过变换完成的,该变换将忽略您的内容模式和自动调整大小蒙版。一种可能的解决方案是将您不想调整大小的内容放入滚动视图的同级视图而不是子视图。另一种方法是尝试使用UIView动画实时反转变换(参见Andrew Madsen的回答)。

答案 2 :(得分:0)

Andrew Madsen出色答案的Swift 4.2版本:

/* maintains subview size during zoom */
class NonResizingView: UIView {
    override var transform: CGAffineTransform {
        get {return super.transform}
        set {
            super.transform = newValue
            for v in subviews {
                v.transform = self.transform.inverted()
            }
        }
    }
}

答案 3 :(得分:0)

这避免了必须继承UIView的子类,并且看起来同样有效。 containerViewviewForZoomingInScrollView返回的视图:

func scrollViewDidZoom(_ scrollView: UIScrollView) {
    containerView.subviews.forEach({
        if <test if this subview should be immune from resizing> {
            $0.transform = containerView.transform.inverted()
        }
    })
}