0

フルスクリーン UIScrollview(A) にフルスクリーン UIScrollview(B) があります。

  • A は contentsize = ページ数 横方向

  • B には contentsize = サブページの垂直方向の数があります

  • B の内部には、 B と同じ方向にスクロールする小さな UIscrollview (C) があります...垂直方向にも。

C が激しくスクロールしている場合、contentSize の最後に到達するとハード バウンス効果が発生します。

問題:それはまた、Bにバウンス効果を生み出します!!!! 両方のバウンス効果を抑制せずに、親子間のバウンス効果のこの汚染を抑制する方法はありますか。

ありがとう

4

2 に答える 2

1

Apple のドキュメントでは、同様の設計に対して警告しています。ドキュメントから:

重要: UIWebView または UITableView オブジェクトを UIScrollView オブジェクトに埋め込まないでください。これを行うと、2 つのオブジェクトのタッチ イベントが混同され、誤って処理される可能性があるため、予期しない動作が発生する可能性があります。

あなたが発見した理由から、この警告をネストされた UIScrollViews に拡張します。

ネストされた A/B/C UIScrollViews の類似物から、モバイル Safari ブラウザーとほぼ同じことを行うことで、それを引き出すことができます。ユーザーは「Web ページ選択」モード (A&B ビュー) または「Web ページ表示」モード (C ビュー) のいずれかです。Safari のカスタム WebView コントローラーのボタンを使用すると、ユーザーは「Web ページの表示」モードから「Web ページの選択」モードにジャンプできます。これは、現在アクティブな各ページのサムネイルを含む UIScrollView です。

したがって、あなたの場合、ネストされた UIScrollViews から C を引き出し、A&B ビュー コントローラーを表示する C ビュー コントローラーにボタンを追加し、別のコントローラー クラスを作成してすべてを接着することを意味します。

また、A&B を単一の UIScrollView に結合することもお勧めします。

于 2010-11-28T08:21:11.120 に答える
0

Apple iOS スクロール ビュー プログラミング ガイドによると、現在..

リッチなユーザー エクスペリエンスを作成するには、アプリケーションにスクロール ビューをネストすることをお勧めします。iOS 3.0 より前は、これを達成することは不可能ではないにしても困難でした。iOS 3.0 では、この機能は完全にサポートされ、自動的に機能します。

したがって、スクロールビューのネストは完全に問題ありません> iOS 3.質問に答えるために、スクロールビューCを「コンテナー」UIViewにサブビューとして追加しました-そのコンテナービューをスクロールビューBに追加する前に、親スクロールビューを下に引っ張るバウンスを停止するようです。ただし、コンテナー ビューなしで説明した動作を示すには、かなり強くすばやくスワイプする必要がありました。

@interface TiledScrollView : UIScrollView @end

@implementation TiledScrollView

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if(self)
    {
        self.layer.borderColor = [UIColor whiteColor].CGColor;
        self.layer.borderWidth = 10.f;
    }
    return self;
}

- (void)setContentSize:(CGSize)contentSize
{
    [super setContentSize:contentSize];

    BOOL horizontal = contentSize.width > self.frame.size.width;

    if(horizontal)
    {
        CGFloat col = self.contentSize.width / 10.f;
        for (int i = 0; i < 10; i++)
        {
            UIView * view = [[UIView alloc] initWithFrame:CGRectMake(i * col, 0, col, self.contentSize.height)];
            view.backgroundColor = [UIColor colorWithHue:(arc4random() % 100) / 100.f saturation:1.f brightness:1.f alpha:1.f];
            [self addSubview:view];
        }
    }
    else
    {
        CGFloat row = self.contentSize.height / 10.f;
        for (int i = 0; i < 10; i++)
        {
            UIView * view = [[UIView alloc] initWithFrame:CGRectMake(0, i * row, self.contentSize.width, row)];
            view.backgroundColor = [UIColor colorWithHue:(arc4random() % 100) / 100.f saturation:1.f brightness:1.f alpha:1.f];
            [self addSubview:view];
        }
    }
}

@end

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    CGRect bounds = [UIScreen mainScreen].bounds;
    TiledScrollView * A = [[TiledScrollView alloc] initWithFrame:CGRectMake(0, 0, bounds.size.width, bounds.size.height)];
    TiledScrollView * B = [[TiledScrollView alloc] initWithFrame:CGRectMake(0, 0, bounds.size.width, bounds.size.height / 2.f)];
    TiledScrollView * C = [[TiledScrollView alloc] initWithFrame:CGRectMake(0, 0, bounds.size.width, bounds.size.height / 4.f)];

    [A setContentSize:CGSizeMake(bounds.size.width * 4, bounds.size.height)];
    [B setContentSize:CGSizeMake(bounds.size.width, bounds.size.height * 4)];
    [C setContentSize:CGSizeMake(bounds.size.width, bounds.size.height * 4)];

    UIView * container = [[UIView alloc] initWithFrame:CGRectMake(0, 0, bounds.size.width, bounds.size.height / 4.f)];

    [container addSubview:C];
    [B addSubview:container];
    [A addSubview:B];
    [self.view addSubview:A];
}

@end
于 2014-01-06T15:09:18.923 に答える