当前位置: > > > Swift - 多行文本输入框(UITextView)的用法

Swift - 多行文本输入框(UITextView)的用法

(本文代码已升级至Swift4)

1,多行文本控件的创建
let textview = UITextView(frame:CGRect(x:10, y:100, width:200, height:100))
textview.layer.borderWidth = 1  //边框粗细
textview.layer.borderColor = UIColor.gray.cgColor //边框颜色
self.view.addSubview(textview)

2,是否可编辑
textview.isEditable = false

3,内容是否可选
textview.isSelectable = false

4,属性font设置字体,textColor设置字体颜色,textAlignment设置对齐方式 

5,给文字中的电话号码和网址自动加链接
textview.dataDetectorTypes = [] //都不加链接
textview.dataDetectorTypes = UIDataDetectorTypes.phoneNumber //只有电话加链接
textview.dataDetectorTypes = UIDataDetectorTypes.link //只有网址加链接
textview.dataDetectorTypes = UIDataDetectorTypes.all //电话和网址都加
6,自定义选择内容后的菜单
我们在看新闻或小说的时候,常常在点选文字后会弹出菜单进行选择,复制等操作。我们可以在这个菜单上添加一些其他内容,如加上“邮件”“微信”等按钮选项

import UIKit

class ViewController: UIViewController {
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let textview = UITextView(frame:CGRect(x:10, y:100, width:200, height:100))
        textview.layer.borderWidth = 1  //边框粗细
        textview.layer.borderColor = UIColor.gray.cgColor //边框颜色
        self.view.addSubview(textview)
        
        let mail = UIMenuItem(title: "邮件", action: #selector(ViewController.onMail))
        let weixin = UIMenuItem(title: "微信", action: #selector(ViewController.onWeiXin))
        let menu = UIMenuController()
        menu.menuItems = [mail,weixin]
    }
    
    @objc func onMail(){
        print("mail")
    }
    
    @objc func onWeiXin(){
        print("weixin")
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
}
评论12
  • 12楼
    2017-11-14 17:29
    尾巴

    @objc func onMail(){
    print("mail")
    }
    @objc func onWeiXin(){
    print("weixin")
    }
    swift4里面自动纠正成了这样

    站长回复

    多谢你的提醒,代码现已更新。

  • 11楼
    2017-02-15 23:17
    ClydeSHenry

    站长求助,有没有什么办法可以修改UITextView的行间距呢?有的第三方字体在软件中使用的话会显得很挤!谢谢!

    站长回复

    要通过NSAttributedString来设置,我这几天刚好会写篇相关文章,你可以关注下。

  • 10楼
    2016-11-07 00:09
    骑毛驴上高速

    为什么我在#selector那里按钮这样写会报错呢?

    站长回复

    我有测试了下是没问题的啊。还有你检查下Xcode是不是还没升级成8.0。

  • 9楼
    2016-07-21 15:02
    Hero1223

    let mail = UIMenuItem(title: "邮件", action: "onMail")
    航哥,这句代码会警告!
    /Users/zyy/Desktop/屏幕快照 2016-07-21 下午3.02.13.png

    站长回复

    多谢提醒,这个代码写的比较早,后来Swift语法有变。现已修正。

  • 8楼
    2016-06-06 18:05
    Gavin

    航哥,我想在UITextView插入图片之后,让光标换行,或者换两行,让接下来的编辑是在图片下两行里重头输入,有什么办法吗,另外能不能把UITextView里的NSAttributedString转换成html上传给服务器呢

    站长回复

    图文混排我原来也没做过,暂时帮不了你了。不过我后面会找时间研究下,有结果的话到时写篇相关文章。

  • 7楼
    2016-05-26 19:15
    csb--

    请教一下:我有一个textviiew,里面内容很多,出了纵向滚动条,怎么能让textview第一次显示的时候,显示最上面,而不是显示最下面呢

    站长回复

    textview默认情况下不管文字多少都是显示最上面的内容的啊。也就滚动条本来就在最上面,而不是最下面。

  • 6楼
    2016-05-13 11:09
    YZStyle

    我想在TextView中显示不可编辑文本,像文档或者小说一样,但是换行符和首行缩进等功能都没办法用,请问该如何解决?

    站长回复

    试试这个:

    let comment_message_style = NSMutableParagraphStyle()
    comment_message_style.firstLineHeadIndent = 24.0
    comment_message_style.headIndent = 0.0 
    let comment_message_indent = NSMutableAttributedString(string:
        "欢迎访问: \nwww.hangge.com\n做最好的开发者知识平台!做最好的开发者知识平台!做最好的开发者知识平台!做最好的开发者知识平台!")
    comment_message_indent.addAttribute(NSParagraphStyleAttributeName,
                                        value: comment_message_style,
                                        range: NSMakeRange(0, comment_message_indent.length))
    self.textView.attributedText = comment_message_indent

  • 5楼
    2016-05-06 15:28
    幻丶无痕

    如果 我想点击链接的时候跳转到 APP内的 UIWebView 界面怎么做,有没有什么代理方法之类的

    站长回复

    有的,使用UITextViewDelegate代理的shouldInteractWithURL方法可以在链接点击的时候实现拦截,然后你可以做自己想要的操作。

    //展示文本框链接点击响应
    func textView(textView: UITextView, shouldInteractWithURL URL: NSURL,
                  inRange characterRange: NSRange) -> Bool {
        print(URL)
        return false
    }

  • 4楼
    2016-03-31 23:24
    newBlash

    我一个文本框要他在可编辑和不可编辑之间切换要怎么做?

    站长回复

    修改editable属性即可:textView.editable = false 表示不可以编辑。为true表示可以编辑。

  • 3楼
    2016-03-02 16:35
    啊啊啊

    let menu = UIMenuController() 这里报错了 请问下为什么恩??
    错误:swift[3204:934090] *** Assertion failure in -[UIMenuController init], /BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKit_Sim/UIKit-3512.30.14/UIMenuController.m:97

    站长回复

    我又测试了下是没问题的,不太清楚你报错的原因。

  • 2楼
    2016-02-20 08:19
    学前班

    刚刚入门学习,不太清楚 UITextInput 和 UITextView、UITextField 这些框架的区别?好像 Hangle 也没有一篇关于 UITextInput 的文章?另外问一下 iOS 能否实现调用听写功能(不调出键盘)。一直在跟着 Hangge 的文章自学,很感谢 Hangge !

    站长回复

    ios输入组件只有UITextField和UITextView,区别前者是单行文本框后者是多行文本框。(而UITextInput是协议不是控件)
    听写功能指的是语音输入吗,目前苹果没有开发系统语音输入的api,只能通过键盘实现语音输入。

  • 1楼
    2015-10-20 09:45
    pycoming

    代码的错误很多,再者,效果出不来

    站长回复

    多谢提醒,有些文章写得比较早,现在Swfit2改了许多语法。现已修正,如果还发现其他文章有问题可以给我留言。