Swift版UITextView自定义占位词,最大长度

九路 等级 786 0 0

最近这段时间在搞一个Swift的项目,算是帮朋友做的吧,虽然有点累但是自己也是从中学到了很多东西,其中自己也封装了一些常用的控件,最近忙完公司的项目以后就整理一下自己的心得。。希望大家一起学习!

最近项目需要,很多的地方都用到了UITextView来实现一些需求,需要设置占位词和最大的长度,这里我是简单的封装了一下,希望大家多多指正,话不多说,上代码:

func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {

        if text == "\n"{ // 输入换行符时收起键盘
            textView.resignFirstResponder() // 收起键盘
            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 // 隐藏
        }

        /// 字数统计
        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("已到字数限制")
            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的代理方法中监听内容的变化,来判断占位词的显示和隐藏,设置当前的字数以及最大长度,这里对字数的统计比较重要,我是根据当前输入的内容的位置来进行计算。

全部代码:

import UIKit

class LZHTextView: UIView, UITextViewDelegate {

    /** 占位词 **/
    let placeHolderLabel = UILabel()

    /** 字数限制 **/
    let maxLengthNum = UILabel()

    /** 最大字数 **/
    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)
        }

        /// 字数限制
        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")
    }

    /**
     * 设置占位词
     */
    func setPlaceHolder(holderStr: String) -> Void {
        placeHolderLabel.text = holderStr
    }

    /**
     * 设置字数限制
     */
    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"{ // 输入换行符时收起键盘
            textView.resignFirstResponder() // 收起键盘
            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 // 隐藏
        }

        /// 字数统计
        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("已到字数限制")
            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
    }
} 

里面修改一些字体大小的设置以及颜色,引入SnapKit框架就可以直接用,有不足的地方还望大佬们指正。

收藏
评论区

相关推荐

Swift 简介
Swift和ObjectiveC的主要区别 1,编程范式 Swift可以面向协议编程、函数式编程、面向对象编程。 Swift语言引入了协议、协议的扩展、泛型等新特性,因此使用Swift语言可以很好地面向协议编程;Swift语言将函数和闭包提升为语言的一等公民,函数可以作为一个变量、可以作为其他函数的参数、作为其他函数的返回值等来传递,所以
Swift版UITextView自定义占位词,最大长度
最近这段时间在搞一个Swift的项目,算是帮朋友做的吧,虽然有点累但是自己也是从中学到了很多东西,其中自己也封装了一些常用的控件,最近忙完公司的项目以后就整理一下自己的心得。。希望大家一起学习! 最近项目需要,很多的地方都用到了UITextView来实现一些需求,需要设置占位词和最大的长度,这里我是简单的封装了一下,希望大家多多指正,话不多说,上代码:
【Swift】Swift 2.0 到 Swift 3.0
问: 报错:The “Swift Language Version” (SWIFT\_VERSION) build setting must be set to a supported value for targets which use Swift. This setting can be set in the build settings editor
Swift - Music 程序分析
本文主要分享下楼主在学习Swift编程过程中,对GitHub上的一个开源App Swift Music的研究心得。 (https://imghelloworld.osscnbeijing.aliyuncs.com/a47a2684664
UIWebView(1)
一、UIWebView的一些官方提醒: 1、除了可以展示HTML外,还可以展示Keynote, PDF, Pages documents, 但是在官方提示,最好的展示富文本的方式是UITextView 文档:For the best rendering of plain and rich text in your app, however, you s
Swift
在oc中有NSMutableString和NSString两种类型的字符串,但在swift中分别在定义的时候使用let和var来代表是否可以操作。let和var也通用于其他类型。使用let修饰的为不可变,使用var修饰的可变。 //使用var修饰可以动态的改变值 var varStr = "nihao"
Swift Module Interfaces
前言 -- 今天看到一篇讲 **Swift Crash** 的文章[一个 Swift Crash 引发的讨论...](https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMzI2NTAxMzg2MA%3D%3D%26mid%3D22
Swift3.0对AFNetworking的封装 附demo
> 由于最新的**[Alamofire](https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fgithub.com%2FAlamofire%2FAlamofire)**网络框架只支持Swift 3.0, 现在还有一大部分开发者 在项目中用OC于Swift混编的方式,所以就用最新的Swift 3.
Swift学习第一练——用Swift实现的FlappyBird小游戏
用Swift实现的FlappyBird小游戏 ----------------------       伴随着apple公司对swift的推广态度深入,swift火的很快,并且swift精简便捷的语法和强大的功能,对于使用Object—C开发iOS的开发者来说,也有必要了解学习一下swift。这篇博客跳过swift干涩的语法,直接从一个小游戏项目开始使用s
Swift学习第二练——Swift项目时光电影
Swift学习第二练——Swift项目时光电影 -----------------------     很早以前的一个OC的练习项目,用swift重新写了一遍,因为xcode版本的更新对swift的兼容度也在不断改变,此版本适用于xcode6.1。     这个项目中,用swift将iOS官方SDK中的HTTP进行了封装,使用了swift编写的异步加载网
Swift解读专题四——字符串与字符
Swift解读专题四——字符串与字符 ------------------ ### 一、引言         Swift中提供了String类型与Characters类型来处理字符串和字符数据,Swift中的String类型除了提供了许多方便开发者使用的方法外,还可以与Foundation框架的NSString类进行转换,使用起来十分方便。 ### 二
Swift讲解专题七——函数
Swift讲解专题七——函数 -------------- ### 一、引言         函数是有特定功能的代码段,函数会有一个特定的名称调用时来使用。Swift提供了十分灵活的方式来创建与调用函数。事实上在Swift,每个函数都是一种类型,这种类型由参数和返回值来决定。Swift和Objective-C的一大区别就在于Swift中的函数可以进行嵌套
Swift讲解专题九——枚举
Swift讲解专题九——枚举 -------------- ### 一、引言         在Objective-C语言中,没有实际上是整型数据,Swift中的枚举则更加灵活,开发者可以不为其分配值类型把枚举作为独立的类型来使用,也可以为其分配值,可以是字符,字符串,整型或者浮点型数据。 ### 二、枚举语法         Swift中enum关
swift
不用xib创建时,需要重写 override init(collectionViewLayout layout: UICollectionViewLayout){} 在调用时需传 UICollectionViewLayout值,不然就会报错 let layout = UICollectionViewFlowLayout.init()
systemLayoutSizeFittingSize
转:[https://www.crifan.com/ios\_layout\_systemlayoutsizefittingsize/](https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fwww.crifan.com%2Fios_layout_systemlayoutsizefittingsi