Как да деактивирам разпознаването на докосване на UIImage?

Работя върху приложение, което всъщност работи като MSPaint (нещо за рисуване на линии и т.н.). Имам бял UIView, основно там, където потребителят рисува. Върху този UIView настроих UIImage, който е сив, с 0,4 алфа. Искам това UIImage да се използва като попивателна хартия. Идеята е да се деактивира докосването, когато потребителят постави дланта на ръката си върху тази област, така че да е по-удобно за рисуване (мултитъчът е деактивиран и с тази "попивателна хартия" няма да нарисувате нещо случайно с дланта си... )

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

Не разбирам какво се случва, защото изглежда, че изображението е прозрачно и че UIView „отзад“ все още е активен, дори ако тя е покрита от UIImage?!

Всяка помощ/индикация/идея ще бъде много оценена! Благодаря ти :-)


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


Отговори (5)


Задали ли сте свойството "userInteractionEnabled" на UIImage на "NO"?

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 и трябва да работи.

Редактиране:

Или може да сте подъл и просто да добавите празен изглед върху него. Използвайте същия размер на рамката, така че да се припокрива перфектно и това е всичко. Ще можете да видите всичко, от което се нуждаете, и това не е негов подизглед, така че няма да има взаимодействие и докосванията ще се регистрират, но няма да имат ефект. :P

Няма по-добри идеи, освен ако не публикувате част от кода си...

person Norbert Bicsi    schedule 27.04.2012
comment
Моя грешка...Всъщност buvard е UIImageView...но проблемът си остава същият. - person tvincent; 27.04.2012
comment
Разбира се, мога да ви покажа какво съм написал. Но не е наистина интересно, IMO: в 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
Трябваше да го настроя на ДА, защото в противен случай не можех да открия движение на тази повърхност. Публикувах отговора си... - 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 (променете алфата, както искам, blablabla...)

И това е! Когато поставя дланта на ръката си върху него, той не рисува нищо върху областта, където е ръката ми, но все още мога да рисувам с пръст върху останалата част от 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