【问题标题】:uiscrollview won't cancel content touches for uisegmentedcontroluiscrollview 不会取消 uisegmentedcontrol 的内容触摸
【发布时间】:2012-12-29 20:00:14
【问题描述】:

我已经继承了 UIScrollView 并通过以下方式覆盖了 touchesShouldCancelInContentView: 方法:

-(BOOL)touchesShouldCancelInContentView:(UIView *)view

{
    if ([view isKindOfClass:[UIButton class]] || [view isKindOfClass:[UISegmentedControl class]]) {
        return YES;
    }

    if ([view isKindOfClass:[UIControl class]]) {
        return NO;
    }

    return YES;
}

它适用于 UIButton,但不适用于 UISegmentedControl。任何帮助将不胜感激

【问题讨论】:

  • 即使我只返回 YES,它仍然不会取消对分段控件的触摸,就像它是故意那样做的,所以我想我也必须将 UISegmentedControl 子类化,并且在那里找到方法

标签: ios uiscrollview uisegmentedcontrol touches


【解决方案1】:

终于明白了。必须继承 UISegmentedControl 和 UIScrollView。

1.) 为 UISegmentedControl 添加了一个新属性:

@property (nonatomic, assign) BOOL touchProcessed;

2.) 重载了 UISegmentedControl 的以下方法:

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    if (touchProcessed) {
        [super touchesBegan:touches withEvent:event];
    }
    else {
        [self.nextResponder touchesBegan:touches withEvent:event];
    }
    self.touchProcessed = NO;
}

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    [self.nextResponder touchesMoved:touches withEvent:event];
}

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
    [self.nextResponder touchesEnded:touches withEvent:event];
}

3.) 重载了 UIScrollview 的以下方法:

-(BOOL)touchesShouldCancelInContentView:(UIView *)view
{ 
    if ([view isKindOfClass:[self class]])
    {
        return YES; //if there are two nested custom scrollviews  
    }

    if ([view isKindOfClass:[UIButton class]] || [view isKindOfClass:[CustomSegmentedControl class]] || [[view superview] isKindOfClass:[CustomSegmentedControl class]]) {
        return YES;
    }

    if ([view isKindOfClass:[UIControl class]]) {
        return NO;
    }

    return YES;
}

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
    if (!self.dragging) {
        for (UIView *sv in self.subviews) {
            if ([sv isKindOfClass:[CustomSegmentedControl class]])
            {   //if there is more than one add a tag or tomething
                [(CustomSegmentedControl *)sv setTouchProcessed:YES];
                [sv touchesBegan:touches withEvent:event];
                return;
             }
        }
    }
}

完美运行!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-01
    • 2013-03-26
    • 1970-01-01
    • 1970-01-01
    • 2012-08-27
    • 2018-01-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多