UIView с изображением Png - игнорировать прикосновения в прозрачных областях - PullRequest
4 голосов
/ 15 марта 2011

У меня есть PNG круга с прозрачным фоном, добавленный как подпредставление. Я использую этот тип метода, чтобы повернуть его:

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

if(CGRectContainsPoint(wheelfrom.frame, location))
{

}

проблема в том, что прозрачные области изображения регистрируются как часть UIView. Есть ли способ игнорировать эти области при прикосновении? Есть ли лучший способ настроить UIView для распознавания прозрачности?

спасибо!

Ответы [ 2 ]

2 голосов
/ 15 марта 2011

вы можете проверить цвет пикселя rbga изображения и посмотреть, равно ли (= альфа-значение) == 0 (или <= aLowValue) ... как предложено Игорем Пчелко ... </p>

, нов вашем случае это может быть проще ... вы используете 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!!");
        }
    }
0 голосов
/ 15 марта 2011

Попробуйте проверить свой UIImage (круг или любой другой) на непрозрачность пикселей.

Чтобы посмотреть цвет пикселей, см .: Как получить данные пикселей из UIImage (Cocoa Touch) или CGImage (Core Graphics)

...