Bucket Place/IOS Swift

[Swift] 여러줄 입력을 받기 위한 TextView 그리고 TextView Placeholder

Cloud Travel 2015. 5. 31. 17:39

이 글은 본 블러그(destiny738,tistory.com)의 관리자인 Cloud Travel이 작성하였으며, 이후 이익창출에 사용될 수도 있는 글입니다. 본 글의 저작권 역시 본 블러그의 관리자가 가지고 있습니다. 본 글을 무단 복제, 사용, 인용, 변경 등은 사전에 블러그 관리자에게 문의 바랍니다. 이를 어길 경우 법적제제를 받거나 형사고발을 당할 수 있으니 주의하시기 바랍니다. Contact : create738@bucketplace.net / create738@naver.com



1. 여는글


 사용자의 입력을 여러줄에 걸쳐서 보여주기 위해서는 TextView사용이 불가피하다. TextField는 항상 1줄만 나오기 때문이다. TextView에는 자체적인 Padding값이 존재하기 때문에 어떻게 보면 그렇게 적합하지 않을 수도 있다. 그렇기 때문에 TextView의 Padding을 삭제해주는 것부터 사작하자. 


 TextView에는 Placeholder가 존재하지 않기 때문에 사용자에게 Input창이라는 느낌을 주기가 힘들다. 어떻게 하면 이를 해결 할 수 있을까? Padding을 삭제한뒤에 Placeholder를 생성하는 법에 대해서 알아보자.



2. Padding값을 없에고 Input에 최적화를 시켜보자.


textView.textContainer.maximumNumberOfLines = 0

textView.textContainer.lineFragmentPadding = 0

textView.textContainerInset = UIEdgeInsetsZero

 maximumNumberOfLines는 Textview가 보여줄 수 있는 최대한의 줄을 설정한다. Input을 무한으로 받을 경우에는 0으로 작성해주는 것이 좋다.

 lineFragmentPadding은 문단이 나눠질때 생성되는 패딩값인데 이 또한 Input용 TextView에는 불필요한 특성이다. 따라서 0으로 설정해준다.

 Inset이 바로 Padding값이다. 이를 0으로 설정하려면 UIEdgeInsetsZero라고 설정해주면된다. 만약 내부 페딩이필요하다면  UIEdgeInsets()함수를 구현해주면 된다.


 

3. TextView Placeholder


 여러곧에서 사용하는 방법으로는 2가지가 존재한다.

 

 1) Placeholder에 맞게 글자색과 텍스트를 입력한뒤에 사용자가 입력을 시작하면 텍스트를 모두 삭제하고 글자색을 변경해준다.

 이 방법에는 몇가지 걸리는 점이 있다. 첫번째는 Input창에 사용자가 처음으로 클릭하기 전에만 Placeholder가 보여진다. 사용자가 모든 내용을 지우고 다른 곳으로 이동을 하면 보이지 않게 된다.


 2) TextView위에 Label을 겹쳐서 생성한 뒤에 hidden값을 변경해준다.

 이 방법은 위에서 발견한 문제를 해결할 수 있다. Label에 존재하는 Placeholder와 같이 작동할 수 있다. 하지만 Text를 타이핑할때마다 길이를 확인해야 하는 불편함이 있다. 이 불편함은 성능 문제이지만 요즘 핸드폰에는 문제가 없으므로 이 방법을 추천한다. 그리고 이 글에서는 이 방법에 대해서만 설명할 것이다.


 TextView 위에 Label을 올려놓고 Placeholder의 모습으로 생성해줍니다. 그 다음 아래의 순서에 맞춰서 설정해봅시다.


 1) UITextViewDelegate를 추가한다.

 2) textViewDidChange 함수를 아래와 같이 구현해준다.

   func textViewDidChange(textView: UITextView) {        

        if textView.text == "" {

            placeHolderLabel.hidden = false

        } else {

            placeHolderLabel.hidden = true

        }

    }

   

 

4. 마치는 글


 노트북이 종료되기 직전이기 때문에... 대충대충 쓴 느낌이 상당하지만, 많이 쉬운 부분이고 누구나 생각할 수 있다고 보는 해결책이기 때문이다. 다음주에는 베터리 충전기도 가져와서 좀더 느긋하게 조금 심도 깊게 살펴보도록 하겠다.