티스토리 뷰

반응형

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

UIMenuController글을 어제 썼는데, 이어서 쓰려고 했는데 그냥 새로씀

뭔가 저는 발행된 글에 이어쓰는게 잘 안되더라구요 새 글을 쓰는게 뭔가 편-안하달까 

ㅋ_ㅋ;;;; 


UIMenuController (2)



UIMenuController글을 쓰고 나서 문득 이런생각이 들었습니다.

TextField나 TextView를 클릭? 탭하면 UIMenuController가 이미 뜨잖아요?

거기에 내 menuItem을 추가해주고 싶다면!?!?!??!?! 이걸 어떻게 할 수 있을것인가가 궁금해져씀


ㅇㅋㅇㅋ

해봅시당



일단 뭐 TextView로 해볼까요? 




TextView에 기본적으로 달려있는 UIMenuController입니다.

아 참고로 저 UIMenuController의 언어?가 지금 영어인데, 한국어로 나오게 하고싶어!!! 한다면 

info.plist에 가셔서Localization native development region을 Korea로 바꾸어 주세요.




그러면



한국어로 나오게됨.

암튼 여기에 내 UIMenuItem을 추가하고싶어..!! 또는 대체?하고 싶어!라고 하면 어떻게 할 수 있을까요.

저 editing menu가 TextView를 한번 탭하면 나오잖아요? 그러니까 textViewDidBeginEditing에 나만의 메뉴를 추가해주고, UIMenuController는 싱글톤이니..여기에 추가해줘봅시다.




 func textViewDidBeginEditing(_ textView: UITextView) {

        let menuItem = UIMenuItem(title: "Zedd", action: #selector(zeddDidTap))

        UIMenuController.shared.menuItems = [menuItem]

  }




그러고 실행하면..!!!



짠!!


아예 내꺼로 대체되지는 않고, 추가가 되네요. 




ㅇㅋㅇㅋ..원래껄 없애고 내꺼만 하는 방법은..잘 모르겠네요. 어떻게 해도 원래꺼는 나옴...ㅋ_ㅋ...

아신다면 알려주세요


+)

연화님께서 방법을 알려주셨습니다.,,그저 빛...


Q : TextView또는 TextField에서 선택, 복사, 모두 선택 등이 안나오고 

오직!!!!!! 오직 내 menuItem만 나왔으면 좋겠다!!!!!!!!!!!


A :

1일단 기본 TextView나 TextField로는 안되는 것 같고? 

UITextView나 UITextField를 상속받는 커스텀 클래스를 하나 만들어줍니다. 



 class ZeddTextView: UITextView {

 

}


그리고 canPerformAction를 override해야하는데요,


class ZeddTextView: UITextView {

    override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool {

        return (action == #selector(zeddDidTap))

    }


    @objc

    func zeddDidTap() {

        print("zeddDidTap")

    }

}


action이 내가 지정한 action이 아니라면 모두 false를 리턴해줍니다.

저는 일단 하나라 저렇게 했지만 여러개이면 if ~~ 를 여러개 써서 해주세요.

== 내가 지정한 selector이외에는 모두 false를 시켜주면 됨 ㅇㅇ



@IBOutlet weak var textView: ZeddTextView!


...


func textViewDidBeginEditing(_ textView: UITextView) {

        let menu = UIMenuItem(title: "Zedd", action: #selector(ZeddTextView.zeddDidTap))

        UIMenuController.shared.menuItems = [menu]

}

   


내 UIMenuItem의 selector를 제 커스텀 TextView안에 있는 zeddDidTap를 호출하도록 해주세요.


그렇게해주면..!!




이렇게...!!!!!!!!! 저만의 UIMenuItem들만 뜨게 됩니다. 

갸앙

감사합니다 ..ㅎㅎ



암튼 다음으로 넘어가봅시다. arrowDirection!!


UIMenuController에는 arrowDirection이라는 프로퍼티가 있는데요, 

정의는 editing menu의 화살표가 가리키는 방향이에요. 



기본값은 default에요.

UIMenuController 첫번째 글에서도 언급했다 시피, 메뉴포인터는 editing menu는 보통 타겟 사각형 위에 나타나지만, 공간이 충분하지 않은 경우 아래에 나타날 수 도 있어요. < 바로 이게 기본값입니다. 


근데 임의로 제가 방향을 줄 수 있는 것 같죠?

일단 해봅시다.


일단 어제처럼...view를 중앙에 놓고 default를 제외한 나머지를 넣어봅시다 :)

원래 TextView그대로 놓고 ㅠㅠㅠ 해볼려고했는데, TextView는 뭔가 문제인건지 방향을 넣어줘도 안바뀌네요 ㅜㅜㅜ

그래서 어제처럼 View를 가운데에 놓고 해보겠습니다...



이게 up, down이렇게 나와있잖아요? 뭔가 up이면 왼쪽그림처럼 위쪽에 나와야 할거같고 down이면 오른쪽 그림처럼 아래에 나와야 할 것 같지만,

반대로 왼쪽 그림이 down이고, 오른쪽 그림이 up입니다!


어떤것이 이 이름을 결정하는지 감이 오시나요? XD

바로 메뉴 포인터가 아래를 가리키면 down.

위를 가리키면 up입니다..!!!






그럼 이거 한번 해볼까요.

어느게 left고 어느게 right일까요!!?

왼쪽 그림의 메뉴 포인터가 왼쪽을 가리키고 있으니 left고 

오른쪽 그림이 오른쪽을 가리키고 있으니 right입니다.

아시겠죠?!?!






Notifications은 말그대로 Notifications인데요,



이런 아이들이 있습니다. 

그냥 이름만 봐도 언제 불릴지;;;알 것 같죠?

이건 따로 설명은 안할게요. 이름이 너무 직관적이라;;;



아래 처럼 사용하시면 됩니다 :)



