29

スクロール可能で、各タブバーアイテムにページングがあるカスタムタブバーを実装しようとしています。そのために、デリゲートscrollViewWillEndDragging:withVelocity:targetContentOffset:を使用しています。これは1つの問題で完全に機能します。

私のページングの仕組みは、contentOffsetが適切なアイテムの近くにある場合、targetContentOffsetがそのアイテムのオフセットに変更されることです。左側も同じです。

問題は、最初のアイテムの左半分と最後のアイテムの右半分にいるときはいつでも(スクロールビューは水平方向に機能します)、ContentOffset 0と右端のアイテムのコンテンツオフセット(上のアイテムを除く)に移動することになっていることです。画面)、しかし、そうではありません。

デバッガーで確認したところ、targetContentOffset-> xは実際に0です(最初のケースでは、左端の項目の左側)。したがって、問題はUIScrollViewがそこでスクロールしないことです。道に迷いました。

これが私の実装されたデリゲートです:

- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView
                 withVelocity:(CGPoint)velocity
          targetContentOffset:(inout CGPoint *)targetContentOffset{
     NSInteger index = lrintf(targetContentOffset->x/self.tabWidth);
     targetContentOffset->x = index * self.tabWidth;
}

これが私がやりたいことを説明する図です。

|-------|-------|-------|-------|-------|-------|-------|
|       |       |       |       |       |       |       |
|       |       |       |       |       |       |       |
|_______|_______|_______|_______|_______|_______|_______|

        |_______________________________________|
         where it is and i scroll it to the left

   <----|

   |_______________________________________|
              where it would stop

|_______________________________________|
        where i want it to stop
4

5 に答える 5

15

これは既知の問題のようです。いくつかの調査と他の人々との話し合いの結果、それはバグである可能性があることが示唆されましたが、それは正しいことが判明しました。私はそれをAppleに報告し、重複としてマークされましたが、まだ開いています。同じ問題を抱えているあなたのために答えるだけです。私はBigPapooが提案するように、私が望むものに近いオフセットを使用することによってそれを回避します(0.1はそれを行うようです)。右端も同じです。

于 2012-06-27T11:21:55.673 に答える
9

iOS6.0で修正された問題。

これで、正常に機能します。

于 2012-10-10T13:08:19.980 に答える
8

Big Papooが提案するように、最終オフセットをゼロまたはコンテンツサイズから少し外れた値に設定しようとしましたが、これによりオーバースクロールバウンスが削除されることに気付きました。これに対する私の解決策は、元のtargetContentOffsetをチェックして、ゼロまたはcontentSizeに等しいかどうかを確認し、等しい場合はそのままにしておくことでした。

- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset {

    float expectedOffset = targetContentOffset->x;
    if (expectedOffset == 0 || expectedOffset == scrollView.contentSize.width) return; // Scroll view will bounce so leave the targetContentOffset.

    float targetOffset = [self roundedOffset:expectedOffset]; // Round your offset.

    // Adjust the offset to make sure it works.
    if (targetOffset == 0) targetOffset = 1;
    else if (targetOffset == SCROLLVIEW_WIDTH) targetOffset = SCROLLVIEW_WIDTH - 1;

    targetContentOffset->x = targetOffset;
}

もちろん、を使用scrollViewDidEndDecelerating:してスクロールビューをその1ポイント移動できます。

于 2012-09-18T11:13:12.360 に答える
3

調査できる文書化されていない動作が2つ見つかりました:-最終オフセットが機能しないためゼロを設定します。1またはゼロより大きい値を設定することをお勧めします(0.5は機能する可能性があり、テストされていません)-速度記号を確認して計算することをお勧めしますユーザーが削除した現在のポイントの左側または右側にある最終的なオフセットは指です。反対側でスクロールを逆行させようとしないでください。

于 2012-06-26T23:37:20.713 に答える
0

水平テーブルビューを使用している場合は、scrollViewWillEndDragging:withVelocity:targetContentOffset:関数内で、次を呼び出すことができます。

[self.tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:<index> inSection:<section>] atScrollPosition:UITableViewScrollPositionTop animated:YES];

これは、水平テーブルビューでtargetContentOffset->yを操作するよりもはるかにうまく機能することがわかりました。

于 2012-08-09T00:36:47.660 に答える