iOS
来源:互联网 发布:office mac 汉化补丁 编辑:程序博客网 时间:2024/06/05 14:31
UITextView继承于UIScrollView,所以它也是一个可滚动控件。UITextView是我们开发过程中显示多行文本的首选,它支持显示大量文本内容,并且支持使用自定义样式信息和编辑功能。
首先我们创建一个UITextView,并设置部分属性
class ViewController: UIViewController { lazy var textView: UITextView = { let tv = UITextView() // 背景颜色 tv.backgroundColor = UIColor.gray // 文本内容 tv.text = "患难可以试验一个人的品格;非常的境遇才可以显出非常的气节;,风平浪静的海面,所有的船只都可以并驱竞争;命运的铁拳击中要害的时候,只有大勇大智的人才能够处之泰然。——莎士比亚" // 文本颜色 tv.textColor = UIColor.white // 文本字体大小 tv.font = UIFont.systemFont(ofSize: 18.0) // 文本对齐方式 tv.textAlignment = .center return tv }() override func viewDidLoad() { super.viewDidLoad() addTextView() } func addTextView() { view.addSubview(textView) textView.snp.makeConstraints { (make) in make.left.top.right.bottom.equalToSuperview().inset(50) } }}
效果如下:
常用属性
是否可以选中操作
textView.isSelectable = true
默认是true,可以选中,一旦设置为false,将不能够进行选中操作,默认可选中效果
富文本,可以通过设置attributedText属性设置文本样式,如:
// 创建可变属性字符串 let attribute = NSMutableAttributedString(string: textView.text) // 设置段落样式 let paragraphStyle = NSMutableParagraphStyle() paragraphStyle.alignment = .center paragraphStyle.lineSpacing = 10 // 设置属性字典 let dic = [NSAttributedStringKey.foregroundColor: UIColor.red, NSAttributedStringKey.font: UIFont.boldSystemFont(ofSize: 22.0), NSAttributedStringKey.paragraphStyle: paragraphStyle] // 添加属性字典 attribute.addAttributes(dic, range: NSMakeRange(16, textView.text.count - 16)) // 设置textView的attributedText textView.attributedText = attribute
输入视图
func addInputVeiw() { let inputView = UIView(frame: CGRect(x: 0, y: 0, width: view.bounds.size.width, height: 200)) inputView.backgroundColor = UIColor.red textView.inputView = inputView}
输入键盘附属视图
func addInputAccessoryView(){ let inputAccessoryView = UIView(frame: CGRect(x: 0, y: 0, width: view.bounds.size.width, height: 100)) inputAccessoryView.backgroundColor = UIColor.red textView.inputAccessoryView = inputAccessoryView}
获得焦点后选中现有文本内容,输入内容时清除当前选中文本内容
textView.clearsOnInsertion = true
文本内容与边界的间距
textView.textContainerInset = UIEdgeInsetsMake(20, 20, 20, 20)
设置光标颜色
textView.tintColor = UIColor.red
代理函数
对于textView的输入进行监听,我们经常设置delegate,相关方法如下:
extension ViewController: UITextViewDelegate { //将要开始编辑 func textViewShouldBeginEditing(_ textView: UITextView) -> Bool { return true } //将要开始编辑 func textViewShouldEndEditing(_ textView: UITextView) -> Bool { return true } //已经开始编辑 func textViewDidBeginEditing(_ textView: UITextView) { } //结束编辑 func textViewDidEndEditing(_ textView: UITextView) { } //文本将要改变 func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool { return true } //文本发生改变 func textViewDidChange(_ textView: UITextView) { } //焦点发生改变 func textViewDidChangeSelection(_ textView: UITextView) { } //是否允许对文本中的URL进行操作 func textView(_ textView: UITextView, shouldInteractWith URL: URL, in characterRange: NSRange) -> Bool { return true } //是否允许对文本中的富文本进行操作 func textView(_ textView: UITextView, shouldInteractWith textAttachment: NSTextAttachment, in characterRange: NSRange) -> Bool { return true }}通知
extension NSNotification.Name { public static let UITextViewTextDidBeginEditing: NSNotification.Name public static let UITextViewTextDidChange: NSNotification.Name public static let UITextViewTextDidEndEditing: NSNotification.Name}
常用功能
1)UITextView显示边框
textView.layer.borderColor = UIColor.cyan.cgColortextView.layer.borderWidth = 2.0
2)根据textView的内容计算textView的大小,参考
首先设置textView不可滚动,否则每次换行都会滚动一下
func addTextView() { view.addSubview(textView) textView.snp.makeConstraints { (make) in make.left.top.right.equalToSuperview().inset(50) make.height.equalTo(40) } textView.isScrollEnabled = false}
然后在文本改变的代理方法中计算
//文本发生改变 func textViewDidChange(_ textView: UITextView) { let fixedWidth = textView.frame.size.width let newSize = textView.sizeThatFits(CGSize(width: fixedWidth, height: CGFloat.infinity)) //更新高度约束 textView.snp.updateConstraints { (make) in make.height.equalTo(newSize.height) } }
3)限制文字输入的个数,参考这里
func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool { if(textView.text.count > 20 && range.length == 0) { print("Please summarize in 20 characters or less") return false } return true}
或者使用如下方法进行更准确控制,输入到最大数量之后无法输入:
func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool { let selectedRange = textView.markedTextRange var pos: UITextPosition? = nil if let _sel = selectedRange { pos = textView.position(from: _sel.start, offset: 0) } if selectedRange != nil, pos != nil { let startOffset = textView.offset(from: textView.beginningOfDocument, to: selectedRange!.start) if startOffset < maxCount { return true } else { return false } } let comcatStr = (textView.text as NSString).replacingCharacters(in: range, with: text) let canInputLen = maxCount - comcatStr.length if canInputLen >= 0 { return true } else { let len = text.length + canInputLen let rg = NSRange.init(location: 0, length: max(len, 0)) if rg.length > 0 { var s = "" if text.canBeConverted(to: .ascii) { s = (text as NSString).substring(with: rg) } else { var idx = 0 var trimString = "" (text as NSString).enumerateSubstrings(in: NSRange(location: 0, length: text.length), options: .byComposedCharacterSequences, using: { (subString, _, _, stop) in if idx >= rg.length { stop.pointee = true return } trimString = (trimString as NSString).appending(subString ?? "") idx += 1 }) s = trimString } textView.text = (textView.text as NSString).replacingCharacters(in: range, with: s) } return false } } func textViewDidChange(_ textView: UITextView) { let selectedRange = textView.markedTextRange var pos: UITextPosition? = nil if let _sel = selectedRange { pos = textView.position(from: _sel.start, offset: 0) } if selectedRange != nil, pos != nil { return } let textViewText: String = textView.text let existTextNum = textViewText.length if existTextNum > maxCount { let s = (textViewText as NSString).substring(to: maxCount) textView.text = s } }
4)添加默认文字placeholder
方法一,添加一个label,通过监听是否输入内容来控制是否显示
首先创建一个label
lazy var palceholderLabel: UILabel = { let label = UILabel(frame: CGRect(origin: CGPoint(x: 5, y: 5), size: CGSize.zero)) label.text = "input some..." label.textColor = UIColor.lightGray label.sizeToFit() return label }()添加到textView上
textView.addSubview(palceholderLabel)根据输入的内容控制是否显示
func textViewDidChange(_ textView: UITextView) { palceholderLabel.isHidden = !textView.text.isEmpty}
其他的方式,可以看这里
5)自定义选择内容菜单栏
我们再看新闻的时候,常常在点选文字后会弹出菜单进行选择,复制等操作。这里我们也可以自己在菜单栏上添加一些其他内容,比如:分享到朋友圈,邮件。
func customMenu() { let mail = UIMenuItem(title: "邮件", action: #selector(ViewController.onMail)) let weixin = UIMenuItem(title: "分享到朋友圈", action: #selector(ViewController.shareToWeiChat)) let menu = UIMenuController() menu.menuItems = [mail,weixin] } @objc func onMail(){ print("mail") } @objc func shareToWeiChat(){ print("shareToWeiChat") }
6)使用textView显示html内容,参考
func addHtml() { let htmlString = "<html>" + "<head>" + "<style>" + "body {" + "background-color: rgb(230, 230, 230);" + "font-family: 'Arial';" + "text-decoration:none;" + "}" + "</style>" + "</head>" + "<body>" + "<h1>A title</h1>" + "<p>A paragraph</p>" + "<b>bold text</b>" + "</body></head></html>" let htmlData = NSString(string: htmlString).data(using: String.Encoding.unicode.rawValue) let options = [NSAttributedString.DocumentReadingOptionKey.documentType: NSAttributedString.DocumentType.html] let attributedString = try! NSAttributedString(data: htmlData!, options: options, documentAttributes: nil) textView.attributedText = attributedString }
7)获取选中的文本内容
//焦点发生改变 func textViewDidChangeSelection(_ textView: UITextView) { if let selectedRange = textView.selectedTextRange { let selectedText = textView.text(in: selectedRange) } }
8)修改光标的位置,主要是对selectedRange属性进行修改,设置开始的位置,如,从第三个文字开始显示光标
textView.selectedRange = NSRange(location: 3, length: 0)textView.becomeFirstResponder()
阅读全文
0 0
- iOS
- iOS
- IOS
- iOS
- iOS
- IOS
- ios
- iOS
- iOS
- IOS
- iOS
- ios
- ios ~~~~~
- ios
- IOS
- IOS
- IOS
- ios
- Java 匿名内部类
- 阻止360浏览器拖拽链接打开新的页面
- codeforces 895E Eyes Closed 线段树 期望 数学
- jsp里怎么获取function里的值 在input里用
- 1.一个RestFul的helloworld
- iOS
- Mac Android Studio SVN配置
- FMDB使用
- 一次CMS GC问题排查过程(理解原理+读懂GC日志)
- Java继承关系是否合理的判别
- 基数排序(c)
- Mybatis 多对一关联
- 用magent+repcache搭建memcache集群和主备缓存
- ajax的使用