Swift实战

Swift学习也快有一个月了。文章也写了不少。今天来发布一个小DEMO。当操刀练手了。

主要写一个小控件,实现功能是类拟IPHONE手机打开AppStore 中的详细信息中的内容,先显示一部分,点击更多时,再加载完成。

目前只对单文本字体作处理,对于富文本的并不行。因此作为swift的操刀之作,还算是处女作吧。。。。。

源码:

整个控件的源码在:http://download.csdn.NET/detail/fengsh998/7552229


效果:


其中这个“更多“的位置可以自行调整,当点击更多时,就会展示全部:


核心代码:

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. //more btn  
  2.   func drawMoreInRect(moreRect:CGRect)  
  3.   {  
  4.       var ctx = UIGraphicsGetCurrentContext();  
  5.       CGContextSaveGState(ctx);  
  6.   
  7.       var raduis = CGRectGetHeight(moreRect) / 2.0  
  8.   
  9.       var maxX = CGRectGetMaxX(moreRect)  
  10.       var minX = CGRectGetMinX(moreRect)  
  11.       var maxY = CGRectGetMaxY(moreRect)  
  12.       var minY = CGRectGetMinY(moreRect)  
  13.   
  14.       CGContextMoveToPoint(ctx,minX,minY)  
  15.       CGContextAddArcToPoint(ctx,maxX,minY,maxX,maxY,raduis)  
  16.       CGContextAddArcToPoint(ctx,maxX,maxY,minX,maxY,raduis)  
  17.       CGContextAddArcToPoint(ctx,minX,maxY,minX,minY,raduis)  
  18.       CGContextAddArcToPoint(ctx,minX,minY,maxX,minY,raduis)  
  19.         
  20.       CGContextClosePath(ctx)  
  21.       if selectedHightlight  
  22.       {  
  23.           CGContextSetRGBFillColor(ctx, 29/255.0, 158/255.0, 245/255.0, 1.0)  
  24.       }  
  25.       else  
  26.       {  
  27.           CGContextSetRGBFillColor(ctx, 104/255.0, 202/255.0, 248/255.0, 1.0)  
  28.       }  
  29.         
  30.       CGContextDrawPath(ctx, kCGPathFill) //根据坐标绘制路径  
  31.       CGContextRestoreGState(ctx)  
  32.   }  
  33.     
  34.   override func drawRect(rect:CGRect)  
  35.   {  
  36.       var attributedString = NSMutableAttributedString(string: self.text)  
  37.       let len = countElements(String(self.text))  
  38.   
  39.       let fname = self.font.fontName  
  40.        
  41.       //String convert to CFString  
  42.       //let cfstr : CFString = reinterpretCast(fname.withCString(getenv))  
  43.         
  44.       let mfont = self.font  
  45.         
  46.       var attributes = NSMutableDictionary()  
  47.         
  48.       attributes.setObject(mfont,forKey:kCTFontAttributeName)  
  49.   
  50.       attributedString.addAttributes(attributes,range:NSMakeRange(0,len))  
  51.   
  52.       self.attributedText = attributedString;  
  53.         
  54.       var framesetter = CTFramesetterCreateWithAttributedString(attributedString)  
  55.         
  56.       var Path = CGPathCreateMutable()  
  57.         
  58.       var rectWidth = self.bounds.size.width  
  59.         
  60.       CGPathAddRect(Path, nil ,CGRectMake(0,0,rectWidth,CGFLOAT_MAX))  
  61.         
  62.       var frame = CTFramesetterCreateFrame(framesetter, CFRangeMake(0,0), Path, nil)  
  63.         
  64.       var rows = CTFrameGetLines(frame)  
  65.         
  66.       if let hasRows = rows?  
  67.       {  
  68.           //获取frame中的行数  
  69.           var numberOfLines = CFArrayGetCount(rows)  
  70.           //println("rows = \(numberOfLines)")  
  71.             
  72.           var fontLineHeight = self.font.lineHeight  
  73.             
  74.           var textOffset = self.font.ascender  
  75.             
  76.           var ctx = UIGraphicsGetCurrentContext()  
  77.           CGContextSaveGState(ctx)  
  78.           //距左上位置设置  
  79.           CGContextTranslateCTM(ctx, 0, 0)  
  80.           CGContextSetTextMatrix(ctx, CGAffineTransformMakeScale(1,-1))  
  81.             
  82.           for var lineNumber=0; lineNumber<numberOfLines; lineNumber++  
  83.           {  
  84.               var onlyline = CFArrayGetValueAtIndex(rows, lineNumber)  
  85.               var flush : Double = 0.0  
  86.                 
  87.               var onlycline :CTLine = reinterpretCast(onlyline)  
  88.                 
  89.               var penOffset = CTLineGetPenOffsetForFlush(onlycline, flush, rect.size.width)  
  90.   
  91.               CGContextSetTextPosition(ctx, penOffset, textOffset);  
  92.                 
  93.               //println("第\(lineNumber)行\(onlycline)")  
  94.               //获取第onlycline行中的字形数  
  95.               //var nums = CTLineGetGlyphCount(onlycline)  
  96.               //println("本行的字符数\(nums)")  
  97.                 
  98.               if let mp = morepoint  
  99.               {  
  100.                   var posline = mp.row  
  101.                   var posclm = mp.column  
  102.                     
  103.                   var bool_lastline = (posline == numberOfLines - 1) ? true : false  
  104.                     
  105.                   if lineNumber == posline && !self.expand  
  106.                   {  
  107.                       var truncatedString = NSAttributedString(string: "\u2026")  
  108.                       var token = CTLineCreateWithAttributedString(truncatedString)  
  109.                         
  110.                       var range = CTLineGetStringRange(onlycline)  
  111.                       var maxlengthInline = range.length  
  112.   
  113.                       posclm = min(posclm,maxlengthInline)  
  114.                         
  115.                       //获取onlycline中一黄有几个CTRun, 一般情况下,一行中只有一个CTRun  
  116.                       var runs = CTLineGetGlyphRuns(onlycline)  
  117.                       var runsNums = CFArrayGetCount(runs)  
  118.                         
  119.                       var rw = 0.0  
  120.                       var rh = 0.0  
  121.                       var rowx = 0.0  
  122.                       var rowy = 0.0  
  123.                       if runsNums > 0  
  124.                       {  
  125.                           //将COpaquePointer 转为CTRun  
  126.                           var run :CTRun = reinterpretCast(CFArrayGetValueAtIndex(runs, 0))  
  127.                           //println("run = \(run)")  
  128.                           var runrange = CFRange(location: 0,length:(posclm == 0) ? 1 : posclm )  
  129.                           //println("runrange = \(runrange.length)")  
  130.                           var runsrect = CTRunGetImageBounds(run, ctx, runrange)  
  131.                           //println("runsrect = \(runsrect)")  
  132.                           rw = min(runsrect.size.width,rectWidth-40)  
  133.                           rh = runsrect.size.height  
  134.                           rowx = runsrect.origin.x  
  135.                           rowy = runsrect.origin.y  
  136.                       }  
  137.                         
  138.                       var newline = CTLineCreateTruncatedLine(onlycline, rw, CTLineTruncationType.End, token)  
  139.                       CTLineDraw(newline, ctx)  
  140.                         
  141.                       var linerect = CGRectMake(rowx,rowy,0,0)  
  142.                       if newline  
  143.                       {  
  144.                           linerect = CTLineGetImageBounds(newline,ctx)  
  145.                       }  
  146.                       //println("本行文字占的rect\(linerect)")  
  147.                         
  148.                       //rh = min(rh,16)  
  149.                       //rh = max(rh,10)  
  150.                       rh = 16.0  
  151.                         
  152.                       moreBtnRect = CGRectMake(linerect.origin.x,  
  153.                           linerect.origin.y - rh + 3,40,rh)  
  154.                         
  155.                       self.drawMoreInRect(moreBtnRect!)  
  156.                         
  157.                       var moretextrect = CGRectMake(moreBtnRect!.origin.x + rh/2+3, moreBtnRect!.origin.y+2,  
  158.                           moreBtnRect!.size.width - rh, moreBtnRect!.size.height)  
  159.                       var moretext : NSString = "更多"  
  160.                       moretext.drawInRect(moretextrect, withFont: UIFont.systemFontOfSize(10))  
  161.                         
  162.                       break  
  163.                   }  
  164.               }  
  165.   
  166.               CTLineDraw(onlycline, ctx)  
  167.                 
  168.               textOffset += fontLineHeight  
  169.           }//end for  
  170.   
  171.           CGContextRestoreGState(ctx);  
  172.             
  173.           var contentRect = CGRectMake(self.frame.origin.x, self.frame.origin.y, self.bounds.size.width, round(textOffset-self.font.ascender))  
  174.             
  175.           //println("contentRect = \(contentRect)")  
  176.           if contentRect.size.height > self.bounds.size.height  
  177.           {  
  178.               dispatch_async(dispatch_get_main_queue(), {  
  179.                   self.viewFrameChangeBlock(self,contentRect)  
  180.                   })  
  181.           }  
  182.             
  183.       }//end if  
  184.   }  
0
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值