ストーリーボードにいくつかのスクロールビューを作成しましたUIImageView
。
問題は、そのスクロールビューのフレームが等しいことであり、その{0, 0, 0, 0}
理由はわかりません。スクロールビューは画面に表示されますが、スクロールできません。
すでにコンテンツサイズとフレームを設定しようとしていますが、うまくいきません。
ストーリーボードにいくつかのスクロールビューを作成しましたUIImageView
。
問題は、そのスクロールビューのフレームが等しいことであり、その{0, 0, 0, 0}
理由はわかりません。スクロールビューは画面に表示されますが、スクロールできません。
すでにコンテンツサイズとフレームを設定しようとしていますが、うまくいきません。
修正しました!
実際、私はiOS 6.0でアプリを開発しており、ストーリーボードのプロパティで[自動レイアウトを使用する]チェックボックスをオフにする必要がありました...
とにかくありがとう!
私もこの問題を抱えていましたが、自動レイアウトを使用する必要があります。
UIImageViewをサブビューとして設定してから、いくつかの計算を行って最小、最大のズームスケールを計算し、zoomScaleを設定しようとしました。
問題は、スクロールビューフレームがゼロであるため、zoomScaleをゼロに設定しようとしていたため、次のエラーが発生していました。
<Error>: CGAffineTransformInvert: singular matrix.
そこで、viewDidLoad / viewWillAppearで画像とimageViewを設定し(そしてimageViewを非表示にし)、次にviewDidAppearでzoomScaleを設定します(次にimageViewを再表示します)。
理由は定かではありませんが、これはうまくいくようです。スクロールビューに境界を正しく設定する機会が与えられると思います。
他の回答のいくつかが示しているように、ここでの問題はAutoLayoutです。具体的には、問題は、自動レイアウトがviewWillAppearの後まで発生しないことです。コードをviewDidAppearに配置すると、ユーザーが見ている間に画面上のものを変更すると、ファンキーな表示アーティファクトが発生します...
AutoLayoutを有効にする必要がある場合、フレームに依存するコードを配置するのに最適な場所は次のとおりです。
- (void)viewDidLayoutSubviews
ただし、これは何度も呼び出されることに注意してください。したがって、初期化コードを1回だけ実行する場合は、ビューが表示されたときに、初期レイアウトがすでに完了しているかどうかを格納するBOOLプロパティを作成できます。
@property (assign, nonatomic) BOOL initialLayoutComplete;
次に、viewDidLayoutSubviewsを次のように記述できます。
- (void)viewDidLayoutSubviews {
[super viewDidLayoutSubviews];
if (!self.initialLayoutComplete) {
// frame dependent code here...
}
}
この回答で述べたように、スクロールビューのフレームは、メソッドに入るまで初期化されませんviewWillAppear
。
これはiOS6の新しい動作のようで、バグなのか意図的な変更なのかはわかりません。
これを気にせずに自動レイアウトを使用できるはずです。
IBOutletに接続しましたか?
このコードでscrollViewを初期化しましたか?
self.scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, 280, 360)];
self.scrollView.contentSize = CGSizeMake(500, 360);
//values are of course only example values
UIImageViewをscrollViewに追加するにはどうすればよいですか?
以下のエンリコのコメントに対して、1つの明確化が行われていると思います。フレームサイズは、viewDidAppearで正しい値になります(viewWillAppearでは値が設定されますが、そのメソッドではまだゼロです)