티스토리 뷰

반응형


안녕하세요 :) Zedd입니다.

오늘 새로운 사실을 알아서 공부해보려고 해요. XD

일단 제가 직면한 이슈는 

버튼 2개가 있는데 이게 동시에 눌린다는 거였어요.


ㅁ ㅁ 이렇게 버튼 2개가 있다고 쳤을 때, 어떤 버튼을 눌러도 ㅁ ㅁ 두 버튼 모두 isUserInteractionEnabled를 false를 준 상태였어요.

그리고 할 일이 끝나면 이 두 버튼 모두 isUserInteractionEnabled를 다시 true로 주고..

일단 저는 두 버튼을 동시에 누른다는게 정말 생각지도 못한 이슈였어요...

아니 어떤 버튼이라도 "먼저" 눌림 당한? 게 분명히 있을거라고 생각했었는데..그게 아니었던 겁니댜,.

아무튼 각 버튼에서 하는 action들이 꼬여서 크래쉬가 나던 상황이었습니다.


그래서 아니;; 동시에 안눌리게 하는 방법 없나? 하고 찾아봤더니 isExclusiveTouch라는 프로퍼티가 있다는 것을 알게되었습니다.

나 너무 이런 기초적인걸 이제야 안건가....??? 뭐 이제라도 안게 어디...라고 생각하며 ^-^ 


아무튼 제목은 UIView > Configuring the Event-Related Behavior 인데, UIView의 documentation을 보면

이렇게 Configuring the Event-Related Behavior라고 해서 3가지 프로퍼티가 있는 것을 볼 수 있습니다.

isUserInteractionEnabled는 너무나도 익숙하죠!!

아무튼 이 3개를 같이 공부해보려고 해요.


순서대로 볼게요!


isUserInteractionEnabled



isUserInteractionEnabled는 유저의 이벤트가 event queue로 부터 무시되고 삭제됐는지 판단하는 Boolean 값입니다.

넘나 익숙하죠..?


만약 false로 set하면, view를 위한 touch, press, keyboard 그리고 focus event는 event queue에서 무시되고 삭제됩니다. 

true로 set하면 event는 정상적으로 view에게 전달됩니다. default value는 true입니다.


animation을 하는 동안에는 이 프로퍼티의 값이 뭐든간에 상관없이, user interactions은 일시적으로 disable됩니다. animation이 일어나는 view를 포함해서 말이죠. 

이를 (disable되는 거) 막고싶다면, animation option으로 allowUserInteraction을 주면 됩니다.


Note: 몇몇의 UIKit 서브클래스들이 이 프로퍼티를 override하고 다른 default value를 줄 수 있습니다(true가 아닌 false를 줄 수 있다는 말) 

대표적으로 UILabel이 있죠.


isMultipleTouchEnabled



isMultipleTouchEnabled는 view가 한번개 2개 이상의 touch를 수신하는지 여부를 나타내는 Boolean 값입니다.


true로 set하면, view는 multi-touch sequence와 관련된 모든 touch를 받고 view의 bounds에서 시작합니다.

false로 set하면, view는 오직 multi-touch sequence안에 있는 first touch event만 받습니다. default value는 false입니다.

Note: 이 프로퍼티는 view에 attach된 gesture recognizer에 영향을 끼치지 않습니다. gesture recognizer는 view에서 일어나는 모든 touch를 수신합니다.


이 프로퍼티가 false일 때, 같은 window안에있는 다른 view들이 여전히 touch event를 받을 수 있습니다. (제가 겪은 상황. 그러니까 같은 window인데, 다른 view에요. 근데 지금 둘 다!!! 둘다 touch event를 받을 수 있는거죠) 

만약 multi-touch events를 exclusively하게 다루고 싶다면, isExclusiveTouch프로퍼티와 이 프로퍼티(isMultipleTouchEnabled)를 둘다 true로 set하면 됩니다. 

이 프로퍼티는 view가 multiple touches를 처리하도록 요청되는것을 막진 않습니다. 예를들어, 두개의 subview는 아마 window나 root viewController같은 공통의 부모로 touch를 보낼것입니다. 이 프로퍼티는 view를 처음에 타겟팅 하는 touch들이 얼마나 많이 view로 전달될 것인지를 결정합니다. 



isExclusiveTouch



isExclusiveTouch는 리시버가 touch event를 exclusively하게 다룰지를 나타내는 Boolean 값입니다.

true로 set하면, 리시버가 동일한 window의 다른 view에 대한 touch event전달을 차단합니다. 이 프로퍼티의 기본값은 false입니다. 



그러니까 isExclusiveTouch를 true로 하면, 제가 위에서 이야기한 이슈를 해결 할 수 있게 됩니다. 

동일한 window안에서 어떤 view가 touch event를 전달하면 다른 view에 대한 touch event는 차단되는 것이죠.

처음에 이것만 보고 isExclusiveTouch를 true로 해서 이슈를 잘 해결했지만, isMultipleTouchEnabled에서 언급됐듯이, isMultipleTouchEnabled도 true로 set해줘야 한다고 해서..일단은 해준 상태입니다.

뭐 문서가 그러라고 하니까 그렇게 해야죠 ㅎ_ㅎ..


반응형