Как отключить обнаружение касания на UIImage?

Я работаю над приложением, которое на самом деле работает как MSPaint (что-то для рисования линий и т. д.). Я получил белый UIView, в основном там, где рисует пользователь. Поверх этого UIView я установил UIImage, серый, с альфа-каналом 0,4. Я хочу, чтобы этот UIImage использовался как промокательная бумага. Идея в том, чтобы отключить тач, когда пользователь кладет ладонь на эту область, чтобы было удобнее рисовать (мультитач отключен, а с этой "промокашкой" случайно ладонью ничего не нарисуешь... )

Даже если я перенесу UIImage на передний план, поверх представления, и даже если я отключу взаимодействие с пользователем в этом UIImage, все равно можно будет рисовать в UIView. , за UIImage (как-то странно!)

Я не понимаю, что происходит, потому что, похоже, изображение прозрачное, и что UIView "сзади" все еще активен, даже если она перекрывается UIImage?!

Любая помощь/указание/идея будет высоко оценена! Спасибо :-)


person tvincent    schedule 27.04.2012    source источник


Ответы (5)


Вы установили для свойства «userInteractionEnabled» UIImage значение «НЕТ»?

person djleop    schedule 27.04.2012
comment
Да, я так думаю... UIImage называется buvard, хорошо? (это означает промокательную бумагу по-французски), а UIView называется strokesView. Вот что я сделал: [buvard bringSubviewToFront:strokesView]; buvard.userInteractionEnabled = NO; - person tvincent; 27.04.2012
comment
UIImage не имеет свойства userInteractionEnabled. Вы думаете об UIImageView? - person bbarnhart; 27.04.2012
comment
Да, @bbarnhart, вы правы, buvard - это UIImageView, а не UIImage... извините. - person tvincent; 27.04.2012
comment
Да, это UIImageView, так как UIImage не может быть напрямую представлен на экране. - person djleop; 11.05.2012

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

В вашем случае вам нужен userInteractionEnabled, потому что вы хотите, чтобы представление улавливало эти прикосновения.

person Dancreek    schedule 27.04.2012
comment
Я понимаю, что вы имеете в виду здесь. Но если я включу взаимодействие с пользователем (с помощью построителя интерфейса, а также установлю для userInteractionEnabled значение YES), я все равно смогу рисовать за UIImageView... - person tvincent; 27.04.2012
comment
Это то, что мне нужно. Включите взаимодействие с пользователем, чтобы заблокировать его взаимодействие с кнопками за UIImageView. Спасибо! - person RanLearns; 01.09.2016

Вы должны отключить взаимодействие с пользователем в UIImageView, а не в UIImage, и это должно работать.

Редактировать:

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

Нет лучших идей, если вы не опубликуете часть своего кода...

person Norbert Bicsi    schedule 27.04.2012
comment
Моя ошибка... На самом деле, buvard - это UIImageView... но проблема остается прежней. - person tvincent; 27.04.2012
comment
Конечно, я могу показать вам, что я написал. Но это не очень интересно, ИМО: в strokesViewController.h: @property (nonatormic, retain) IBOutlet UIImageView *buvard в strokesViewController.m (в viewDidLoad): [buvard bringSubviewToFront : strokesView]; buvard.userInteractionEnabled = YES; Я пробовал то же самое с представлением, как вы предложили, но это не сработало... - person tvincent; 30.04.2012
comment
Разве вы не хотели, чтобы пользователь не мог рисовать на поверхности? разве вы не должны устанавливать для userInteractionEnabled значение «НЕТ»? - person Norbert Bicsi; 02.05.2012
comment
Мне пришлось установить его на YES, потому что иначе я не мог бы обнаружить движение на этой поверхности. Я опубликовал свой ответ... - person tvincent; 02.05.2012

Итак, мне удалось сделать то, что я хотел! УРА!

У меня есть 3 разных класса:

  • StrokesViewController (UIViewController) — контроллер представления

  • StrokesView (UIView) — вид, в котором пользователь рисует штрихи.

  • BlottingPaper (UIView) - промокательная бумага.

Я получил файл XIB, «связанный» со всеми тремя.

Я создал этот новый класс, названный «BlottingPaper», набрав UIView. файлы .h и .m на самом деле пусты (я импортирую #import ‹ Foundation/Foundation.h >) В BlottingPaper разрешено взаимодействие с пользователем. Я не использую эксклюзивный подход к этому классу.

В файле XIB я просто поместил представление поверх StrokesView. Я привязываю его к BlottingPaper (модифицирую альфу как хочу, блаблабла...)

И это все! Когда я кладу на него ладонь, он ничего не рисует в той области, где находится моя рука, но я все еще могу рисовать пальцем на остальной части StrokesView!

person tvincent    schedule 30.04.2012

В дополнение к ответу Dancreek вы должны установить buvard.userInteractionEnabled = YES; так, чтобы он фиксировал взаимодействие.

Вы также должны установить buvard.exclusiveTouch = YES;, чтобы buvard был единственным представлением, которое будет получать события касания.

Когда вы удаляете buvard, вы должны установить buvard.exclusiveTouch = NO;, чтобы другие представления восстановили свою способность получать касания.

person C4 - Travis    schedule 27.04.2012