首页 文章

UIButton扩展触摸区域,如苹果键盘

提问于
浏览
1

我有三个小型自定义UIButton(w:25,h:35)的视图,我觉得很难获得触摸事件 .

我添加了touchUpInside事件的目标 .

[button addTarget:self action:@selector(keyPressed :) forControlEvents:UIControlEventTouchUpInside];

但正如我所说,我自己似乎很容易错过它 . 然后我查看了苹果键盘上的类似按钮 . 它们似乎有一个更大的触摸区域,特别是字母 "A""L" 的键 . 我想知道他们是如何设法做到这一点的 .

任何帮助和代码示例将不胜感激 .

3 回答

  • 1

    您是否尝试过使用Edge Insets?

    这基本上是让你为按钮周围的矩形设置插入或开始边距 .

    https://developer.apple.com/library/ios/documentation/uikit/reference/uibutton_class/index.html#//apple_ref/doc/uid/TP40006815-CH3-SW31

  • 0

    创建一个新的类来加入UIButton并覆盖此函数:

    - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
    int errorMargin = 8;
    if ([self.titleLabel.text isEqualToString:@"A"] || [self.titleLabel.text isEqualToString:@"a"]) {
        CGRect largerFrame = CGRectMake(0 - 20, 0 - errorMargin, self.frame.size.width + 22, self.frame.size.height + errorMargin*2);
        return (CGRectContainsPoint(largerFrame, point) == 1) ? self : nil;
    }
    if ([self.titleLabel.text isEqualToString:@"L"] || [self.titleLabel.text isEqualToString:@"l"]) {
        CGRect largerFrame = CGRectMake(0 - 2, 0 - errorMargin, self.frame.size.width + 20, self.frame.size.height + errorMargin*2);
        return (CGRectContainsPoint(largerFrame, point) == 1) ? self : nil;
    }
    
    CGRect largerFrame = CGRectMake(0 - 2, 0 - errorMargin, self.frame.size.width + 2, self.frame.size.height + errorMargin*2);
    return (CGRectContainsPoint(largerFrame, point) == 1) ? self : nil;
    }
    

    您将获得相同的视觉输出和您想要的可触摸区域

  • 0

    你不应该创建一个小于40x40点的按钮 . 您可以在其中放入较小的图像 . 您可以拥有25,35(b.e.myImage@2x.png)的图像 .

    一个例子:

    UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(100, 100, 40, 40)];
    [button setImage:[UIImage imageNamed:@"myImage"] forState:UIControlStateNormal];
    

    //其他选项

    UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(myPosition.x-15, myPosition.y-15, 40, 40)];
    [button setImage:[UIImage imageNamed:@"myImage"] forState:UIControlStateNormal];
     // ......
    button.layer.borderColor = [[UIColor clearColor] CGColor];
    button.layer.borderWidth = 15.0;
    button.layer.masksToBounds = YES;
    

相关问题