5

垂直スクロールのみが有効になっている UIScrollView があります。ボタンのグリッドを表示しています (フォト ビューアーの画像グリッドに似ています)。すべての画面領域が使用されるように、グリッドは画面の向きに基づいて異なる方法で描画する必要があります。ボタンのサイズを考えると、縦向きでは 1 行あたり 3 つ、横向きでは 1 行あたり 4 つ収まります。

すべてのボタンを willRotateToInterfaceOrientation:duration に再配置してから、UIScrollView で setContentSize: を呼び出します。SetContentSize: の呼び出し後に発生する自動スクロールを除いて、すべてが正常に機能しているようです。言い換えれば、私が縦向きで、リストの 3/4 までスクロールしたとしましょう。横向きに回転すると、一番上まで自動スクロールします。

興味深いことに、同じシナリオで、上または下に小さなフリック スクロールを行い、すぐにデバイスを回転させると、スクロール ビューが正しく再描画され、現在のスクロール位置が保持されます。

したがって、明確にするために、ここでの犯人は SetContentSize: のようですが、明らかに、スクロール ビューを正しくスクロールするにはそれを呼び出す必要があります。

現在のスクロール位置を保持する方法についてのアイデアはありますか?

ありがとう!

4

2 に答える 2

1

一番上までスクロールするかどうかを呼び出し元に伝えるUIScrollViewDelegateメソッドを実装してみてください。scrollViewShouldScrollToTop:ローテーションが進行中かどうかを示すフラグをデリゲートに含める必要がある場合があります。これは、通常の状態では、実際にはステータス バーをタップしてスクロール ビューを一番上にスクロールする機能が必要な場合があるためです。

一方、スクロール ビューを自動的に一番上までスクロールさせたくない場合は、そのデリゲート メソッドを実装し、NO を返すようにします。

于 2011-04-14T16:58:22.747 に答える
0

私はこの問題を抱えていました、ちょうどこれをしました、そしてそれは私にとってうまくいきます

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
{
    //calculate percentage down scrollview currently at
    float c = self.scrollView.contentOffset.y / self.scrollView.contentSize.height;

    //reposition subviews in the scrollview
    [self positionThumbnails:toInterfaceOrientation];

    //set the new scrollview offset to the same percentage, 
    // using the new scrollview height to calculate
    self.scrollView.contentOffset = 
          CGPointMake(0, c * self.scrollView.contentSize.height);
}

私の場合、デバイスサイズに対して幅が固定され、高さが可変のスクロールビューがあります

于 2012-03-07T04:26:08.017 に答える