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

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

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

源码:

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


效果:


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


核心代码:

[cpp] view plain copy
  1. //morebtn
  2. funcdrawMoreInRect(moreRect:CGRect)
  3. {
  4. varctx=UIGraphicsGetCurrentContext();
  5. CGContextSaveGState(ctx);
  6. varraduis=CGRectGetHeight(moreRect)/2.0
  7. varmaxX=CGRectGetMaxX(moreRect)
  8. varminX=CGRectGetMinX(moreRect)
  9. varmaxY=CGRectGetMaxY(moreRect)
  10. varminY=CGRectGetMinY(moreRect)
  11. CGContextMovetoPoint(ctx,minX,minY)
  12. CGContextAddArcToPoint(ctx,maxX,minY,maxY,raduis)
  13. CGContextAddArcToPoint(ctx,raduis)
  14. CGContextClosePath(ctx)
  15. ifselectedHightlight
  16. {
  17. CGContextSetRGBFillColor(ctx,29/255.0,158/255.0,245/255.0,1.0)
  18. }
  19. else
  20. CGContextDrawPath(ctx,kCGPathFill)//根据坐标绘制路径
  21. CGContextRestoreGState(ctx)
  22. overridefuncdrawRect(rect:CGRect)
  23. varattributedString=NSMutableAttributedString(string:self.text)
  24. letlen=countElements(String(self.text))
  25. letfname=self.font.fontName
  26. //StringconverttoCFString
  27. //letcfstr:CFString=reinterpretCast(fname.withCString(getenv))
  28. letmfont=self.font
  29. varattributes=NSMutableDictionary()
  30. attributes.setobject(mfont,forKey:kCTFontAttributeName)
  31. attributedString.addAttributes(attributes,range:NSMakeRange(0,len))
  32. self.attributedText=attributedString;
  33. varframesetter=CTFramesetterCreateWithAttributedString(attributedString)
  34. varPath=CGPathCreateMutable()
  35. varrectWidth=self.bounds.size.width
  36. CGPathAddRect(Path,nil,CGRectMake(0,rectWidth,CGFLOAT_MAX))
  37. varframe=CTFramesetterCreateFrame(framesetter,CFRangeMake(0,0),Path,nil)
  38. varrows=CTFrameGetLines(frame)
  39. iflethasRows=rows?
  40. //获取frame中的行数
  41. varnumberOfLines=CFArrayGetCount(rows)
  42. //println("rows=\(numberOfLines)")
  43. varfontLineHeight=self.font.lineHeight
  44. vartextOffset=self.font.ascender
  45. varctx=UIGraphicsGetCurrentContext()
  46. CGContextSaveGState(ctx)
  47. //距左上位置设置
  48. CGContextTranslateCTM(ctx,0)
  49. CGContextSetTextMatrix(ctx,CGAffineTransformMakeScale(1,-1))
  50. forvarlineNumber=0;lineNumber<numberOfLines;lineNumber++
  51. varonlyline=CFArrayGetValueAtIndex(rows,lineNumber)
  52. varflush:Double=0.0
  53. varonlycline:CTLine=reinterpretCast(onlyline)
  54. varpenOffset=CTLineGetPenOffsetForFlush(onlycline,flush,rect.size.width)
  55. CGContextSetTextPosition(ctx,penOffset,textOffset);
  56. //println("第\(lineNumber)行\(onlycline)")
  57. //获取第onlycline行中的字形数
  58. //varnums=CTLineGetGlyphCount(onlycline)
  59. //println("本行的字符数\(nums)")
  60. ifletmp=morepoint
  61. varposline=mp.row
  62. varposclm=mp.column
  63. varbool_lastline=(posline==numberOfLines-1)?true:false
  64. iflineNumber==posline&&!self.expand
  65. vartruncatedString=NSAttributedString(string:"\u2026")
  66. vartoken=CTLineCreateWithAttributedString(truncatedString)
  67. varrange=CTLineGetStringRange(onlycline)
  68. varmaxlengthInline=range.length
  69. posclm=min(posclm,maxlengthInline)
  70. //获取onlycline中一黄有几个CTRun,一般情况下,一行中只有一个CTRun
  71. varruns=CTLineGetGlyphRuns(onlycline)
  72. varrunsNums=CFArrayGetCount(runs)
  73. varrw=0.0
  74. varrh=0.0
  75. varrowx=0.0
  76. varrowy=0.0
  77. ifrunsNums>0
  78. //将copaquePointer转为CTRun
  79. varrun:CTRun=reinterpretCast(CFArrayGetValueAtIndex(runs,0))
  80. //println("run=\(run)")
  81. varrunrange=CFRange(location:0,length:(posclm==0)?1:posclm)
  82. //println("runrange=\(runrange.length)")
  83. varrunsrect=CTRunGetimageBounds(run,ctx,runrange)
  84. //println("runsrect=\(runsrect)")
  85. rw=min(runsrect.size.width,rectWidth-40)
  86. rh=runsrect.size.height
  87. rowx=runsrect.origin.x
  88. rowy=runsrect.origin.y
  89. varnewline=CTLineCreateTruncatedLine(onlycline,rw,CTLineTruncationType.End,token)
  90. CTLineDraw(newline,ctx)
  91. varlinerect=CGRectMake(rowx,rowy,153); background-color:inherit; font-weight:bold">ifnewline
  92. linerect=CTLineGetimageBounds(newline,ctx)
  93. }
  94. //println("本行文字占的rect\(linerect)")
  95. //rh=min(rh,16)
  96. //rh=max(rh,10)
  97. rh=16.0
  98. moreBtnRect=CGRectMake(linerect.origin.x,
  99. linerect.origin.y-rh+3,40,rh)
  100. self.drawMoreInRect(moreBtnRect!)
  101. varmoretextrect=CGRectMake(moreBtnRect!.origin.x+rh/2+3,moreBtnRect!.origin.y+2,
  102. moreBtnRect!.size.width-rh,moreBtnRect!.size.height)
  103. varmoretext:Nsstring="更多"
  104. moretext.drawInRect(moretextrect,withFont:UIFont.systemFontOfSize(10))
  105. break
  106. CTLineDraw(onlycline,248); line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important"> textOffset+=fontLineHeight
  107. }//endfor
  108. CGContextRestoreGState(ctx);
  109. varcontentRect=CGRectMake(self.frame.origin.x,self.frame.origin.y,self.bounds.size.width,round(textOffset-self.font.ascender))
  110. //println("contentRect=\(contentRect)")
  111. ifcontentRect.size.height>self.bounds.size.height
  112. dispatch_async(dispatch_get_main_queue(),{
  113. self.viewFrameChangeBlock(self,contentRect)
  114. })
  115. //endif
  116. }

