web-dev-qa-db-ja.com

UIScrollViewは期待どおりに動作しますが、scrollRectToVisible:何もしません

以前UIScrollViewを使用したことがありますが、現在使用していますが、問題はありませんでした。今、古いアプリに追加していますが、期待通りに動作します(コンテンツを見て、指でスクロールできます、すべての境界とサイズが正しく設定されているので、コンテンツに空のスペースがないなど) 。)、scrollToRectVisibleが動作しません。呼び出しを単純化して、単に0,0の位置に移動するようにしました。

 [scrollView scrollRectToVisible:CGRectMake(0, 0, 10, 10) animated:YES];

または、0,200に移動します。

 [scrollView scrollRectToVisible:CGRectMake(0, 200, 10, 10) animated:YES];

これをテストするための簡単なアプリも作成し、scrollRectToVisibleを期待どおりに動作させることができました。しかし、私の古いアプリでは、何もさせることができません。

ScrollViewをsetContentOffset:でスクロールさせることができますが、それは私が望むものではありません。

このscrollViewとそのコンテンツは、IBによってペン先で定義され、IBOutletで使用されます。 scrollViewを処理するためにアプリで使用しているコードは

 [scrollView setContentSize:CGSizeMake(scrollView.contentSize.width, imageView.frame.size.height)];

(私は水平スクロールではなく垂直スクロールにのみ興味があります)。

誰かがこのような問題に遭遇しましたか?

両方のアプリのscrollView属性を比較しましたが、それらは同じです。

補遺:

私のscrollViewsフレームは:0.000000 0.000000 480.000000 179.000000

私のscrollViews contentSizeは:0.000000 324.000000

スクロールしたい四角形が既に表示されているように動作し、スクロールは不要です。それが何が起こっているのかわからない。これはただの大胆なことです。このような簡単な解決策のように思えます...

補遺#2:

これは私がscrollRectToVisibleなしでやっている方法です:

CGPoint point = myRect.Origin;
if (![clefScrollView pointInside:point withEvent:nil]) {
    point.x = 0;
    if (point.y > clefScrollView.contentSize.height - clefScrollView.bounds.size.height)
        point.y = clefScrollView.contentSize.height - clefScrollView.bounds.size.height;
    [clefScrollView setContentOffset:point animated: YES];
}

このscrollViewに関する他のすべては期待どおりに機能しますが、scrollRectToVisibleです。なぜ?!?ワイルドな推測?

61
mahboudz

1か月以上経って、ようやくわかりました。上記の代替案はうまく機能しましたが、それは私を悩ませており、私は最終的にそれを把握しなければなりませんでした。それはやや愚かな間違いだったことが判明した。

以下は、viewDidLoadの古いコードです。scrollViewをセットアップします。

[clefScrollView setContentSize:CGSizeMake(clefScrollView.contentSize.width, clefView.frame.size.height)];

ScrollViewの高さまたは幅の値は0にできません! ScrollViewのサイズは有効なサイズで始まると仮定していましたが、1つの次元がゼロであるという事実を見逃していたため、これは私を通り過ぎたと思います!

これは動作します:

[clefScrollView setContentSize:CGSizeMake(clefView.frame.size.width, clefView.frame.size.height)];

これが誰かに役立つことを願っています。私は間違いなくこれをデバッグしようとしてあまりにも多くの時間を費やしました。

112
mahboudz

ええ、私はscrollRectToVisible:animated:で成功していませんが、setContentOffset:animated:は常に私のために機能します。好奇心から、なぜsetContentOffset:animated:を使いたくないのですか?それは適切な解決策のようです。

47

ScrollViewのdelaysContentTouchesプロパティがNOに設定されていることを確認してください。

ScrollViewのサブビュー内のタッチからメソッドscrollRectToVisibleまたはsetContentOffsetを呼び出すと、タッチを遅らせることでscrollViewが停止する可能性があります。

したがって、scrollViewで以下を設定してください。

scrollView.delaysContentTouches = NO;

ほとんどの場合、YESに設定されたアニメーションの有無に関係なくscrollViewを移動できます。

5
Michael Colon

私はこのようにしていたがうまくいかなかった

scrollView.contentSize = CGSizeMake(scrollView.contentSize.width, someKnownValue);

私はcontentSizeの高さを変更するだけでしたので、それで問題が生じるとは思いませんでしたが...

これに変更する必要がありました

scrollView.contentSize = CGSizeMake(someOtherKnownValue, someKnownValue);

scrollView.contentSize.widthは、get goからの有効な値に必ずしも設定されないため、特定の値を指定することをお勧めします

1
Rugoso

私にとって問題は、サブビューの制約が明示的ではないことでした。レイアウトのために明らかに必要ではない場合でも、コンテンツのすべての制約が設定されていることを確認してください。

0
vauxhall

ゲームに少し遅れましたが、私は同じ問題を抱えていました。スクロールビューのコンテンツサイズは絶対に正しく設定されていましたが、高さの値については過度に設定されていました。フレームとコンテンツサイズを検証するための広範なチェックの後でも、まだ機能していませんでした。 「境界」フレームの高さを調整しなければならなかったので、すべてがうまくいきました。

0
user1086279

この問題と同じ症状がありました。scrollRectToVisibleが意図したとおりに機能しませんでした。私の問題は、ストーリーボードのスクロールビューにあいまいな制約の問題があったことです。それが修正されると、呼び出しは正常に機能しました。 scrollRectToVisible呼び出しが意図したとおりに機能しない場合は、確認する必要があります。

0
Swifty

「clefScrollView」のフレームを設定していない場合、上記の解決方法でもエラーが発生する可能性があります。

上記のソリューションを使用しても同じ問題が発生する場合は、コンテンツビューを設定する前にscollView(この場合はclefScrollView)フレームを初期化してください。



    clefScrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0,0,320,450)];

    [clefScrollView setContentSize:CGSizeMake(clefView.frame.size.width, clefView.frame.size.height)];



0
aimacworx