web-dev-qa-db-ja.com

iOS6の自動レイアウトを使用してScrollViewにImageViewを埋め込む

自動レイアウトの新しいiOS6SDKで非常にシンプルな要素を作成しようとしています。 ImageViewがあり、ScrollViewに埋め込みます。 (すべてがInterface Builderでビルドされます)。 .pngファイルが設定され、imageViewモードが「左上」に設定されます。

実装:

#import "ImaginariumViewController.h"

@interface ImaginariumViewController ()
@property (weak, nonatomic) IBOutlet UIScrollView *scrollView;
@property (weak, nonatomic) IBOutlet UIImageView *imageView;
@end

@implementation ImaginariumViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    self.scrollView.contentSize = self.imageView.image.size;
    self.imageView.frame =
    CGRectMake(0, 0, self.imageView.image.size.width, self.imageView.image.size.height);
}

@end

アプリを実行すると、画像がスクロールされません。自動レイアウトをオフにして(支柱とバネを使用して)すべて同じことを行い、スクロールを実行しています。問題は制約にあると思います。誰か助けてくれませんか?

20
Vitaly

更新していたチュートリアルで同じ問題が発生しました。プログラムで制約を削除し、罵倒し、壁に頭をぶつけようとしましたが、運が悪かったのです。

しかし、約5分前に、発生した別の問題を修正したものを試しました。 UIScrollViewが再び機能しています!解決策は、UIScrollView contentSizeプロパティを設定する古いコードを、viewDidLoadではなくviewDidAppearの実装に移動することでした。

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    self.theScroller.contentSize=CGSizeMake(200.0,2000.0);
}

これが、他の誰かが自動レイアウトで発生した頭痛の種に遭遇するのに役立つことを願っています。

52
John E. Ray

自動レイアウトは、最初は非常に混乱する可能性があります。実際には、スクロールビューのcontentSizeをどこにも設定したくありません。純粋な自動レイアウトアプローチでは、scrollviewは独自のコンテンツサイズを設定します。 iOS 6リリースノート の自動レイアウトとUIScrollViewのセクションを参照してください。

スクロールビューのサブビューの制約により、埋めるサイズが必要になります。これは、スクロールビューのコンテンツサイズとして解釈されます。 (これは、自動レイアウトに使用されるintelligentContentSizeメソッドと混同しないでください。)

これは、スクロールビューのサブビューの制約が明示的な幅と高さを設定する必要があり、スクロールビューの側面に基づいて変化する幅を使用しないことを意味することに注意してください。

ここでの2番目のエラーは、UIImageViewのフレームを画像のサイズに設定したことです。自動レイアウトでは、これも不要です。 UIImageViewには、実際には、基になる画像のサイズであるintrinsicContentSizeがあります。 (これを変更するには、幅と高さの制約を高い優先度で設定する必要があります)つまり、自動レイアウトを使用して画像をスクロールビューに配置し、スクロールさせるには、正しいコードは次のようになります。

** nothing at all!!! **

ただし、スクロールしないように見える画像が表示される可能性があることに注意する必要があります。ヒントは、前述のリリースノートにあります。

ビューと、スクロールビューのスーパービューなど、スクロールビューのサブツリーの外側にあるビューとの間に制約を作成することにより、スクロールビューのサブビューを他のスクロールコンテンツの上に浮かせて(スクロールせずに)表示させることができます。

つまり、Interface Builderで制約を設定し、画像ビューを階層内のスクロールビューの上のビューに制約すると、ビューがスクロールするように見える方法に影響します。マッド!

ハッピーコーディング...

27
jackslash