32

自動レイアウトを使用してUIScrollView新しい方法を実装しようとしています。内側のビューからスクロールビューに制約を設定して、contentSize自動的に計算できるようにしました。これは魅力のように機能します。ただし、ズームインまたはズームアウトしようとすると、すべての地獄が解き放たれます。内面が「めちゃくちゃ」になっていると言う以外に、何が起こっているのかを正しく説明することすらできません。

この動作の例をここで見ることができます(私のプロジェクトではありません。ズームが機能する前に、スクロールビューを設定してmaximumZoomScale実装する必要があります)。-viewForZoomingInScrollView:

他の誰かがこの振る舞いに遭遇しましたか?UIScrollView現在、ズーム動作を自分で本質的に再実装せずに、自動レイアウトで動作するようにズームインする方法はありますか?

4

3 に答える 3

4

私が見た最良の答えは、ここに投稿されたマーク ( https://stackoverflow.com/users/1051919/mark-kryzhanouski ) です: UIScrollView Zoom Does Not Work With Autolayout

要点は、スクロール ビューにネストされたイメージ ビューをスクロール ビューの親に固定する必要があることです。iOS 6 リリース ノートのガイダンスにもかかわらず、どのビューが何の上に「浮かんでいる」かは直感的ではありません。この場合、スクロール ビューは 1 つのイメージ ビューにすぎません。

すべての IB アプローチを見つけることを期待して、これについて多くの実験を行いましたが、何も見つかりませんでした。IB でビュー階層を生成することはできますが、プログラムで制約を追加する必要があります。デフォルトの制約の一部またはすべてを削除できますが (主に、制約競合の警告を緩和するためだけに)、画像ビューをスクロール ビューの親、画像ビューの祖父母に結び付けるには常に Mark のコードが必要です。

これよりも単純なはずです-「うまくいくはずです」が、:

NSDictionary *viewsDictionary = @{ @"scrollView": self.scrollView, @"imageView": self.imageView };
[self.view addConstraints:[NSLayoutConstraint
    constraintsWithVisualFormat:@"H:|[imageView(width)]"
    options:0
    metrics:@{@"width": @(self.imageView.image.size.width)}
    views:viewsDictionary]];

[self.view addConstraints:[NSLayoutConstraint
    constraintsWithVisualFormat:@"V:|[imageView(height)]"
    options:0
    metrics:@{@"height": @(self.imageView.image.size.height)}
    views:viewsDictionary]];
于 2013-04-23T00:55:24.023 に答える
3

ストーリーボードに imageView を追加しなくても、次のことが完全に機能することがわかりました。

-(UIImageView *)imageView
{
    if (!_imageView) _imageView = [[UIImageView alloc] initWithFrame:CGRectZero];
    return _imageView;
}
- (void)viewDidLoad
{
    [super viewDidLoad];
    [self.scrollView addSubview:self.imageView];
    // Set the min and max:
    self.scrollView.minimumZoomScale = 0.2;
    self.scrollView.maximumZoomScale = 5.0;
    self.scrollView.delegate = self;

    // Set the content:
    self.scrollView.zoomScale = 1.0; // reset zoomScale for new image
    self.scrollView.contentSize = CGSizeMake(image.size.width/2, image.size.height/2);
    self.imageView.frame = CGRectMake(0, 0, image.size.width/2, image.size.height/2);
    self.imageView.image = image;
}

-(UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView
{
    return self.imageView;
}
于 2013-03-21T20:12:10.603 に答える