繁体   English   中英

添加到UIScrollView时UIPickerView不滚动!

[英]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已被拖动时更改canCancelContentTouchesdelaysContentTouches没有帮助。 所以我通过在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时回答了以下问题,包括最后的一些代码可能对您有所帮助:

响应UIPickerView中的touchesBegan而不是UIView

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM