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 不 ...
随机推荐
- 通过onTouch来确定点击的是listView哪一个item
事实上这主要是用了ListView的一个方法,通过坐标就能够确定当前是哪一个listView,别的我就不多说了直接看看代码吧, lv_flide.setOnTouchListener(new OnTo ...
- 【搜索引擎Jediael开发笔记】V0.1完整代码 2014-05-26 15:16 443人阅读 评论(0) 收藏
详细代码请见 E:\Project\[重要]归档代码\SearchEngine归档代码 或 https://code.csdn.net/jediael_lu/jediael/tree/10991c83 ...
- 学习Numpy
1.什么是numpy NumPy系统是Python的一种开源的数值计算扩展.这种工具可用来存储和处理大型矩阵,比Python自身的嵌套列表(nested list structure)结构要高效的多( ...
- Android多线程研究(7)——Java5中的线程并发库
从这一篇开始我们将看看Java 5之后给我们添加的新的对线程操作的API,首先看看api文档: java.util.concurrent包含许多线程安全.测试良好.高性能的并发构建块,我们先看看ato ...
- php 根据给定的年份和月份获取该年份该月份的起始和结束时间
function getShiJianChuo($nian=0,$yue=0){ if(empty($nian) || empty($yue)){ $now = time(); $nian = dat ...
- 体验ArcGIS9.2的历史库功能
转自原文 体验ArcGIS9.2的历史库功能 ESRI公司于2006年11月9日全球同步发布了历史上重要的软件版本ArcGIS9.2,在该版本中,主要新增了以下四大功能(ESRI田昌莲): 第一大新功 ...
- Android JNI编程(八)——体验AS2.2.2编写Jni程序、Java调C、C调Java函数、将C代码中的Log打印至Logcat
版权声明:本文出自阿钟的博客,转载请注明出处:http://blog.csdn.net/a_zhon/. 目录(?)[+] 不得不说在AS2.2以上的版本进行开发就一个字——爽,在2.0上使用jni出 ...
- C/C++ 变量的初始化
局部变量,初始化为垃圾值,局部静态变量初始化为 0: 1. 二维数组 // 作为局部变量 int arr[4]; // 全是垃圾值 int arr[4] = {1}; // 第一个元素为 1,其他默认 ...
- 【u206】最大赢家
Time Limit: 1 second Memory Limit: 128 MB [问题描述] Nic和Susan在玩一个有趣的游戏:在游戏开始前,他们先约定一个正整数n,同时令m=1.游戏过程中, ...
- $.ajax 请求 拦截器 重定向 无效 解决办法
在ajax 异步请求下 拦截器过滤器中使用 重定向 页面响应无效 我这里用的是springboot框架,用拦截器实现 对请求的拦截 ,session超时直接跳转到login.html页面. 后台代码: ...