[英]UIPickerView is not scrolling when added to UIScrollView!
我已将UIPickerView添加到UIScrollView,但现在UPickerView没有滚动。 当我将它添加到self.view时,它会顺利滚动。 这是我的代码
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及其方法。 看看这个问题。 提前致谢。
如果我不清楚请告诉我。
我使用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
像魅力一样 - 至少对我而言。
从UIScrollView类文档:
他们没有在那里提到UIPickerView,但我想知道它是否应该被添加到该列表中。 它与其他人共同使用触摸来滚动事物的特征。
我想这可能会解决你的问题(一定要检查评论):
http://www.alexc.me/uiscrollview-and-uidatepicker/153/
基本上你必须在滚动视图上将DelaysContentTouches和CanCancelContentTouches设置为NO,因为它会从选择器中窃取触摸事件。
我一直遇到类似的问题。 我有一个UIPickerView,我通过应用变换(它工作得很好)转向水平,但是在滚动视图内部,滚动仅在左侧工作。
我认为正在发生的是UIPicker查找它的父链以查看是否有任何手势识别器,并将自己设置为委托,因此它可以禁止手势识别进一步向上链接触及其边界内的触摸,同时转换改变视觉边界,它不会改变框架,是否正在寻找其原始边界内的触摸。
如果这不是正在发生的事情,您可以使用它来防止滚动视图窃取您的触摸。
我想我要切换到自定义的UISCrollView而不是我转换的UIPickerView。
UIPickerView根本不是为了滚动或移动而设计的。 您应该放置一些文本字段,并在用户点击它时显示UIPickerView。
在iOS 11和iOS 12上,当UIScrollView
已被拖动时更改canCancelContentTouches
和delaysContentTouches
没有帮助。 所以我通过在scrollView.panGestureRecognizer
接收它们之前拦截一些触摸scrollView.panGestureRecognizer
黑客攻击。
这是Swift 4代码。 也许我们可以更优雅地检查触摸是否在拾取器内部。 但它运作良好。
public class TableView: UITableView {
/// Check if view is a picker's subview
private func isInPickerView(_ view: UIView) -> Bool {
var prev: UIView? = view
while prev != nil {
if prev is UIPickerView || prev is UIDatePicker {
return true
}
prev = prev?.superview
}
return false
}
// UITableView is already UIGestureRecognizerDelegate internally,
// so we just need to overwrite 1 method here
public func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer,
shouldReceive touch: UITouch) -> Bool {
// we don't care about any recognizers except self.panGestureRecognizer
guard gestureRecognizer == panGestureRecognizer else {
return true
}
// if touch is inside picker - we don't pass this touch
// to panGestureRecognizer
let location = touch.location(in: self)
if let view = self.hitTest(location, with: nil), isInPickerView(view) {
return false
}
return true
}
}
我有一个类似的问题,UIPickerView嵌套在UIScrollView中,并通过子类化UIPickerView解决了它。 对DelaysContentTouches / CanCancelContentTouches的更改没有帮助,而这里的其他“答案”基本上都说“不要这样做” - 嗯,这根本就没有答案! 它可以完成,你可以让一个选择器在scrollView中运行。
我在子类化UIPickerView时回答了以下问题,包括最后的一些代码可能对您有所帮助:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.