UIScrollView
単一のサブビューを持つ を考えてみましょう。サブビューはUIImageView
、次のサイズ制限があります。
- その高さは の高さと等しくなければなりません
UIScrollView
。 - その幅は、 の高さに比例してスケーリングされたイメージの幅でなければなりません
UIImageView
。
UIImageView
の幅は UIScrollView の幅よりも大きいことが予想されるため、スクロールが必要になります。
イメージは、viewDidLoad
(キャッシュされている場合) 実行中または非同期に設定される可能性があります。
自動レイアウトを使用して上記をどのように実装し、Interface builder を最大限に活用しますか?
これまでに行ったこと
この回答に基づいて、ペン先を次のように構成しました。
- はその
UIScrollView
スーパービューの端に固定されています。 - はの
UIImageView
端に固定されていますUIScrollView
。 - には
UIImageView
プレースホルダー固有のサイズがあります (スクロール可能なコンテンツのサイズのあいまいさエラーを回避するため)
予想どおり、結果はUIImageView
のサイズに合わせられ、 は水平方向および垂直方向UIImage
にUIScrollView
スクロールします (画像が よりも大きいためUIScrollView
)。
それから私はうまくいかなかったさまざまなことを試しました:
- 画像を読み込んだ後、 のフレームを手動で設定し
UIImageView
ます。 - UIImageView の幅に制約を追加し、画像が読み込まれた後にその値を変更します。これにより、画像がさらに大きくなります(?!)。
zoomScale
イメージのロード後に設定します。目に見える効果はありません。
自動レイアウトなし
次のコードは、自動レイアウトやインターフェイス ビルダーがなくても、私が望むとおりに動作します。
- (void)viewDidLoad
{
{
UIScrollView *scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];
scrollView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
[self.view addSubview:scrollView];
self.scrollView = scrollView;
}
{
UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, self.scrollView.frame.size.width, self.scrollView.frame.size.height)];
imageView.contentMode = UIViewContentModeScaleAspectFit;
imageView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
[self.scrollView addSubview:imageView];
self.scrollView.contentSize = imageView.frame.size;
self.imageView = imageView;
}
}
- (void)viewDidLayoutSubviews
{
[super viewDidLayoutSubviews];
[self layoutStripImageView];
}
- (void)layoutStripImageView
{ // Also called when the image finishes loading
UIImage *image = self.imageView.image;
if (! image) return;
const CGSize imageSize = image.size;
const CGFloat vh = self.scrollView.frame.size.height;
const CGFloat scale = vh / imageSize.height;
const CGFloat vw = imageSize.width * scale;
CGSize imageViewSize = CGSizeMake(vw, vh);
self.imageView.frame = CGRectMake(0, 0, imageViewSize.width, imageViewSize.height);
self.scrollView.contentSize = imageViewSize;
}
autolayout に移行するために一生懸命努力していますが、簡単ではありません。