UIView带有PNG图像-忽略透明区域中的触摸

4

我有一个带有透明背景的圆形PNG图像,作为子视图添加到界面上。我使用以下方法来旋转它:

CGPoint location = [touch locationInView:self.view];

(注:该代码段是iOS开发中的Objective-C代码)
if(CGRectContainsPoint(wheelfrom.frame, location))
{

}

问题在于图像的透明区域被视为UIView的一部分。是否有办法在触摸时忽略这些区域?是否有更好的方法设置UIView以识别透明度?

谢谢!


我不知道口罩的形状,但如果它很小:请知道有些用户的手指真的很胖。 :) - user142019
还没有遮罩。这只是一个视图。
  • (id)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { UIImage *image1 = [UIImage imageNamed:@"nav@2x.png"]; wheelfrom = [[UIImageView alloc] initWithImage:image1]; wheelfrom.frame =CGRectMake(10, -130, 300, 300); [self addSubview:wheelfrom]; } return self;
}有没有办法遮住圆形?
- Lord Scruffo
2个回答

2
您可以查看图像的RBGA像素颜色,并查看a(= alpha值)是否== 0(或<= aLowValue),正如Igor Pchelko建议的那样...
但在您的情况下,可能会更容易... 您正在使用2D圆形,因此只需检查手指点击与圆心之间的距离,看它是否超出了半径...这只是一个毕达哥拉斯定理的应用...
编辑: 好的,所以如果您为自己的按钮创建一个新类,继承UIButton:
在YourButton.h中:
#import <UIKit/UIKit.h>
#import <Foundation/Foundation.h>

@interface YourButton : UIButton {

}

@end

在YourButton.m文件中添加以下代码:
    - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
        UITouch *touch = [[event allTouches] anyObject];
        CGPoint touchPoint = [touch locationInView:self];
        NSLog(@"Touch x : %f y : %f", touchPoint.x, touchPoint.y);
        float circleRadius = self.frame.size.height / 2; // considering a circle inscricted in a quadRect (width = height)
        float deltaTouchOnCenterX = touchPoint.x - circleRadius;
        float deltaTouchOnCenterY = touchPoint.y - circleRadius;
        float touchDistanceFromCenter = sqrt((deltaTouchOnCenterX * deltaTouchOnCenterX) + (deltaTouchOnCenterY * deltaTouchOnCenterY) );
// or:  float touchDistanceFromCenter = hypot(deltaTouchOnCenterX,deltaTouchOnCenterY);

        NSLog(@"sqrt_val: %f", touchDistanceFromCenter);
        NSLog(@"Touch on center x : %f y : %f", deltaTouchOnCenterX, deltaTouchOnCenterY);
        if (touchDistanceFromCenter <= circleRadius) {
            // your code here
            NSLog(@"___ OK: You are inside the circle!!");
        }
    }

谢谢您的回复...那还是会使用CGRectContainsPoint函数吗?我会寻找2D解决方案,谢谢! - Lord Scruffo
你知道有没有任何示例代码可以澄清半径检查吗? - Lord Scruffo
哇,非常感谢!我会尝试一下,但是非常感谢您发布这个! - Lord Scruffo
真的太感谢你了,你帮了我大忙,现在一切都完美运作。非常感激! - Lord Scruffo

0

Swift 解决方案:

class RadiusTouchButton: UIButton {
  override func point(inside point: CGPoint, with event: UIEvent?) -> Bool {
    let radius = frame.size * 0.5
    let delta = point - CGPoint(x: radius.height, y: radius.width)
    return hypot(delta.x, delta.y) <= radius.height
  }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接