UITextViewでのPlaceHolder（プレースホルダ）をSwiftで実装する方法

UITextField には PlaceHolder がありますが、UITextView にはありません。調べてみると、stackoberflow にまさしくのがありました。

* [Placeholder in UITextView - Stack Overflow](http://stackoverflow.com/questions/1328638/placeholder-in-uitextview)

これをSwiftで実装したらどうなるのか？ということで調べたところQiitaに

* [Swiftでtextarea](http://qiita.com/HirokiTanaka/items/e697670cb4c7c30f5764)

とありましました。これを見ながら実装してみました。

# 環境

* Xcode 6
* iOS 8

# 実装流れ

1. UITextField を継承した新しいClass を用意
1. UITextField に Custom Class として UIPlaceHolderTextView を設定
1. UITextField に placeholder を設定
1. UITextField に 文字色（UIColor）を設定

# プレビュー

![placeholder.gif](https://qiita-image-store.s3.amazonaws.com/0/21321/35d72ea3-dc96-6788-6bc2-9a16f8cfc012.gif)


# 実際のファイル

```swift:ViewController.swift
import UIKit

class ViewController: UIViewController {
    
    @IBOutlet weak var TestWebView: UIWebView!
    @IBOutlet weak var InputView: UIPlaceHolderTextView!

    override func viewDidLoad() {
        super.viewDidLoad()

        InputView.placeHolder = "本文です。"
        InputView.placeHolderColor = UIColor(red: 255, green: 0, blue: 0, alpha: 0.5)

    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
}
```

```swift:UIPlaceHolderTextView.swift
import UIKit

public class UIPlaceHolderTextView: UITextView {

    lazy var placeHolderLabel:UILabel = UILabel()
    var placeHolderColor:UIColor      = UIColor.lightGrayColor()
    var placeHolder:NSString          = ""
    
    required public init(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }

    override init(frame: CGRect){
        super.init(frame: frame)
    }

    override init() {
        super.init()
    }

    deinit {
        NSNotificationCenter.defaultCenter().removeObserver(self)
    }

    override public func awakeFromNib() {
        super.awakeFromNib()
        
        NSNotificationCenter.defaultCenter().addObserver(self, selector: "textChanged:", name: UITextViewTextDidChangeNotification, object: nil)
    }

    func setText(text:NSString) {
        super.text = text
        self.textChanged(nil)
    }

    override public func drawRect(rect: CGRect) {
        if(self.placeHolder.length > 0) {
            self.placeHolderLabel.frame           = CGRectMake(8,8,self.bounds.size.width - 16,0)
            self.placeHolderLabel.lineBreakMode   = NSLineBreakMode.ByWordWrapping
            self.placeHolderLabel.numberOfLines   = 0
            self.placeHolderLabel.font            = self.font
            self.placeHolderLabel.backgroundColor = UIColor.clearColor()
            self.placeHolderLabel.textColor       = self.placeHolderColor
            self.placeHolderLabel.alpha           = 0
            self.placeHolderLabel.tag             = 999
            
            self.placeHolderLabel.text = self.placeHolder
            self.placeHolderLabel.sizeToFit()
            self.addSubview(placeHolderLabel)
        }
        
        self.sendSubviewToBack(placeHolderLabel)
        
        if(self.text.utf16Count == 0 && self.placeHolder.length > 0){
            self.viewWithTag(999)?.alpha = 1
        }
        
        super.drawRect(rect)
    }
    
    public func textChanged(notification:NSNotification?) -> (Void) {
        if(self.placeHolder.length == 0){
            return
        }

        if(countElements(self.text) == 0) {
            self.viewWithTag(999)?.alpha = 1
        }else{
            self.viewWithTag(999)?.alpha = 0
        }
    }
    
}

```