9

UIScrollView 内に UIControl があります。私の UIControl ではinit、いくつかのタッチ イベント ハンドラーを装備します。

[self addTarget:_delegate
         action:@selector(touchedDown) forControlEvents:UIControlEventTouchDown];

次の操作を行うと、iOS6 と iOS7 の動作が異なります。

  1. UIScrollView をスワイプしてスクロールを開始します
  2. UIScrollView をタップしてスクロールを停止します

iOS6 では、私のアプリは引き続き意図したとおりに動作します。ステップ 2 のタップは呼び出されません touchedDown。UIScrollView は、スクロールをすぐに停止するため、タッチ イベントを飲み込みます。

しかし、iOS7 では、 UIScrollViewtouchedDown はまだ呼び出されている間に、期待どおりにスクロールを停止します。

文書化された API の変更はありましたか? アプリが iOS7 で iOS6 と同じように動作するようにしたいと考えています。

4

4 に答える 4

9

iOS 7 の回避策

@interface UIScrollViewFixed : UIScrollView

@end

@implementation UIScrollViewFixed

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
    if (self.isDragging || self.isDecelerating) {
        return self;
    }
    return [super hitTest:point withEvent:event];
}

@end
于 2013-11-01T14:17:11.777 に答える
4

イベントタイプを置き換えるだけ

UIControlEventTouchDownでなければなりませんUIControlEventTouchUpInside

于 2013-10-15T03:05:34.683 に答える
3

あまりエレガントではありませんが、より良いアイデアがない場合、現在私にとってうまくいっているのは次のとおりです。

  • UIScrollView で、 および に設定しcanCancelContentTouchesます。YESdelaysContentTouchesNO
  • UIScrollViewDelegate で、UIScrollView がスクロールするときに UIScrollView のサブビューのuserInteractionEnabledプロパティを切り替えます。
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
    [_contentView setUserInteractionEnabled:NO];
}

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
{
    if (!decelerate) {
        [_contentView setUserInteractionEnabled:YES];
    }
}

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
    [_contentView setUserInteractionEnabled:YES];
}
  • UIScrollView をサブクラス化し、以下を実装します。
- (BOOL)touchesShouldCancelInContentView:(UIView *)view
{
    return YES;
}
  • UIControl をサブクラス化し、ハンドラーの動作touchesCancelled:withEventを逆にするように実装します。UIControlEventTouchDown
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
{
    //custom logic
}
于 2013-10-02T08:52:09.793 に答える
0

UIScrollView の UIButtons と同じです。これが今のところ私の解決策です。

コンテンツ UIControlEventTouchDown イベントを使用する代わりに:

[button addTarget:_delegate
         action:@selector(touchedDown) forControlEvents:UIControlEventTouchDown];

コンテンツ UIViewController に UIResponder touchesEnded メソッドを実装しました。

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{
// my scroll content touch logic
}

ユーザーがコンテンツに触れてドラッグを開始すると、touchesEnded ハンドラーは呼び出されません。UIResponder touchesCanceled メソッドがそうします。

ユーザーが UIscrollview をドラッグしない場合、touchesEnded ハンドラーが起動され、タッチ ロジックに使用できます。

于 2013-10-03T08:46:37.070 に答える