3

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

4

4 回答 4

16

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

在返回的视图中viewForZoomingInScrollView,覆盖 -setTransform:,并遍历所有有问题的子视图并应用逆变换:

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

    CGAffineTransform invertedTransform = CGAffineTransformInvert(transform);
    for (UIView *view in subviewsNotToBeResized) 
    {
        [view setTransform:invertedTransform];
    }
}
于 2012-10-19T19:47:42.883 回答
1

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

/* 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()
            }
        }
    }
}
于 2018-12-05T07:37:59.213 回答
0

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

于 2012-10-19T19:53:36.567 回答
0

这避免了子类化UIView,并且似乎也可以正常工作。containerView是返回的视图viewForZoomingInScrollView

func scrollViewDidZoom(_ scrollView: UIScrollView) {
    containerView.subviews.forEach({
        if <test if this subview should be immune from resizing> {
            $0.transform = containerView.transform.inverted()
        }
    })
}
于 2019-09-27T15:16:33.630 回答