3

私は現在、スクロールビューでサイズ変更された UIPickerView を持つアプリケーションを構築しています。私が直面している問題は、ピッカーをスクロールしようとすると、代わりにスクロールビューが移動することです。

過去数時間、次の hitTest を実行する UIScrollView サブクラスを作成して、ピッカーが選択されたときにスクロールビューを無効にすることで、これを修正しようとしました。

- (UIView*)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
    UIView* result = [super hitTest:point withEvent:event];
    if ([result.superview isKindOfClass:[UIPickerView class]])
    {
        NSLog(@"Cancel touch");
        self.canCancelContentTouches = NO;  
        self.delaysContentTouches = NO;
        self.scrollEnabled = NO;
    }
    else 
    {
        self.canCancelContentTouches = YES; 
        self.delaysContentTouches = YES; 
        self.scrollEnabled = YES;
    }
    return result;
}

この上記のコードでは、UIPickerView の特定のセクションをクリックして保持すると、タッチがキャンセルされ、UIScrollview OK が無効になり、UIPicker を移動して新しい値を選択できることがわかりますが、PickerView の特定の領域で NSLog を実行すると、以下のような報告されたクラスで

NSLog(@"%@", [result.superview class]);

UIPickerTableViewWrapperCell をコンソールに出力し、 isKindOfClass[UIPickerView class] は入力されません。

isMemberOfClass も試しましたが、これも機能しません。

どんな助けでも大歓迎です。

ありがとうアーロン

4

1 に答える 1

4

クラスの説明を検索して、 @"UIPicker*" が含まれているかどうかを確認することで、これを理解したと思います

- (UIView*)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{

    UIView* result = [super hitTest:point withEvent:event];

    NSString *viewDescription = [result.superview class].description;
    NSRange range = [viewDescription rangeOfString : @"UIPicker"];

    if (range.location != NSNotFound) 
    {
        NSLog(@"Cancel touch on ScrollView");
        self.canCancelContentTouches = NO;  
        self.delaysContentTouches = NO;
        self.scrollEnabled = NO;
    }
    else 
    {
        self.canCancelContentTouches = YES; 
        self.delaysContentTouches = YES;
        self.scrollEnabled = YES;
    }
    return result;
}

UIPicker をドラッグすると、完全に機能し、クリックしてドラッグしない限り、スクロールビューはまったく移動しません。

アーロン

于 2012-06-24T19:27:23.453 に答える