Кнопка iPhone с не прямоугольной формой? - PullRequest
5 голосов
/ 13 октября 2009

Как получить кнопку непрямоугольной формы?

Например, у меня есть изображение PNG с альфа-прозрачностью. Как я могу установить форму кнопки для этого изображения без прозрачного цвета.

Ответы [ 6 ]

8 голосов
/ 19 октября 2009

Как и другие говорят, что у вас должна быть разумная поверхность для регистрации сенсорных событий, но я уверен, что вы это знаете и у вас есть причины, поэтому я просто расскажу вам, как я это сделал:

Мне нужно было сделать это не так давно, и я только что предложил Сикстен Отто. В моем исходном вопросе (раздел «ОБНОВЛЕНИЕ») есть несколько советов по получению значения альфа для вашего изображения в определенный момент:

Как создать прозрачное окно с непрямоугольными кнопками?

Редактировать: Я предлагаю создать подкласс 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, возможно, с небольшими изменениями.

7 голосов
/ 13 октября 2009

Похоже, вы хотите, чтобы область нажатия кнопки точно соответствовала используемому PNG.

Если это то, что вы ищете, я бы сначала сказал не делать этого. На iPhone нажимают пальцем, который, как правило, не может точно различить такую ​​маленькую область.

Однако, если вы застряли на идее, то решение состоит в том, чтобы вообще не использовать кнопки, вместо этого обрабатывать щелчок в родительском фрейме и вручную интерпретировать значение X / Y для щелчка, чтобы определить, находится ли он в некотором ограничении. регион (в случае кнопки с закругленными краями скорее всего будет состоять из результата проверки 4 кругов и 2 прямоугольников)

Edit: Понимая часть вашего первоначального вопроса, я заметил, что вы упомянули, что хотите обрабатывать функцию автоматически на основе альфа-канала. Хотя я бы порекомендовал мой метод ограничения областей, теоретически вы могли бы добиться этого путем выборки PNG для проверки альфа-канала со значением, смещенным на начало координат кнопки. Возможно даже сделать это в обычном событии нажатия кнопки.

5 голосов
/ 13 октября 2009

Прямоугольные кнопки относятся к типу кнопок, вы можете использовать пользовательский тип кнопок и назначить изображение, чтобы избавиться от прямоугольных краев кнопки ... здесь есть ссылка на типы кнопок http://developer.apple.com/iphone/library/documentation/UIKit/Reference/UIButton_Class/UIButton/UIButton.html#//apple_ref/doc/c_ref/UIButtonType и на UIButton http://developer.apple.com/iphone/library/documentation/UIKit/Reference/UIButton_Class/UIButton/UIButton.html

2 голосов
/ 13 октября 2009

Как говорит Гуванте , полагаться на точные прикосновения не очень хорошая идея. Например, Apple рекомендует, чтобы управлял как минимум 44px в .

Я бы рекомендовал использовать UIButton типа UIButtonTypeCustom, установить изображение кнопки на свой PNG и зарегистрироваться для сенсорных событий ( см. Здесь для получения дополнительной информации об обработке событий ). Затем в своем методе действия вы можете получить координаты касания события и проверить эти координаты в соответствии с альфа-изображением вашего изображения, чтобы увидеть, следует ли вам рассматривать его как «настоящее» касание или нет.

1 голос
/ 22 ноября 2016

@ Право на использование drawRect для реализации пользовательской формы для кнопки.

Но лучше метод для проверки касания внутри или не внутри кнопки используется

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event;

Вы можете создать свою кнопку прозрачной для касаний в некоторых частях.

Если вы не можете использовать пользовательское изображение для кнопки (например, если рисуете текст на кнопке), вы можете использовать новый метод , чтобы нарисовать иерархию подпредставлений в изображение:

 - (BOOL)drawViewHierarchyInRect:(CGRect)rect afterScreenUpdates:(BOOL)afterUpdates;
1 голос
/ 22 октября 2009

Другим вариантом может быть разбиение кнопки на несколько прямоугольных частей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...