Swift现实
swift學習也快有一個月了。文章也寫了不少。今天來公布一個小DEMO。
當操刀練手了。
主要寫一個小控件,實現功能是類擬IPHONE手機打開AppStore 中的具體信息中的內容,先顯示一部分,點擊很多其它時,再載入完畢。
眼下僅僅對單文本字體作處理,對于富文本的并不行。因此作為swift的操刀之作,還算是處女作吧。。。
。。
源代碼:
整個控件的源代碼在:http://download.csdn.net/detail/fengsh998/7552229
效果:
當中這個“很多其它“的位置能夠自行調整。當點擊很多其它時,就會展示所有:
核心代碼:
//more btnfunc drawMoreInRect(moreRect:CGRect){var ctx = UIGraphicsGetCurrentContext();CGContextSaveGState(ctx);var raduis = CGRectGetHeight(moreRect) / 2.0var maxX = CGRectGetMaxX(moreRect)var minX = CGRectGetMinX(moreRect)var maxY = CGRectGetMaxY(moreRect)var minY = CGRectGetMinY(moreRect)CGContextMoveToPoint(ctx,minX,minY)CGContextAddArcToPoint(ctx,maxX,minY,maxX,maxY,raduis)CGContextAddArcToPoint(ctx,maxX,maxY,minX,maxY,raduis)CGContextAddArcToPoint(ctx,minX,maxY,minX,minY,raduis)CGContextAddArcToPoint(ctx,minX,minY,maxX,minY,raduis)CGContextClosePath(ctx)if selectedHightlight{CGContextSetRGBFillColor(ctx, 29/255.0, 158/255.0, 245/255.0, 1.0)}else{CGContextSetRGBFillColor(ctx, 104/255.0, 202/255.0, 248/255.0, 1.0)}CGContextDrawPath(ctx, kCGPathFill) //依據坐標繪制路徑CGContextRestoreGState(ctx)}override func drawRect(rect:CGRect){var attributedString = NSMutableAttributedString(string: self.text)let len = countElements(String(self.text))let fname = self.font.fontName//String convert to CFString//let cfstr : CFString = reinterpretCast(fname.withCString(getenv))let mfont = self.fontvar attributes = NSMutableDictionary()attributes.setObject(mfont,forKey:kCTFontAttributeName)attributedString.addAttributes(attributes,range:NSMakeRange(0,len))self.attributedText = attributedString;var framesetter = CTFramesetterCreateWithAttributedString(attributedString)var Path = CGPathCreateMutable()var rectWidth = self.bounds.size.widthCGPathAddRect(Path, nil ,CGRectMake(0,0,rectWidth,CGFLOAT_MAX))var frame = CTFramesetterCreateFrame(framesetter, CFRangeMake(0,0), Path, nil)var rows = CTFrameGetLines(frame)if let hasRows = rows?{//獲取frame中的行數var numberOfLines = CFArrayGetCount(rows)//println("rows = \(numberOfLines)")var fontLineHeight = self.font.lineHeightvar textOffset = self.font.ascendervar ctx = UIGraphicsGetCurrentContext()CGContextSaveGState(ctx)//距左上位置設置CGContextTranslateCTM(ctx, 0, 0)CGContextSetTextMatrix(ctx, CGAffineTransformMakeScale(1,-1))for var lineNumber=0; lineNumber<numberOfLines; lineNumber++{var onlyline = CFArrayGetValueAtIndex(rows, lineNumber)var flush : Double = 0.0var onlycline :CTLine = reinterpretCast(onlyline)var penOffset = CTLineGetPenOffsetForFlush(onlycline, flush, rect.size.width)CGContextSetTextPosition(ctx, penOffset, textOffset);//println("第\(lineNumber)行\(onlycline)")//獲取第onlycline行中的字形數//var nums = CTLineGetGlyphCount(onlycline)//println("本行的字符數\(nums)")if let mp = morepoint{var posline = mp.rowvar posclm = mp.columnvar bool_lastline = (posline == numberOfLines - 1) ? true : falseif lineNumber == posline && !self.expand{var truncatedString = NSAttributedString(string: "\u2026")var token = CTLineCreateWithAttributedString(truncatedString)var range = CTLineGetStringRange(onlycline)var maxlengthInline = range.lengthposclm = min(posclm,maxlengthInline)//獲取onlycline中一黃有幾個CTRun, 普通情況下。一行中僅僅有一個CTRunvar runs = CTLineGetGlyphRuns(onlycline)var runsNums = CFArrayGetCount(runs)var rw = 0.0var rh = 0.0var rowx = 0.0var rowy = 0.0if runsNums > 0{//將COpaquePointer 轉為CTRunvar run :CTRun = reinterpretCast(CFArrayGetValueAtIndex(runs, 0))//println("run = \(run)")var runrange = CFRange(location: 0,length:(posclm == 0) ?1 : posclm ) //println("runrange = \(runrange.length)") var runsrect = CTRunGetImageBounds(run, ctx, runrange) //println("runsrect = \(runsrect)") rw = min(runsrect.size.width,rectWidth-40) rh = runsrect.size.height rowx = runsrect.origin.x rowy = runsrect.origin.y } var newline = CTLineCreateTruncatedLine(onlycline, rw, CTLineTruncationType.End, token) CTLineDraw(newline, ctx) var linerect = CGRectMake(rowx,rowy,0,0) if newline { linerect = CTLineGetImageBounds(newline,ctx) } //println("本行文字占的rect\(linerect)") //rh = min(rh,16) //rh = max(rh,10) rh = 16.0 moreBtnRect = CGRectMake(linerect.origin.x, linerect.origin.y - rh + 3,40,rh) self.drawMoreInRect(moreBtnRect!) var moretextrect = CGRectMake(moreBtnRect!.origin.x + rh/2+3, moreBtnRect!.origin.y+2, moreBtnRect!.size.width - rh, moreBtnRect!.size.height) var moretext : NSString = "很多其它" moretext.drawInRect(moretextrect, withFont: UIFont.systemFontOfSize(10)) break } } CTLineDraw(onlycline, ctx) textOffset += fontLineHeight }//end for CGContextRestoreGState(ctx); var contentRect = CGRectMake(self.frame.origin.x, self.frame.origin.y, self.bounds.size.width, round(textOffset-self.font.ascender)) //println("contentRect = \(contentRect)") if contentRect.size.height > self.bounds.size.height { dispatch_async(dispatch_get_main_queue(), { self.viewFrameChangeBlock(self,contentRect) }) } }//end if }
版權聲明:本文博客原創文章,博客,未經同意,不得轉載。
總結
- 上一篇: Android开发UI之Fragment
- 下一篇: freemarke之TemplateDi