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 不 ...
随机推荐
- iOS开发webView的使用一
#import "ViewController.h" @interface ViewController () @property (weak, nonatomic) IBOutl ...
- iOS开发之Quarz2D:九:图形上下文矩阵操作
#import "VCView.h" @implementation VCView - (void)drawRect:(CGRect)rect { // Drawing code ...
- jquery画图插件jPainter
jquery画图插件jPainter 一.总结 一句话总结:四年前的项目,四年无更新,不好用. 二.基于HTML5 Canvas和jQuery 的画图工具的实现 简介 HTML5 提供了强大的Canv ...
- Activity 调用Service的方法
一般来说,Activity调用Service 分为两种:进程内调用和进程间调用.进程内调用时比较常用的一种,在进程内调用中我们常常使用的是bindService来启动Service(关于这种启动方式的 ...
- Android的事件分发
1. Touch事件和绘制事件的异同之处 Touch事件和绘制事件非常相似,都是由ViewRoot派发下来的,可是不同之处在绘制事件是由应用中的某个View发起请求,一层一层上传到ViewRoot.再 ...
- 标准模板库(STL) map —— 初始化问题
map 容器没有:.reverse成员: map 是关联式容器,会根据元素的键值自动排序: map 容器不是连续的线性空间: 标准 STL 使用 RB-tree 为底层机制 ⇒ 自动排序(关于键值): ...
- 【前端统计图】echarts实现单条折线图
五分钟上手: 图片.png <!DOCTYPE html> <html> <head> <meta charset="utf-8"> ...
- C++对象模型——对象成员的效率 (Object Member Efficiency)(第三章)
3.5 对象成员的效率 (Object Mem ber Efficiency) 以下某个測试,目的在測试聚合(aggregation).封装(encapsulation),以及继承(Inheritan ...
- Redis Service
https://raw.githubusercontent.com/MSOpenTech/redis/3.0/Windows%20Service%20Documentation.md
- Android 实现Xmpp工具类
/** * XMPP服务器连接工具类. * * @author chen.lin * */ public class XmppManager { private static final String ...