NotificationCenter.default.addObserver(self, selector: #selector(zeddDidTap), name: UIMenuController.willShowMenuNotification, object: nil)



이렇게 UIMenuController에 대해서 조금 더 깊숙히?...알아봤는데요!

도움이 되었길 바래요 XD


이런...Edit Menu 대한 HIG 있었군요...

HIG 빼먹을 없지;;;;;;;


사람들은 TextField, TextView, WebView 또는 ImageView에서 요소를 누르고 잡고 두번 탭하여 내용을 선택하고, 복사 붙혀넣기와 같은 편집 옵션을 표시 있습니다.


  • 현재 컨텍스트에 적절한 명령을 표시하세요. 기본적으로 옵션에는 잘라내기, 복사, 붙혀넣기, 선택, 모두 선택 및 삭제 명령이 포함되며, 이 중 일부는 선택적으로 비활성화 할 수 있습니다. 아무것도 선택하지 않으면, 복사 또는 잘라내기와 같이 옵션이 메뉴에 표시되지 않아야 합니다. (지금도 텍스트를 선택하지 않는 이상 복사, 잘라내기 등은 안나오고 선택, 모두 선택 등만 나오죠?) 마찬가지로,  이미 항목이 선택되어 있는 경우, 메뉴에 선택 옵션이 없어야 합니다.

  • 필요한 경우, 편집 옵션의 배치를 조정하세요. 기본적으로 메뉴는 사용 가능한 공간에 다라, 삽입 포인트 또는 선택 항목 위나 아래에 배치되며, 관련 내용에 대한 포인터가 포함됩니다. 메뉴의 모양을 변경할 수는 없지만, 위치를 구성할 수 있으므로(위에서 배운 arrowDirection이겠죠?) 중요한 내용이나 인터페이스 부분을 덮어쓰지 못하게 할 수 있습니다.

  • editing menu와 동일한 기능을 가진 다른 컨트롤을 구현하지 마세요. 작업을 시작하는데에 여러가지 방법을 제공하면 일관성 없는 사용자 경험이 발생하고, 혼동을 초래 할 수 있습니다. 예를들어 앱에서 메뉴를 사용하여 콘텐츠를 복사 할 수 있게 하는 경우, 복사 버튼도 구현하지 마세요.

  • 잠재적으로 유용한 편집불가능한 텍스트틀 선택하고 선택하고 복사할 수 있습니다. 사람들은 종종 이미지 label이나 소셜미디어 상태와 같은 정적 콘텐츠를 이메일, 메모장 또는 웹 검색에 추가하기를 원합니다.

  • 버튼에 editing option을 추가하지 마세요. 이렇게 하면 옵션을 표시하려는 사용자가 버튼을 활성화하게 됩니다.

  • editing작업을 실행취소가 가능하게 만드세요. 메뉴는 동작이 수행되기 전에 확인을 요구하지 않습니다. 누군가 작업을 수행한 후에 마음을 바꿀 수 있기 때문에, 항상 실행취소(undo)와 다시 실행(redo)지원을 구현하세요.

  • 유용한 사용자 정의 명령으로 editing option을 확장하세요. 앱 관련 추가 명령을 제공하여 가치를 높일 수 있습니다. 표준 명령과 마찬가지로 모든 사용자 지정 명령은 선택한 텍스트나 object에서 작동해야합니다.

  • 시스템 제공 명령 다음에 사용자 정의 명령을 표시하세요. (헉.................)  사용자 정의 명령을 자주 사용되는 시스템 제공 명령으로 중첩하지 마세요.

  • 사용자 지정 명령의 수를 최소화하세요. 너무 많은 선택으로 사람들을 어쩔줄 모르게 하지 마세요.

  • 사용자 지정 명령이름을 짧게 유지하세요. 명령 이름은 수행 할 동사 또는 짧은 동사구여야 합니다. title-style의 대문자 사용(기사를 제외한 모든 단어를 대문자로 만들고, 접속사를 조정하고, 4자 이하의 전치사를 사용)

오 이렇게 Edit menu에 대한 HIG를 봤는데요, 역시 HIG는 짱이야..
가장 중요한 건 시스템 제공 명령 다음에!!!!! 사용자 정의 명령을 표시하라는 것!



반응형

'iOS' 카테고리의 다른 글

iOS ) PhotoKit (1)  (0) 2018.10.27
iOS ) Social 사용해보기  (2) 2018.10.24
iOS ) UIMenuController  (6) 2018.10.13
iOS ) Typographical Concepts  (2) 2018.10.09
iOS ) OptimizationTips (Writing High-Performance Swift Code)  (6) 2018.09.20