Как и другие говорят, что у вас должна быть разумная поверхность для регистрации сенсорных событий, но я уверен, что вы это знаете и у вас есть причины, поэтому я просто расскажу вам, как я это сделал:
Мне нужно было сделать это не так давно, и я только что предложил Сикстен Отто. В моем исходном вопросе (раздел «ОБНОВЛЕНИЕ») есть несколько советов по получению значения альфа для вашего изображения в определенный момент:
Как создать прозрачное окно с непрямоугольными кнопками?
Редактировать: Я предлагаю создать подкласс UIControl в приведенном ниже примере, но если вам не нужно какое-либо специальное поведение для вашей кнопки, кроме ее «не прямоугольности», тогда просто создайте подклассы UIButton без полей. с вашим PNG сделает работу и потребует меньше работы. Вы имеете больше контроля над поведением элемента управления, создав подкласс UIControl и сделав его «трудным путем».
Я бы посоветовал вам создать подкласс UIControl
и переопределить методы события касания, а затем проверить наличие альфа под точкой касания и не обрабатывать событие, если alpha == 0
. Для рисования вы переопределяете drawRect:
и используете там метод NSImage
drawInRect:fromRec:operation:fraction:
, чтобы нарисовать ваше изображение в кадре элемента управления.
Сначала вам нужно загрузить изображение и получить его растровое представление:
buttonImage = [NSImage imageNamed:@"myButtonImage"];
buttonImageRep = [[buttonImage representations] objectAtIndex:0];
Затем вы можете нарисовать его в виде элемента управления: (где stateImage - указатель на изображение, которое должно быть нарисовано в зависимости от того, нажата кнопка или нет)
- (void)drawRect:(NSRect)aRect {
[stateImage drawInRect:[self bounds] fromRect:NSMakeRect(0.0,0.0,[buttonImage size].width,[buttonImage size].height)
operation:NSCompositeSourceOver fraction:1.0];
}
На данный момент вы нарисовали кнопку с изображением PNG. Вы можете переопределить методы сенсорного события и обработать событие, если альфа не равна 0:
NSColor *colorUnderMouse = [buttonImageRep colorAtX:mouse.x y:mouse.y];
float alpha = [colorUnderMouse alphaComponent];
Это то, что я сделал, и это прекрасно работает. Надеюсь, это поможет!
N.B .: Мой пример для Mac, но он также должен работать на iPhone, возможно, с небольшими изменениями.