Swift实战的更多相关文章

  1. HTML5 3D书本翻页动画的实现示例

    这是一款十分炫酷的HTML5 3D书本翻页动画,效果相对比较简单,拖拽鼠标模拟用手翻页,需要的朋友们下面随着小编来一起学习学习吧

  2. 使用postMessage让 iframe自适应高度的方法示例

    这篇文章主要介绍了使用postMessage让 iframe自适应高度的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  3. ios – UIPopoverController出现在错误的位置

    所以我花了一些时间寻找答案,但到目前为止还没有找到任何答案.我正在尝试从UIInputAccessoryView上的按钮呈现弹出窗口.UIBarButtonItem我想显示popover来自定制视图,所以我可以使用图像.我创建这样的按钮:当需要显示popover时,我这样做:但我得到的是:弹出窗口看起来很好,但它应该出现在第一个按钮上时出现在第二个按钮上.然后我发现了这个问题:UIBarButto

  4. ios – 无法在UITableViewCell的drawRect中绘制

    我在使用自定义UITableViewCell的drawRect方法时遇到了麻烦.这是我正在使用的代码我已经调试过以确保所有数值都有意义,看起来它们确实存在.无法真正找出屏幕上没有任何内容的原因.值得一提的是,这也是一个在笔尖中定义的单元格.我正在使用iOS7sdk构建.有任何想法吗?tahnks解决方法你可能不应该在UITableViewCell自己的drawRect中这样做.而是创建一个自定义UIView并将其添加为子视图.另见thisanswer.

  5. UITableView在iOS 7中,在单元格中编辑UITextView时,不滚动到正确的位置

    我有一个静态单元的表视图.一个单元格包含一个UITextView,并且heightForRowAtIndexPath:是动态计算的,因此单元格总是足够高以容纳文本(该部分在iOS7下实现了一些工作,实际上,因为不可能简单地询问textView的contentSize).当我在文本视图中点击开始编辑时,键盘动画到位,tableView上的contentInsets会自动调整,以解决这个问题(即iPh

  6. ios – 找不到金属’质地’

    随着每个基于Metal的ImageView的实现,我都面临同样的问题Valueoftype‘MTLDrawable’hasnomember‘texture’好像苹果改变了一些金属api这是我试用的全部功能:解决方法执行系统和xcode更新后,我遇到了同样的问题.在更新过程中,xcode将构建目标切换到模拟器.一旦我将目标切换回设备,它就会再次编译.

  7. ios – 计算UITextField基线位置

    我试图通过编程方式将UITextField的实例的基线与UIButton的实例对齐.我正在处理这个计算类似于here描述的方式,但是使用UITextField可以有一个偏移的内容.任何想法如何获得UITextField中的文本位置甚至更好,是否有一个更简单的方法来对齐基线?解决方法在我的经验中,与UIButton不同,UITextField在文本周围实际上并没有任何偏移.无论如何,您可以在两个控件中找出确切的文本框:

  8. ios – UISearchController不重新显示旋转导航栏

    我已经实施了UISearchController,除了…解决方法看起来UISearchController忘记在状态栏重新出现时重新设置searchBar的框架.我认为这可能是UISearchController中的一个错误;似乎有一些列在radar.似乎searchBar的超级视图最终以错误的高度.这是令人烦恼的,因为解决方案因此涉及到SearchController的视图层次结构,哪个苹果可以改变…

  9. 键盘隐藏了IOS中的文本字段

    90个我在IOS中使用带有一些文本字段的scrollview创建了一个表单.视图看起来像这样,当我开始编辑州或以下字段时,键盘会隐藏该字段.像这样,我该怎么做才能看到下面的字段?

  10. ios – 在viewDidLayoutSubviews中更改帧

    我是否需要添加某种标志来检查动画是否已经运行?

随机推荐

  1. Swift UITextField,UITextView,UISegmentedControl,UISwitch

    下面我们通过一个demo来简单的实现下这些控件的功能.首先,我们拖将这几个控件拖到storyboard,并关联上相应的属性和动作.如图:关联上属性和动作后,看看实现的代码:

  2. swift UISlider,UIStepper

    我们用两个label来显示slider和stepper的值.再用张图片来显示改变stepper值的效果.首先,这三个控件需要全局变量声明如下然后,我们对所有的控件做个简单的布局:最后,当slider的值改变时,我们用一个label来显示值的变化,同样,用另一个label来显示stepper值的变化,并改变图片的大小:实现效果如下:

  3. preferredFontForTextStyle字体设置之更改

    即:

  4. Swift没有异常处理,遇到功能性错误怎么办?

    本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

  5. 字典实战和UIKit初探

    ios中数组和字典的应用Applicationschedule类别子项类别名称优先级数据包contactsentertainment接触UIKit学习用Swift调用CocoaTouchimportUIKitletcolors=[]varbackView=UIView(frame:CGRectMake(0.0,0.0,320.0,CGFloat(colors.count*50)))backView

  6. swift语言IOS8开发战记21 Core Data2

    上一话中我们简单地介绍了一些coredata的基本知识,这一话我们通过编程来实现coredata的使用。还记得我们在coredata中定义的那个Model么,上面这段代码会加载这个Model。定义完方法之后,我们对coredata的准备都已经完成了。最后强调一点,coredata并不是数据库,它只是一个框架,协助我们进行数据库操作,它并不关心我们把数据存到哪里。

  7. swift语言IOS8开发战记22 Core Data3

    上一话我们定义了与coredata有关的变量和方法,做足了准备工作,这一话我们来试试能不能成功。首先打开上一话中生成的Info类,在其中引用头文件的地方添加一个@objc,不然后面会报错,我也不知道为什么。

  8. swift实战小程序1天气预报

    在有一定swift基础的情况下,让我们来做一些小程序练练手,今天来试试做一个简单地天气预报。然后在btnpressed方法中依旧增加loadWeather方法.在loadWeather方法中加上信息的显示语句:运行一下看看效果,如图:虽然显示出来了,但是我们的text是可编辑状态的,在storyboard中勾选Editable,再次运行:大功告成,而且现在每次单击按钮,就会重新请求天气情况,大家也来试试吧。

  9. 【iOS学习01】swift ? and !  的学习

    如果不初始化就会报错。

  10. swift语言IOS8开发战记23 Core Data4

    接着我们需要把我们的Rest类变成一个被coredata管理的类,点开Rest类,作如下修改:关键字@NSManaged的作用是与实体中对应的属性通信,BinaryData对应的类型是NSData,CoreData没有布尔属性,只能用0和1来区分。进行如下操作,输入类名:建立好之后因为我们之前写的代码有些地方并不适用于coredata,所以编译器会报错,现在来一一解决。

返回
顶部