添加到UIScrollView时UIPickerView不滚动!

问题描述:

我已将UIPickerView添加到UIScrollView,但现在UPickerView不滚动。当我将它添加到self.view时,它会顺利滚动。 这里我的代码添加到UIScrollView时UIPickerView不滚动!

monthsArray = [[NSArray alloc] initWithObjects:@"Jan",@"Feb",@"Mar",@"Apr",@"May",@"Jun",@"Jul",@"Aug",@"Sep",@"Oct",@"Nov",@"Dec",nil]; 

UIPickerView *objPickerView = [[UIPickerView alloc] initWithFrame:CGRectMake(185,350,100,100)]; 
    objPickerView.userInteractionEnabled=YES; 
    objPickerView.delegate = self; 
    objPickerView.showsSelectionIndicator = YES; 
    [objScrollView addSubView:objPickerView]; 

我已经包括了delegete及其方法。看看这个问题。提前致谢。
如果我不清楚请告诉我。

+0

可以使用Swift 3更新到这个解决方案 – Jeeves 2017-04-19 05:13:38

UIPickerView并非设计为可以滚动或移动。您应该放置一些文本字段,并在用户点击时显示UIPickerView。

+0

im:我想你错过了阵列。我已经添加了数组内容作为每行的标题。现在你能告诉我如何选择“Dec”而不用scrollibf UIPickerView? – Developer 2011-01-25 12:57:18

+0

拾取器本身将执行滚动。如果有的话,滚动视图可以将整个选择器作为一个整体移动到屏幕上。 – Axel 2011-01-25 13:05:12

从UIScrollView的类文件:

重要:您不应该嵌入的UIScrollView对象的UIWebView或UITableView的对象。如果这样做,可能会导致意外的行为,因为两个对象的触摸事件可能混淆并被错误地处理。

他们没有提到UIPickerView那里,但我不知道它是否应该被添加到该列表。它与其他人共享使用触摸滚动事物的特性。

我想这可能会解决你的问题(一定要检查的评论太):因为它抢断触摸

http://www.alexc.me/uiscrollview-and-uidatepicker/153/

基本上你必须DelaysContentTouches和CanCancelContentTouches设置为NO上滚动视图,来自选取器的事件。

我有一个类似的UIPickerView嵌套在UIScrollView中的问题,并通过继承UIPickerView来解决它。对延迟的更改ContentTouches/ CanCancelContentTouches没有帮助,其他“答案”基本上都是“不这样做” - 呃,那根本就没有答案!它可以完成,你可以让一个选择器在scrollView中运行。

我回答以下问题上的子类UIPickerView,包括在年底一些代码,可以帮助你:

Responding to touchesBegan in UIPickerView instead of UIView

我使用UIPickerView的子类,为了同样的目的,但我要简单得多:

@implementation ScrollablePickerView 

- (UIScrollView *)findScrollableSuperview { 

    UIView *parent = self.superview; 
    while ((nil != parent) && (![parent isKindOfClass:[UIScrollView class]])) { 
     parent = parent.superview; 
    } 
    UIScrollView* scrollView = (UIScrollView *)parent; 

    return scrollView; 
} 

- (UIView*)hitTest:(CGPoint)point withEvent:(UIEvent*)event { 
    UIScrollView* scrollView = [self findScrollableSuperview]; 

    if (CGRectContainsPoint(self.bounds, point)) { 
     scrollView.canCancelContentTouches = NO; 
     scrollView.delaysContentTouches = NO; 
    } else { 
     scrollView.canCancelContentTouches = YES; 
     scrollView.delaysContentTouches = YES; 
    } 

    return [super hitTest:point withEvent:event]; 
} 

@end 

工程就像一个魅力 - 至少对我来说。

我一直在遇到类似的问题。我有一个UIPickerView,通过应用转换(它工作得很好),我转向了水平,但是在scrollview中,滚动只能在左侧进行。

我认为正在发生的事情是,UIPicker查找它的父链来查看是否有任何手势识别器,并将自己设置为委托,因此它可以禁止手势识别进一步触及其边界内的链,当变换改变视觉边界时,它不会改变框架,它是否正在寻找它原始边界内的触摸。

如果这不是正在发生的事情,您可以使用它来防止滚动视图窃取您的触摸。

我想我要切换到自定义UISCrollView,而不是我的转换UIPickerView。