美文网首页
Swift 为UITextView添加placeholderLa

Swift 为UITextView添加placeholderLa

作者: 黄菠菠的傅先森 | 来源:发表于2018-08-29 09:29 被阅读0次

需求

为UITextView添加placeholderLabel属性

解决方案

简单点,直接上代码

extension UITextView {

    var placeholderLabel:UILabel?{

            get{

                var label:UILabel? = objc_getAssociatedObject(self, &"placeholderLabel") as? UILabel

                if label == nil{

                    let originalText:NSAttributedString=self.attributedText

                    self.text=""

                    self.attributedText= originalText

                    label =UILabel()

                    label?.textColor=UIColor.lightGray

                    label?.numberOfLines=0

                    label?.isUserInteractionEnabled=false

                    //关联label属性

                    objc_setAssociatedObject(self, &"placeholderLabel", label, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)

                    //KVO监听TextView各属性的变化,并更新placeholderLabel

                    NotificationCenter.default.addObserver(self, selector: #selector(self.updatePlaceholderLabel), name: NSNotification.Name.UITextViewTextDidChange, object: self)

                    let observingKeys = ["attributedText",

                                         "bounds",

                                         "font",

                                         "frame",

                                         "textAlignment",    

                                         "textContainerInset"]

                    for key in observingKeys {

                        设置监听

                        self.addObserver(self, forKeyPath: key, options: .new, context:nil)

                       }

                    let hooker = DeallocHooker()

                    //通过闭包判断TextView是否dealloc,在dealloc时移除监听

                    hooker.deallocHandle= {

                        NotificationCenter.default.removeObserver(self)

                        for key in observingKeys {

                            self.removeObserver(self, forKeyPath: key)

                        }

                    }

                    objc_setAssociatedObject(self, &AssociatedKeys.deallocHooker,     hooker, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)

                }

                returnlabel

            }

        }

}

其中闭包

class DeallocHooker:NSObject{

    var deallocHandle:WillDealloc ?

    deinit {

        if deallocHandle! = nil{

            deallocHandle!()

        }

    }

}

监听TextView的属性变化

open override func observeValue(forKeyPath keyPath:String?, of object:Any?, change: [NSKeyValueChangeKey:Any]?, context:UnsafeMutableRawPointer?) {

        updatePlaceholderLabel()

}

更新placeholderLabel

@objc func updatePlaceholderLabel(){

        if self.text.count > 0{

            self.placeholderLabel?.removeFromSuperview()

            return

        }

        self.insertSubview(self.placeholderLabel!, at:0)

        self.placeholderLabel?.font = self.font

        self.placeholderLabel?.textAlignment = self.textAlignment

        let x = self.textContainer.lineFragmentPadding + self.textContainerInset.left;

        let y = self.textContainerInset.top

        let width = (self.bounds.width - x - self.textContainer.lineFragmentPadding - self.textContainerInset.right)

        letheight =self.placeholderLabel?.sizeThatFits(CGSize(width: width, height:0)).height

        self.placeholderLabel?.frame=CGRect(x: x, y: y, width: width, height: height!)

    }

使用方法:

textView.placeholderLabel?.text = "请输入XXXXXXXXX"

相关文章

网友评论

      本文标题:Swift 为UITextView添加placeholderLa

      本文链接:https://www.haomeiwen.com/subject/jtafwftx.html