Core Text系列2 - 嵌入图片

2016-05-11  本文已影响74人  离子来了

步骤

1.将一个属性字符串,添加上代理和独一无二的属性,让其称为一个单独的CTRun,这个CTRun的Rect由回调返回。
直接上代码,太晚了

//坐标系转换
        CGContextSetTextMatrix(ctx, CGAffineTransformIdentity)
        CGContextTranslateCTM(ctx, 0, self.bounds.size.height)
        CGContextScaleCTM(ctx, 1.0, -1.0)
        
        //创建绘制的区域
        let path = CGPathCreateMutable()
        CGPathAddRect(path, nil, self.bounds)
        
        // 4.创建需要绘制的文字
        let attributed =  NSMutableAttributedString(string: "估后共和国开不开vbdkaph估后共和国开不开vbdkaph😢😊😊😢⬇️😢😊😊😢⬇️😢😊😊😢⬇️😢😊😊😢⬇️😢😊😊😢⬇️😢😊😊😢⬇️😢😊😊😢⬇️😢😊😊😢⬇️😢😊😊😢⬇️😢😊😊😢⬇️😢😊😊😢⬇️😢😊😊😢⬇️😢😊😊😢⬇️😢😊😊😢⬇️😢😊😊😢⬇️😢😊😊😢⬇️😢😊😊😢⬇️😢😊😊😢⬇️😢😊😊😢⬇️😢😊😊😢⬇️😢😊😊😢⬇️😢😊😊😢⬇️😢😊😊😢⬇️😢😊😊😢⬇️😢😊😊😢⬇️😢😊😊😢⬇️😢😊😊😢⬇️😢😊😊😢⬇️😢😊😊😢⬇️😢😊😊😢⬇️😢😊😊😢⬇️😢😊😊😢⬇️😢😊😊😢⬇️😢😊😊😢⬇️😢😊😊😢⬇️😢😊😊😢⬇️😢😊😊😢⬇️😢😊😊😢⬇️😢😊😊😢⬇️😢😊😊😢⬇️😢😊😊😢⬇️😢😊😊😢⬇️😢😊😊😢⬇️😢😊😊😢⬇️😢😊😊😢⬇️😢😊😊😢⬇️😢😊😊😢⬇️😢😊😊😢⬇️😢😊😊😢⬇️😢😊😊😢⬇️😢😊😊😢⬇️😢😊😊😢⬇️😢😊😊😢⬇️😢😊😊😢⬇️😢😊😊😢⬇️😢😊😊😢⬇️😢😊😊😢⬇️😢😊😊😢⬇️😢😊😊😢⬇️😢😊😊😢⬇️😢😊😊😢⬇️😢😊😊😢⬇️这是我的第一个coreText demo,我是要给兵来自老白干I型那个饿哦个呢给个I类回滚igkhpwfh 评估后共和国开不开vbdkaphphohghg 的分工额好几个辽宁省更怕hi维护你不看hi好人佛【井柏然把饿哦个😢😊😊😢⬇️");
        
        attributed.addAttribute(NSFontAttributeName, value: UIFont.systemFontOfSize(20), range: NSMakeRange(0, 5));
        
        attributed.addAttribute(NSForegroundColorAttributeName, value: UIColor.redColor(), range: NSMakeRange(3, 10));
        
        attributed.addAttribute(NSForegroundColorAttributeName, value: UIColor.orangeColor(), range: NSMakeRange(0, 2));
        
        //创建段落属性
        let paraStyle = NSMutableParagraphStyle()
        
        attributed.addAttribute(NSParagraphStyleAttributeName, value: paraStyle, range: NSMakeRange(0, attributed.length))
        
        
        //添加图片的逻辑 start
        let drawImageName = "page1.jpg"
       
        var runCallBack = CTRunDelegateCallbacks(version: kCTRunDelegateVersion1, dealloc: { (r) in
            print("ctRunDelegate is die")
            }, getAscent: { (r) -> CGFloat in
                return 100
            }, getDescent: { (r) -> CGFloat in
                return 0
            }) { (width) -> CGFloat in
                return 50
        }
        
    
        var runDelegateFlag = "runDelegateDlag"
        let ctRunDelegate =  CTRunDelegateCreate(&runCallBack, &runDelegateFlag)
        
        let picAttribute  = NSMutableAttributedString(string: " ")
        
        picAttribute.addAttribute((kCTRunDelegateAttributeName as String), value: ctRunDelegate!, range: NSMakeRange(0, 1))
        picAttribute.addAttribute("imageName", value: drawImageName, range: NSMakeRange(0, 1))
        
        attributed.insertAttributedString(picAttribute, atIndex: 60)
        //添加图片的逻辑end
        
       let ctFrameSetter = CTFramesetterCreateWithAttributedString(attributed)
        
        let ctFrame = CTFramesetterCreateFrame(ctFrameSetter, CFRangeMake(0, attributed.length), path, nil)
        
        CTFrameDraw(ctFrame, ctx)
        
        let lines = CTFrameGetLines(ctFrame) as NSArray
        var originsArray = Array<CGPoint>(count: lines.count, repeatedValue: CGPointZero)//用于存储每一行的坐标
        
        CTFrameGetLineOrigins(ctFrame, CFRangeMake(0, 0), &originsArray)
    
        
        for line in lines {
            var lineAscent:CGFloat      = 0
            var lineDescent:CGFloat     = 0
            var lineLeading:CGFloat     = 0
            CTLineGetTypographicBounds(line as! CTLine, &lineAscent, &lineDescent, &lineLeading)
            
            
           let runs = CTLineGetGlyphRuns(line as! CTLine) as NSArray
            
            for (index,run) in runs.enumerate() {
                var runAscent:CGFloat      = 0
                var runDescent:CGFloat     = 0
                var runLeading:CGFloat     = 0
                let lineOrigin             = originsArray[index]
                
               let width =  CTRunGetTypographicBounds(run as! CTRun, CFRangeMake(0, 0), &runAscent, &runDescent, &runLeading)
                /*
                 下面这个计算runRect的记住就行
                 */
                let runX = lineOrigin.x + CTLineGetOffsetForStringIndex(line as! CTLine, CTRunGetStringRange(run as! CTRun).location, nil)
                let runY = lineOrigin.y - runDescent
                let runRect = CGRect(x: runX, y: runY, width: CGFloat(width), height: runDescent+runAscent)
                
                let runAttributes = CTRunGetAttributes(run as! CTRun) as NSDictionary
                
                let imagename = runAttributes.objectForKey("imageName")
                
                if let imageN = imagename {
                    let image = UIImage(named: imageN as! String)
                    let imagebouns = CGRect(x: runRect.origin.x, y: runRect.origin.y, width: runRect.size.width, height: runRect.size.height)
                    CGContextDrawImage(ctx, imagebouns, image?.CGImage)
                }
                
                
            }
        }
上一篇下一篇

猜你喜欢

热点阅读