3

ストーリーボードにいくつかのスクロールビューを作成しましたUIImageView

問題は、そのスクロールビューのフレームが等しいことであり、その{0, 0, 0, 0}理由はわかりません。スクロールビューは画面に表示されますが、スクロールできません。

すでにコンテンツサイズとフレームを設定しようとしていますが、うまくいきません。

4

6 に答える 6

8

修正しました!

実際、私はiOS 6.0でアプリを開発しており、ストーリーボードのプロパティで[自動レイアウトを使用する]チェックボックスをオフにする必要がありました...

とにかくありがとう!

于 2012-10-21T00:51:22.910 に答える
4

私もこの問題を抱えていましたが、自動レイアウトを使用する必要があります。

UIImageViewをサブビューとして設定してから、いくつかの計算を行って最小、最大のズームスケールを計算し、zoomScaleを設定しようとしました。

問題は、スクロールビューフレームがゼロであるため、zoomScaleをゼロに設定しようとしていたため、次のエラーが発生していました。

<Error>: CGAffineTransformInvert: singular matrix.

そこで、viewDidLoad / viewWillAppearで画像とimageViewを設定し(そしてimageViewを非表示にし)、次にviewDidAppearでzoomScaleを設定します(次にimageViewを再表示します)。

理由は定かではありませんが、これはうまくいくようです。スクロールビューに境界を正しく設定する機会が与えられると思います。

于 2013-02-11T02:33:50.123 に答える
4

他の回答のいくつかが示しているように、ここでの問題は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...
    }
}
于 2013-08-20T16:30:44.133 に答える
3

この回答で述べたように、スクロールビューのフレームは、メソッドに入るまで初期化されませんviewWillAppear

これはiOS6の新しい動作のようで、バグなのか意図的な変更なのかはわかりません。

これを気にせずに自動レイアウトを使用できるはずです。

于 2013-02-25T03:28:24.970 に答える
0

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に追加するにはどうすればよいですか?

于 2012-10-20T23:06:46.320 に答える
0

以下のエンリコのコメントに対して、1つの明確化が行われていると思います。フレームサイズは、viewDidAppearで正しい値になります(viewWillAppearでは値が設定されますが、そのメソッドではまだゼロです)

于 2013-04-23T16:14:25.157 に答える