Swift版UITextView自定義占位詞,最大長(zhǎng)度

最近這段時(shí)間在搞一個(gè)Swift的項(xiàng)目,算是幫朋友做的吧,雖然有點(diǎn)累但是自己也是從中學(xué)到了很多東西,其中自己也封裝了一些常用的控件,最近忙完公司的項(xiàng)目以后就整理一下自己的心得。。希望大家一起學(xué)習(xí)!

最近項(xiàng)目需要,很多的地方都用到了UITextView來(lái)實(shí)現(xiàn)一些需求,需要設(shè)置占位詞和最大的長(zhǎng)度,這里我是簡(jiǎn)單的封裝了一下,希望大家多多指正,話(huà)不多說(shuō),上代碼:

func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
        
        if text == "\n"{ // 輸入換行符時(shí)收起鍵盤(pán)
            textView.resignFirstResponder() // 收起鍵盤(pán)
            return false
        }
        
        if text != "" {
             self.placeHolderLabel.isHidden = true // 隱藏
        }
        
        let textStr = NSString.init(format: "%@", text)
        
        if textStr.isEqual(to: "") && range.length == 1 && range.location == 0 {
            self.placeHolderLabel.isHidden = false // 隱藏
        }
        
        /// 字?jǐn)?shù)統(tǒng)計(jì)
        let lengthOfString :NSInteger = textStr.length
        
        let fieldTextString : String = textV.text
        
        let proposedNewLength : Int =  fieldTextString.count - range.length + lengthOfString;
        
        maxLengthNum.text = NSString.init(format: "%ld/%ld", proposedNewLength, maxNumber) as String
        
        if proposedNewLength >= maxNumber + 1 {
            Logger.d("已到字?jǐn)?shù)限制")
            let textVStr = textV.text as NSString
            let str = textVStr.substring(to: maxNumber)
            textV.text = str
            maxLengthNum.text = NSString.init(format: "%ld/%ld", maxNumber, maxNumber) as String
            return false
        }
        return true
    }

在 UITextView的代理方法中監(jiān)聽(tīng)內(nèi)容的變化,來(lái)判斷占位詞的顯示和隱藏,設(shè)置當(dāng)前的字?jǐn)?shù)以及最大長(zhǎng)度,這里對(duì)字?jǐn)?shù)的統(tǒng)計(jì)比較重要,我是根據(jù)當(dāng)前輸入的內(nèi)容的位置來(lái)進(jìn)行計(jì)算。

全部代碼:

import UIKit

class LZHTextView: UIView, UITextViewDelegate {
    
    /** 占位詞 **/
    let placeHolderLabel = UILabel()
 
    /** 字?jǐn)?shù)限制 **/
    let maxLengthNum = UILabel()
    
    /** 最大字?jǐn)?shù) **/
    var maxNumber: NSInteger = 0
    
    /** 文本View */
    let textV = UITextView()
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        
        textV.backgroundColor = .white
        textV.returnKeyType = .done
        textV.font = APP_FONT_14_NORMAL()
        textV.textColor = .black
        textV.delegate = self
        self.addSubview(textV)
        textV.snp.makeConstraints { (make) in
            make.top.left.right.equalToSuperview()
            make.bottom.equalToSuperview().offset(-20)
        }
        
        placeHolderLabel.textColor = RGBColor(135, g: 135, b: 135)
        placeHolderLabel.font = APP_FONT_12_SAMALL()
        placeHolderLabel.isHidden = false
        textV.addSubview(placeHolderLabel)
        placeHolderLabel.snp.makeConstraints { (make) in
            make.left.equalToSuperview().offset(5)
            make.right.right.equalToSuperview()
            make.top.equalToSuperview()
            make.height.equalTo(25)
        }
        
        /// 字?jǐn)?shù)限制
        maxLengthNum.textColor = APP_Main_GrayText_COLOR
        maxLengthNum.font = APP_FONT_12_SAMALL()
        maxLengthNum.textAlignment = .center
        self.addSubview(maxLengthNum)
        maxLengthNum.snp.makeConstraints { (make) in
            make.bottom.equalToSuperview()
            make.right.equalToSuperview().offset(-10)
            make.width.equalTo(50)
            make.height.equalTo(20)
        }
    }
    
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    /**
     * 設(shè)置占位詞
     */
    func setPlaceHolder(holderStr: String) -> Void {
        placeHolderLabel.text = holderStr
    }
    
    /**
     * 設(shè)置字?jǐn)?shù)限制
     */
    func setContentMaxLength(length: NSInteger) -> Void {
        
        if length == 0 {
            maxLengthNum.isHidden = true
        } else {
            maxLengthNum.isHidden = false
            maxLengthNum.text = NSString.init(format: "0/%ld", length) as String
        }
    
        maxNumber = length
    }
    
    func textViewShouldBeginEditing(_ textView: UITextView) -> Bool {
        self.placeHolderLabel.isHidden = true // 隱藏
        return true
    }
    
    func textViewDidEndEditing(_ textView: UITextView) {
        if textView.text.isEmpty {
           self.placeHolderLabel.isHidden = false // 顯示
        }
    }
    
    func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
        
        if text == "\n"{ // 輸入換行符時(shí)收起鍵盤(pán)
            textView.resignFirstResponder() // 收起鍵盤(pán)
            return false
        }
        
        if text != "" {
             self.placeHolderLabel.isHidden = true // 隱藏
        }
        
        let textStr = NSString.init(format: "%@", text)
        
        if textStr.isEqual(to: "") && range.length == 1 && range.location == 0 {
            self.placeHolderLabel.isHidden = false // 隱藏
        }
        
        /// 字?jǐn)?shù)統(tǒng)計(jì)
        let lengthOfString :NSInteger = textStr.length
        
        let fieldTextString : String = textV.text
        
        let proposedNewLength : Int =  fieldTextString.count - range.length + lengthOfString;
        
        maxLengthNum.text = NSString.init(format: "%ld/%ld", proposedNewLength, maxNumber) as String
        
        if proposedNewLength >= maxNumber + 1 {
            Logger.d("已到字?jǐn)?shù)限制")
            let textVStr = textV.text as NSString
            let str = textVStr.substring(to: maxNumber)
            textV.text = str
            maxLengthNum.text = NSString.init(format: "%ld/%ld", maxNumber, maxNumber) as String
            return false
        }
        return true
    }
}

里面修改一些字體大小的設(shè)置以及顏色,引入SnapKit框架就可以直接用,有不足的地方還望大佬們指正。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1、通過(guò)CocoaPods安裝項(xiàng)目名稱(chēng)項(xiàng)目信息 AFNetworking網(wǎng)絡(luò)請(qǐng)求組件 FMDB本地?cái)?shù)據(jù)庫(kù)組件 SD...
    陽(yáng)明AI閱讀 16,205評(píng)論 3 119
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 15,359評(píng)論 4 61
  • 考試,明天。回想大學(xué)考試前積極備考得狀態(tài),簡(jiǎn)直天壤之別??傆X(jué)得時(shí)間不夠用,恨不得睡覺(jué)得時(shí)間都用來(lái)看書(shū),12點(diǎn)睡覺(jué),...
    壹易閱讀 331評(píng)論 0 0
  • 國(guó)慶小長(zhǎng)假腳步將近啦! 莫名有點(diǎn)小激動(dòng)╭(╯ε╰)╮ 你喜歡那一件,為什么,歡迎私撩我
    2222356閱讀 211評(píng)論 0 0

友情鏈接更多精彩內(nèi)容