3

UIScrollViewによって返されるビューのサブビューのいくつかのレベルを持つ、がありますviewForZoomingInScrollView。ズーム中に、これらのサブビューの一部のサイズを変更し、他のサブビューのサイズを変更しないようにします。何を試しても、すべてのサブビューのサイズが変更されます。サイズを変更したくないサブビューのスーパービューで、autoResizesSubviews = NOを設定し、も試しcontentMode = UIViewContentModeCenterました。autoresizingMaskまた、関連するすべてのビューのをに設定してみましたUIViewAutoresizingNone。何かご意見は?サブビューの階層を再構築できません。

4

4 に答える 4

16

UIScrollViewのズームビューのサブビューは、境界などを変更するのではなく、変換を変更することで「サイズ変更」されます。質問に対する簡単な解決策の1つは、ズームビューに設定されている変換をキャッチし、それを反転してサブビューに適用することです、スクロール ビューによって適用されるズーム変換をキャンセルします。

によって返されたビューで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 に答える
0

UIScrollViewズームは変換で行われ、コンテンツ モードと自動サイズ変更マスクは無視されます。考えられる解決策の 1 つは、サイズを変更したくないコンテンツを、サブ ビューではなく、スクロール ビューの兄弟ビューに配置することです。もう 1 つは、アニメーションを使用してリアルタイムで変換を反転しようとすることです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 に答える