Swift现实
swift学习也快有一个月了。文章也写了不少。今天来公布一个小DEMO。
当操刀练手了。
主要写一个小控件,实现功能是类拟IPHONE手机打开AppStore 中的具体信息中的内容,先显示一部分,点击很多其它时,再载入完毕。
眼下仅仅对单文本字体作处理,对于富文本的并不行。因此作为swift的操刀之作,还算是处女作吧。。。
。。
源代码:
整个控件的源代码在:http://download.csdn.net/detail/fengsh998/7552229
效果:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZmVuZ3NoOTk4/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />
当中这个“很多其它“的位置能够自行调整。当点击很多其它时,就会展示所有:
核心代码:
//more btn
func drawMoreInRect(moreRect:CGRect)
{
var ctx = UIGraphicsGetCurrentContext();
CGContextSaveGState(ctx); var raduis = CGRectGetHeight(moreRect) / 2.0 var 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.font var 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.width CGPathAddRect(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.lineHeight var textOffset = self.font.ascender var 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.0 var 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.row
var posclm = mp.column var bool_lastline = (posline == numberOfLines - 1) ? true : false if lineNumber == posline && !self.expand
{
var truncatedString = NSAttributedString(string: "\u2026")
var token = CTLineCreateWithAttributedString(truncatedString) var range = CTLineGetStringRange(onlycline)
var maxlengthInline = range.length posclm = min(posclm,maxlengthInline) //获取onlycline中一黄有几个CTRun, 普通情况下。一行中仅仅有一个CTRun
var runs = CTLineGetGlyphRuns(onlycline)
var runsNums = CFArrayGetCount(runs) var rw = 0.0
var rh = 0.0
var rowx = 0.0
var rowy = 0.0
if runsNums > 0
{
//将COpaquePointer 转为CTRun
var 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
}
版权声明:本文博客原创文章,博客,未经同意,不得转载。
Swift现实的更多相关文章
- swift基础:第六部分:类与对象
http://reactnative.cn/docs/0.24/getting-started.html#content(react Native 开发文档) 互联网这个时代,你松懈一天,就会有很多很 ...
- Lyft押重注于苹果编程语言Swift
Lyft押重注于苹果编程语言Swift 1年后获得丰厚回报BI中文站 8月22日报道 一年多以前,打车应用Lyft做出重大决定,决心押重注于苹果开发的编程语言Swift,用这种编程语言重写其所有iPh ...
- 【Swift学习】Swift编程之旅---ARC(二十)
Swift使用自动引用计数(ARC)来跟踪并管理应用使用的内存.大部分情况下,这意味着在Swift语言中,内存管理"仍然工作",不需要自己去考虑内存管理的事情.当实例不再被使用时, ...
- swift中的结构体和枚举
Swift 里的结构体非常特殊. 类是面向对象编程语言中传统的结构单元.和结构体相比,Swift 的类支持实现继承,(受限的)反射,析构函数和多所有者. 既然类比结构体强大这么多,为什么还要使用结构体 ...
- 在Swift中应用Grand Central Dispatch(下)
在第一部分中, 你学到了并发,线程以及GCD的工作原理.通过使用dispatch_barrrier和dispatch_sync,你做到了让 PhotoManager单例在读写照片时是线程安全的.除此之 ...
- 从0开始学Swift笔记整理(五)
这是跟在上一篇博文后续内容: --Core Foundation框架 Core Foundation框架是苹果公司提供一套概念来源于Foundation框架,编程接口面向C语言风格的API.虽然在Sw ...
- 从0开始学Swift笔记整理(二)
这是跟在上一篇博文后续内容: --函数中参数的传递引用 类是引用类型,其他的数据类型如整型.浮点型.布尔型.字符.字符串.元组.集合.枚举和结构体全部是值类型. 有的时候就是要将一个值类型参数以引用方 ...
- iOS - Swift 面向对象语法
1.面向对象 面向过程:面向过程编成将所要解决的问题按解决问题的步骤进行分析.如果是大问题,就分解成为多个不同的小问题,在程序里叫做划分成不同的模块.每一个解决的步骤可能是一行或者几行代码,也可能是一 ...
- iOS - Swift 基本语法
前言 Swift 全面支持 Unicode 符号. Swift 中的定义和实现是在同一个单元中的,通常一个 Swift 源代码单文件是以 ".Swift" 结尾的. Swift 不 ...
随机推荐
- html5-8 如何控制html5中的视频标签和音频标签
html5-8 如何控制html5中的视频标签和音频标签 一.总结 一句话总结:找到视频或者音频的element对象,然后查手册看对应的方法或者属性就可以,里面有控制的. 1.如何控制html5中的视 ...
- arcengine 开发经典帖 【强烈推荐仔细研读】
转自原文 arcengine 开发经典帖 使用ArcGIS Engine 开发自定义GIS应用: 第一部分:使用ArcGIS Engine 发布自定义GIS应用软件-全面了解ArcGIS Engine ...
- 曼德勃罗(Mandelbrot)集合与其编程实现
一.从科赫雪花谈起 设想一个边长为1的等边三角形(例如以下图所看到的).取每边中间的三分之中的一个,接上去一个形状全然类似的但边长为其三分之中的一个的三角形,结果是一个六角形.如今取六角形的每个边做相 ...
- HDU 5387 Clock(分数类+模拟)
题意: 给你一个格式为hh:mm:ss的时间,问:该时间时针与分针.时针与秒针.分针与秒针之间夹角的度数是多少. 若夹角度数不是整数,则输出最简分数形式A/B,即A与B互质. 解析: 先计算出总的秒数 ...
- Local database deployment problems and fixtures
/*By Jiangong SUN*/ After encountering some problems in deploying databases to local server, here ar ...
- 【codeforces 768B】Code For 1
[题目链接]:http://codeforces.com/contest/768/problem/B [题意] 一开始给你一个数字n; 让你用这个数字n根据一定的规则生成序列; (如果新生成的序列里面 ...
- Java Service Wrapper 使用(windows)
1 简介 最近项目中需要做一个Windows系统服务,记录一下使用过程. Java Service Wrapper 可以将Java程序包装成系统服务,这样就可以随着系统的运行而自动运行.J ...
- navigator 页面链接
页面链接. 属性名 类型 默认值 说明 url String 应用内的跳转链接 redirect Boolean false 是否关闭当前页面 hover-class String navigat ...
- JAVA SE回顾及思考(2)——数组的复制与动态扩展
我们知道在Java中数组是非基本类型既数组是对象(Object)的子类,所以用下面的这种方式是不能复制该对象的 public static void main(String[] args) { int ...
- Struts2——(8)struts2中文件的上传
通过2种方式模拟单个文件上传,效果如下所示 开发步骤如下: 1.新建一个web工程,导入struts2上传文件所需jar,如下图 目录结构 2.新建Action 第一种方式 ...