ios - UITableViewCell 中的自定义 UISwitch

标签 ios uicontrol

我实现了一个非常简单的自定义 UISwitch,它使用触摸事件,例如:

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

我可以毫无问题地在我的 View 中使用此控件。该控件模拟 UISwitch,因此它可以通过拖动或点击来更改值。

我的问题是我不能让这个控件在 UITableView 的单元格内工作。只有单击似乎有效(请注意,我没有使用手势......而是我之前列出的事件),但我无法“滑动”开关 handle 。

我在 tableView:cellForRowAtIndexPath 方法中实例化 Controller ,将控件添加为单元格 contentView 的 subview :

[cell.contentView addSubview:customSwitch];

我认为这与 UITableView 是 UIScrollView 这一事实有关,并且我认为触摸事件以某种方式被它“窃取”。

//编辑--------------------

这是与触摸事件相关的代码。

- (BOOL)beginTrackingWithTouch:(UITouch *)touch withEvent:(UIEvent *)event
{
    [super beginTrackingWithTouch:touch withEvent:event];

    self.dragged = NO;

    return YES;
}

- (BOOL)continueTrackingWithTouch:(UITouch *)touch withEvent:(UIEvent *)event
{
    if (!self.enabled) {
        return NO;
    }

    [super continueTrackingWithTouch:touch withEvent:event];
    self.dragged = YES;
    CGPoint touchPoint = [touch locationInView:self];

    float centerPoint = FIXED_WIDTH / 2.0;

    [self centerOn:(touchPoint.x > centerPoint) animated:YES completion:nil];

    return YES;
}

- (void)endTrackingWithTouch:(UITouch *)touch withEvent:(UIEvent *)event
{
    [super endTrackingWithTouch:touch withEvent:event];

    CGPoint touchPoint = [touch locationInView:self];

    BOOL currentOn = self.on;
    BOOL nextOn;

    if (self.dragged) {
        float centerPoint = FIXED_WIDTH / 2.0;
        nextOn = (touchPoint.x > centerPoint);

        [self setOn:nextOn animated:NO];
    }else{
        nextOn = !self.on;
        [self setOn:nextOn animated:YES];
    }
    self.dragged = NO;

    if (currentOn != nextOn) {
        [self sendActionsForControlEvents:UIControlEventValueChanged];
    }
}

如何使控件在 Cell 内工作而不干扰 UIScrollView/UITableView?

最佳答案

您需要使用手势来实现您的自定义开关,而不是尝试直接处理事件。

手势识别器在幕后工作以协调它们的事件处理,例如,这就是为什么一个 UIScrollView 可以在另一个 UIScrollView 内部工作。您需要协调 UITableView(实际上是 UIScrollView)以正确处理其内容中的滑动手势。

在网络上搜索 Hardy Macia 的 UICustomSwitch 示例代码,以获得在自定义控件中匹配 UISwitch 行为的好示例。

关于ios - UITableViewCell 中的自定义 UISwitch,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27745298/

相关文章:

ios - ScrollView Autolayout 使用 Label 但不使用 Custom Control

ios - 每次创建新注释 - dequeueReusableAnnotationViewWithIdentifier

ios - dispatch_group_async白名单dispatch_group_notify

ios - 使用 Rxswift 绑定(bind)两个 UIview fram/Position

ios - 使用自定义drawRect代码创建UIButton LIKE控件

ios - 从UIControl显示UIPopoverPresentationController吗?

android - FlatBuffers 可以与 PHP 服务器端一起使用吗?

html - 在 Safari iOS 13 + 上禁用双击缩放

iphone - UIControl:将多个目标- Action 对添加到同一事件时的调用顺序?

ios - UIButton 在 iOS 5 中不调用操作但在 iOS 6 中工作