1

この次のコード例では、問題self.contentViewの を参照していUIScrollViewます。

// Scroll to bottom.
CGPoint bottomOffset = CGPointMake(0, self.contentView.contentSize.height - 
                                   self.contentView.bounds.size.height);
if (bottomOffset.y >= 0.0)
{
    [self.contentView setContentOffset:bottomOffset animated:YES];
}

奇妙なことに、iOS 6 ではこれは完全に正常に動作しますが、iOS 7 ではスクロール ビュー (それcontentSizeよりも垂直方向に大きいがあると仮定frame.size.height) は、スクロール ビューに追加された一番下のサブビューの一番下までしかスクロールしません。

たとえば、次のケースが当てはまるとします。

self.contentView.frame.size.height == 50.0
self.contentView.contentSize.height == 100.0

aSubView.frame.origin.y == 50.0
aSubView.frame.size.height == 20.0

aSubViewスクロール コードは、が表示されるまでスクロールします。スクロールビュー全体の一番下にあるのではself.contentView.contentOffset.y == 20.0なく。self.contentView.contentOffset.y == 50.0

これは (もちろん) プログラムによって別のサブビューがself.contentView(ユーザーの操作を介して) 追加されるまで発生し、その後すべてが自動的に修正されます。

わかりやすくするために、スクロール コードの前後にブレークポイントを設定して、 への変更を測定しますself.contentView.contentOffset

その他の楽しい事実として、を削除animatedして直接設定するとcontentOffset、iOS 7 で期待どおりに動作しますが、アニメーションを維持したいと思います。

注:インターフェイス ビルダーを使用しない

4

4 に答える 4

5

そのため、呼び出しを非同期ディスパッチ ブロックでラップすることで、かなり不満な解決策をすぐに見つけました。

// Scroll to bottom.
CGPoint bottomOffset = CGPointMake(0, self.contentView.contentSize.height
                                   - self.contentView.bounds.size.height);
if (bottomOffset.y >= 0.0)
{
    dispatch_async(dispatch_get_main_queue(), ^{
        [self.contentView setContentOffset:bottomOffset animated:YES];
    });
}

誰かが問題の真の原因を理解し、より良い解決策を提供できる場合は、それを答えとして喜んで受け入れますが、同じ問題を扱っている他のすべての人にとって、これがうまくいくことを願っています.

于 2014-02-13T01:38:33.780 に答える
-1

Scroll View 内のメイン ビューの File Inspector ペインで [Use Autolayout] の選択を解除できます。iOS7 / xcode 5 にアップグレードした後、UIScrollView がスクロールしない

于 2014-02-13T01:50:22.120 に答える