【问题标题】:Not able to press an UIButton below UIView with corner radius无法按下具有拐角半径的 UIView 下方的 UIButton
【发布时间】:2014-06-02 13:54:40
【问题描述】:

我在视图中添加了一个UIView 和一个UIButton,它们位于左下角视图下方。

我以这种方式为 UIView 对象添加了圆角半径:

self.myView.layer.cornerRadius = self.myView.frame.size.width/2;
self.myView.layer.masksToBounds = YES;

现在它有一个圆形,我的按钮是可见的。见下图:

问题是我无法按下按钮(它没有突出显示)。如何让它可触摸?

我知道将按钮放在前面可以解决问题,但我想知道是否有办法通过保持在视图下方来按下它。

【问题讨论】:

  • 为什么不能把uibutton放在uiview后面呢?
  • 它不工作,因为查看按钮。
  • 可能是一个肮脏的修复,但是让顶视图 0.01% 透明将允许触摸传递到下面的视图。我过去曾对此进行过实验。虽然它可能已修复,但值得一试。要么就是这样,要么实现一个递归的 hittest 函数。
  • @TotumusMaximus 感谢您的建议,但没有奏效。
  • 哈,我讨厌那样做,让我觉得自己像个代表瘾君子 xD。但你是对的,所以它完成了。

标签: ios objective-c uiview


【解决方案1】:

通过以下链接解决了这个问题:Allowing interaction with a UIView under another UIView

我推荐使用递归的 hittest。但是公认的答案也很有趣(使视图对触摸或其他东西透明)。

【讨论】:

    【解决方案2】:

    您需要将UIView 子类化为您的圈子并覆盖以下方法:

    - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event{
        CGFloat radius = self.frame.size.width/2;
        CGFloat distance = sqrtf(powf(point.x-self.frame.size.width/2, 2)+powf(point.y-self.frame.size.height/2, 2));
        if(distance<radius)
            return [super hitTest:point withEvent:event];
        return nil;
    }
    

    这使得视图只接受圆圈内的触摸。您可能需要调整逻辑以适应您的观点。

    【讨论】:

    • 您应该返回[super hitTest:point withEvent:event]的结果,而不是返回self,以允许触摸圆及其子视图。
    【解决方案3】:

    您的按钮可能已被覆盖。您可以在之后添加按钮,也可以使用此方法将其带到前面, [parentView带来SubviewToFront:childView];

    【讨论】:

    • 我想知道是否有办法通过将按钮保持在视图下方来按下按钮。
    【解决方案4】:

    将圆形视图的userInteractionEnabled 属性设置为NO 会将触摸传递到按钮。

    self.myView.userInteractionEnabled = NO;
    

    【讨论】:

    • 这是真的,但我需要启用它。
    • 你能把按钮添加为myView的子视图吗?
    • 不,层次结构应该保持不变。
    【解决方案5】:

    @robert 的回答,稍作修正,很快:

    override func hitTest(point: CGPoint, withEvent event: UIEvent?) -> UIView?
    {
        let radius   = self.frame.size.width / 2
        let distance = sqrt(pow(point.x - self.frame.size.width  / 2, 2) +
                            pow(point.y - self.frame.size.height / 2, 2))
    
        return distance < radius ? super.hitTest(point, withEvent: event) : nil
    }
    

    【讨论】:

      【解决方案6】:

      有不同的方法;取决于你所说的“可触摸”是什么意思

      您可以在按钮上添加一个目标操作,以便在按下按钮时进行操作。你可以这样说

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

      那么你必须声明这个方法

      - (void) methodForTouchingButton
      { NSLog(@"Button Touched!"); }
      

      您可以做的另一种方法是尝试将其添加到顶级视图。这样做会是

      [self.myView addSubview:button];
      

      应该这样做。

      希望这会有所帮助!

      【讨论】:

      • 我添加了一个目标。我所说的可触摸是指它甚至没有突出显示。
      • 只需使用 [self.myView addSubview:button] 添加到顶层;这样就可以了
      【解决方案7】:

      将按钮放在视图的顶部,而不是下方。视图覆盖了按钮,即使您有一个角半径。视图使用它们的框架矩形来确定哪个视图被点击。

      【讨论】:

      • 我知道将按钮放在前面会解决问题,但我想知道是否有办法通过保持在视图下方来按下它。
      • 如果您的视图启用了用户交互,那么当视图覆盖按钮时,它将获得触摸而不是按钮。您可能可以编写一个自定义视图,该视图具有代码来确定点击在圆圈之外并将触摸事件传递给按钮。在这种情况下,您可能希望按钮成为您的圆形视图的子视图,而您的圆形视图成为您创建的自定义类。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-18
      • 1970-01-01
      • 2017-02-13
      相关资源
      最近更新 更多