码迷,mamicode.com
首页 > 其他好文 > 详细

第一篇、Textkit的基本使用

时间:2016-08-21 16:43:56      阅读:158      评论:0      收藏:0      [点我收藏+]

标签:

 

使用:

        customLabel.text = "百度一下你就知道 http://www.baidu.com"

 

import UIKit

class JQLabel: UILabel {

     override var text: String?
        {
        didSet{
            // 1.修改textStorage存储的内容
            textStorage.setAttributedString(NSAttributedString(string: text!))
            
            // 2.设置textStorage的属性
            textStorage.addAttribute(NSFontAttributeName, value: UIFont.systemFontOfSize(20), range: NSMakeRange(0, text!.characters.count))
            
            // 3.处理URL
            self.URLRegex()
            
            // 2.通知layoutManager重新布局
            setNeedsDisplay()
        }
    }
    
    // 如果是UILabel调用setNeedsDisplay方法, 系统会促发drawTextInRect
    override func drawTextInRect(rect: CGRect) {
        // 重绘
        // 字形 ; 理解为一个小的UIView
        /*
        第一个参数: 指定绘制的范围
        第二个参数: 指定从什么位置开始绘制
        */
        layoutManager.drawGlyphsForGlyphRange(NSMakeRange(0, text!.characters.count), atPoint: CGPointZero)
    }
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        setupSystem()
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        setupSystem()
    }
    
    private func setupSystem()
    {
        // 1.将layoutManager添加到textStorage
        textStorage.addLayoutManager(layoutManager)
        // 2.将textContainer添加到layoutManager
        layoutManager.addTextContainer(textContainer)
    }
    
    override func layoutSubviews() {
        super.layoutSubviews()
        
        // 3.指定区域
        textContainer.size = bounds.size
    }
    
    // MARK: -懒加载
    /*
    只要textStorage中的内容发生变化, 就可以通知layoutManager重新布局
    layoutManager重新布局需要知道绘制到什么地方, 所以layoutManager就会文textContainer绘制的区域
    */
    
    // 准们用于存储内容的
    // textStorage 中有 layoutManager
    private lazy var textStorage = NSTextStorage()
    
    // 专门用于管理布局
    // layoutManager 中有 textContainer
    private lazy var layoutManager = NSLayoutManager()
    
    // 专门用于指定绘制的区域
    private lazy var textContainer = NSTextContainer()
    
    
    func URLRegex()
    {

        
        // 1.创建一个正则表达式对象
        do{
            let dataDetector = try NSDataDetector(types: NSTextCheckingTypes(NSTextCheckingType.Link.rawValue))
            
            let res =  dataDetector.matchesInString(textStorage.string, options: NSMatchingOptions(rawValue: 0), range: NSMakeRange(0, textStorage.string.characters.count))
            
            // 4取出结果
            for checkingRes in res
            {
                let str = (textStorage.string as NSString).substringWithRange(checkingRes.range)
                let tempStr = NSMutableAttributedString(string: str)
                
//                tempStr.addAttribute(NSForegroundColorAttributeName, value: UIColor.redColor(), range: NSMakeRange(0, str.characters.count))
                tempStr.addAttributes([NSFontAttributeName: UIFont.systemFontOfSize(20), NSForegroundColorAttributeName: UIColor.redColor()], range: NSMakeRange(0, str.characters.count))
                
                textStorage.replaceCharactersInRange(checkingRes.range, withAttributedString: tempStr)
            }
        }catch
        {
            print(error)
        }

    }
    
}

 

点击事件的处理:

import UIKit

class JQTextView: UITextView {

    
    
    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
        
        // 1.获取手指点击的位置
        let touch = (touches as NSSet).anyObject()!
        let point = touch.locationInView(touch.view)
        
        print(point)
        
        // 2.获取URL的区域
        // 注意: 没有办法直接设置UITextRange的范围
        let range = NSMakeRange(10, 20)
        // 只要设置selectedRange, 那么就相当于设置了selectedTextRange
        selectedRange = range
        
        // 给定指定的range, 返回range对应的字符串的rect
        // 返回数组的原因是因为文字可能换行
        let array = selectionRectsForRange(selectedTextRange!)
        
        for selectionRect in array{
//            let tempView = UIView(frame: selectionRect.rect)
//            tempView.backgroundColor = UIColor.redColor()
//            addSubview(tempView)

            if CGRectContainsPoint(selectionRect.rect, point)
            {
                print("点击了URL")
            }
        }
        
        
        
    }
}

 

第一篇、Textkit的基本使用

标签:

原文地址:http://www.cnblogs.com/HJQ2016/p/5792783.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!