0

我有一个自定义开关

UICustomSwtichUISlider

这里下载

这个怎么运作

UICustomSwitch覆盖此触摸事件以使其工作,因为它必须工作:

- (void)endTrackingWithTouch:(UITouch *)touch withEvent:(UIEvent *)event 
- (void)touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event
- (void)touchesEnded:(NSSet*)touches withEvent:(UIEvent*)event

好的测试

UICustomSwitch在任何情况下都能完美运行UIView,甚至在UIScrollView. 当必须调用三个触摸事件时,它会被正确调用。

坏作品

这是我的问题。我有一个UITableView从 StoryBoard 设计的具有这种层次结构的静态:

UITableView> UITableViewCell> UIView>UICustomSwitch

在这种情况下:

- (void)touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event

这个函数被正确调用

- (void)touchesEnded:(NSSet*)touches withEvent:(UIEvent*)event

- (void)endTrackingWithTouch:(UITouch *)touch withEvent:(UIEvent *)event

当我移动拇指小于杆的长度时,拇指保持在我离开它的同一点(问题)。

当我向左和向右移动拇指(上升到小节的末端)时,这两种方法被调用(非常奇怪的行为,不是吗?)。

我寻找答案,发现具有不同解决方案的类似问题,但对我的问题有任何好处。

为什么触摸事件有时会到达我的UICustomSwitch,有时不会?为什么结束和 trackingWithTouch 事件而不是开始事件?

提前致谢。

4

1 回答 1

0

我获得了一个实现所有(较少评论的)触摸和跟踪事件的解决方案:

#pragma - touches

- (void)touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event
{
    [super touchesBegan:touches withEvent:event];

    LOG(@"touches began");

    m_touchedSelf = NO;
    on = !on;
}

//- (void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
//{
//    [super touchesMoved:touches withEvent:event];
//    
//    LOG(@"touches moved");
//    
//}

- (void)touchesEnded:(NSSet*)touches withEvent:(UIEvent*)event
{
    [super touchesEnded:touches withEvent:event];

    LOG(@"touches ended");

    if (!m_touchedSelf)
    {
        [self setOn:on animated:YES];
        [self sendActionsForControlEvents:UIControlEventValueChanged];
    }
}


- (void) touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
{
    [super touchesCancelled:touches withEvent:event];

    LOG(@"touches cancelled");

    CGPoint location = [[touches anyObject] locationInView:self];
    if (location.x > self.frame.size.width/2) {
        [self setOn:YES animated:YES];
    }else{
        [self setOn:NO animated:YES];
    }

}

#pragma - trackings

- (void)endTrackingWithTouch:(UITouch *)touch withEvent:(UIEvent *)event
{

    [super endTrackingWithTouch:touch withEvent:event];

    LOG(@"endTrackingWithTouch");

    m_touchedSelf = YES;

    if (self.value > 0.5) {
        [self setOn:YES animated:YES];
    }else{
        [self setOn:NO animated:YES];
    }
}

- (void) cancelTrackingWithEvent:(UIEvent *)event
{

    LOG(@"cancelTrackingWithEvent");

    m_touchedSelf = YES;

    if (self.value > 0.5) {
        [self setOn:YES animated:YES];
    }else{
        [self setOn:NO animated:YES];
    }
}

当控件不在表中时,可以使用普通方法。当在表内时,有时会通过取消的方法退出,有时会通过结束的方法退出。无论如何,我获得了正确的行为。

但是有一个问题没有解决。为什么UITableViewUITableViewCell取消UITouch事件UICustomSwitch

于 2013-01-18T08:53:03.453 回答