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 回答