swift ios开发教程swift语言中touches.anyObject()错误

当前位置 & &
& 苹果开发者快来 Swift语言全新博客推出
苹果开发者快来 Swift语言全新博客推出
10:09:02&&作者:
编辑:随心 &&)
让小伙伴们也看看:
文章观点支持
当前平均分:0(0 次打分)
[07-12][07-12][07-11][07-11][07-11][07-11][07-11][07-11][07-11][07-11]
登录驱动之家
没有帐号?
用合作网站帐户直接登录站长之家()6月24日消息 Swift语言的发布让很多苹果开发者们高兴了一把,Swift语言的简单易用让苹果应用的开发变得不再那么&高大上&。不过Swift语言真的这么好吗?
&简单易用&无疑是一把双刃剑,Swift语言的出现大大降低了苹果应用的开发门槛,这样一来越来越多的开发者涌入了iOS开发领域。据外媒统计显示,未来一年内iOS开发者们的薪酬将大幅度降低。&人满为患&导致了App Store上的应用泛滥,开发者们真的得哭死了,而这样一来最终的受益者只有苹果公司呐!
这样看来,苹果公司推出Swift语言的目的不外乎就是降低开发门槛,吸引更多的开发者,从而获得&泛滥成灾&的&廉价&甚至是&免费&的iOS应用。
总而言之,Swift语言大热的最大受益者无疑是苹果公司了。反之,对于iOS开发者们来说,&高薪&一词指不定哪天就彻底被剥离了!
更多Swift语言相关信息可查看:
作者:站长之家
编辑:雪萍
猜你喜欢:
最新图文资讯
合作媒体专栏
1253万专栏热度
9099评论数
作者相关文章
增值电信业务经营许可证: 闽B2-号 - 北京公安局网监中心备案号: 95号 -
(C)CopyRight 2002- Inc All Rights Reserved. 站长之家 版权所有您所在的位置: &
Swift语言iOS开发:CALayer十则示例(3)
Swift语言iOS开发:CALayer十则示例(3)
Raywenderlich
Raywenderlich
如你所知,我们在iOS应用中看到的都是视图(view),包括按钮视图、表视图、滑动条视图,还有可以容纳其他视图的父视图等。
示例 #7:CATiledLayer
CATiledLayer以图块(tile)为单位异步绘制图层内容,对超大尺寸图片或者只能在视图中显示一小部分的内容效果拔群,因为不用把内容完全载入内存就可以看到内容。
处理绘制有几种方法,一种是重写UIView,使用CATiledLayer绘制图块填充视图背景,如下:
&import&UIKit&&class&ViewController:&UIViewController&{&&&@IBOutlet&weak&var&tiledBackgroundView:&TiledBackgroundView!&&}&&&import&UIKit&&class&TiledBackgroundView:&UIView&{&&let&sideLength&=&CGFloat(50.0)&&&override&class&func&layerClass()&-&&AnyClass&{&return&CATiledLayer.self&}&&&required&init(coder&aDecoder:&NSCoder)&{&super.init(coder:&aDecoder)&srand48(Int(NSDate().timeIntervalSince1970))&let&layer&=&self.layer&as&CATiledLayer&let&scale&=&UIScreen.mainScreen().scale&layer.contentsScale&=&scale&layer.tileSize&=&CGSize(width:&sideLength&*&scale,&height:&sideLength&*&scale)&}&&&override&func&drawRect(rect:&CGRect)&{&let&context&=&UIGraphicsGetCurrentContext()&var&red&=&CGFloat(drand48())&var&green&=&CGFloat(drand48())&var&blue&=&CGFloat(drand48())&CGContextSetRGBFillColor(context,&red,&green,&blue,&1.0)&CGContextFillRect(context,&rect)&}&&}&
代码解释:
tiledBackgroundView位于 (150, 150) ,宽高均为300。
重写layerClass(),令该视图创建的图层实例为CATiledLayer。
设置rand48()的随机数种子,用于在drawRect()中生成随机颜色。CATiledLayer类型转换,缩放图层内容,设置图块尺寸,适应屏幕。
重写drawRect(),以随机色块填充视图。
代码绘制6&6随机色块方格,最终效果如下:
图层演示应用中除此之外还可以在图层背景上绘制轨迹:
在视图中放大时,上述截图中的星星图案会变得模糊:
产生模糊的根源是图层的细节层次(level of detail,简称LOD),CATiledLayer有两个相关属性:levelsOfDetail和levelsOfDetailBias。
levelsOfDetail顾名思义,指图层维护的LOD数目,默认值为1,每进一级会对前一级分辨率的一半进行缓存,图层的levelsOfDetail最大值,也就是最底层细节,对应至少一个像素点。
而levelsOfDetailBias指的是该图层缓存的放大LOD数目,默认为0,即不会额外缓存放大层次,每进一级会对前一级两倍分辨率进行缓存。
例如,设上述分块图层的levelsOfDetailBias为5会缓存2x、4x、8x、16x和32x的放大层次,放大的图层效果如下:
不错吧?别着急,还没讲完呢。
CATiledLayer裁刀,买不了吃亏,买不了上当,只要998&(译注:此处内容稍作本地化处理,原文玩的是1978年美国Ginsu刀具的梗,堪称询价型电视购物广告的万恶之源。) :]
开个玩笑。CATiledLayer还有一个更实用的功能:异步绘制图块,比如在滚动视图中显示一张超大图片。
在用户滚动画面时,要让分块图层知道哪些图块需要绘制,写代码在所难免,不过换来性能提升也值了。
图层演示应用的UIImage+TileCutter.swift中包含一个UIImage扩展,教程编纂组成员Nick Lockwood在著作iOS Core Animation: Advanced Techniques的一个终端应用程序中利用了这段代码。
代码的职责是把原图片拆分成指定尺寸的方块,按行列位置命名图块,比如第三行第七列的图块windingRoad62.png(索引从零开始)。
有了这些图块,我们可以自定义一个UIView子类,绘制分块图层:
mport&UIKit&&class&TilingViewForImage:&UIView&{&&&let&sideLength&=&CGFloat(640.0)&let&fileName&=&&windingRoad&&let&cachesPath&=&NSSearchPathForDirectoriesInDomains(.CachesDirectory,&.UserDomainMask,&true)[0]&as&String&&&override&class&func&layerClass()&-&&AnyClass&{&return&CATiledLayer.self&}&&&required&init(coder&aDecoder:&NSCoder)&{&super.init(coder:&aDecoder)&let&layer&=&self.layer&as&CATiledLayer&layer.tileSize&=&CGSize(width:&sideLength,&height:&sideLength)&}&&&override&func&drawRect(rect:&CGRect)&{&let&firstColumn&=&Int(CGRectGetMinX(rect)&/&sideLength)&let&lastColumn&=&Int(CGRectGetMaxX(rect)&/&sideLength)&let&firstRow&=&Int(CGRectGetMinY(rect)&/&sideLength)&let&lastRow&=&Int(CGRectGetMaxY(rect)&/&sideLength)&&for&row&in&firstRow...lastRow&{&for&column&in&firstColumn...lastColumn&{&if&let&tile&=&imageForTileAtColumn(column,&row:&row)&{&let&x&=&sideLength&*&CGFloat(column)&let&y&=&sideLength&*&CGFloat(row)&let&point&=&CGPoint(x:&x,&y:&y)&let&size&=&CGSize(width:&sideLength,&height:&sideLength)&var&tileRect&=&CGRect(origin:&point,&size:&size)&tileRect&=&CGRectIntersection(bounds,&tileRect)&tile.drawInRect(tileRect)&}&}&}&}&&func&imageForTileAtColumn(column:&Int,&row:&Int)&-&&UIImage?&{&let&filePath&=&&\(cachesPath)/\(fileName)_\(column)_\(row)&&return&UIImage(contentsOfFile:&filePath)&}&&}&
以上代码:
创建属性,分别是图块边长、原图文件名、供TileCutter扩展保存图块的缓存文件夹路径。
重写layerClass()返回CATiledLayer。
实现init(_:),把视图的图层转换为分块图层,设置图块大小。注意此处不必设置contentsScale适配屏幕,因为是直接修改视图自身的图层,而不是手动创建子图层。
重写drawRect(),按行列绘制各个图块。
像这样,原图大小的自定义视图就可以塞进一个滚动视图:
多亏CATiledLayer,滚动5120 x 3200的大图也会这般顺滑:
498)this.width=498;' onmousewheel = 'javascript:return big(this)' width="312" height="470" alt="" src="/wyfs02/M00/5B/B2/wKiom1UQxvzwjWezABVWXOYHsbA294.gif" />
如你所见,快速滚动时绘制图块的过程还是很明显,你可以利用更小的分块(上述例子中分块为640 x 640),或者自己创建一个CATiledLayer子类,重写fadeDuration()返回0:
class&TiledLayer:&CATiledLayer&{&&override&class&func&fadeDuration()&-&&CFTimeInterval&{&return&0.0&}&&}&
示例 #8:CAShapeLayer
CAShapeLayer利用可缩放的矢量路径进行绘制,绘制速度比使用图片快很多,还有个好处是不用分别提供常规、@2x和@3x版本的图片,好用。
另外还有各种属性,让你可以自定线粗、颜色、虚实、线条接合方式、闭合线条是否形成闭合区域,还有闭合区域要填充何种颜色等。举例如下
import&UIKit&&&&class&ViewController:&UIViewController&{&&&&&&@IBOutlet&weak&var&someView:&UIView!&&&&&&&&&let&rwColor&=&UIColor(red:&11/255.0,&green:&86/255.0,&blue:&14/255.0,&alpha:&1.0)&&&let&rwPath&=&UIBezierPath()&&&let&rwLayer&=&CAShapeLayer()&&&&&&&&&func&setUpRWPath()&{&&&&&rwPath.moveToPoint(CGPointMake(0.22,&124.79))&&&&&rwPath.addLineToPoint(CGPointMake(0.22,&249.57))&&&&&rwPath.addLineToPoint(CGPointMake(124.89,&249.57))&&&&&rwPath.addLineToPoint(CGPointMake(249.57,&249.57))&&&&&rwPath.addLineToPoint(CGPointMake(249.57,&143.79))&&&&&rwPath.addCurveToPoint(CGPointMake(249.37,&38.25),&controlPoint1:&CGPointMake(249.57,&85.64),&controlPoint2:&CGPointMake(249.47,&38.15))&&&&&rwPath.addCurveToPoint(CGPointMake(206.47,&112.47),&controlPoint1:&CGPointMake(249.27,&38.35),&controlPoint2:&CGPointMake(229.94,&71.76))&&&&&rwPath.addCurveToPoint(CGPointMake(163.46,&186.84),&controlPoint1:&CGPointMake(182.99,&153.19),&controlPoint2:&CGPointMake(163.61,&186.65))&&&&&rwPath.addCurveToPoint(CGPointMake(146.17,&156.99),&controlPoint1:&CGPointMake(163.27,&187.03),&controlPoint2:&CGPointMake(155.48,&173.59))&&&&&rwPath.addCurveToPoint(CGPointMake(128.79,&127.08),&controlPoint1:&CGPointMake(136.82,&140.43),&controlPoint2:&CGPointMake(129.03,&126.94))&&&&&rwPath.addCurveToPoint(CGPointMake(109.31,&157.77),&controlPoint1:&CGPointMake(128.59,&127.18),&controlPoint2:&CGPointMake(119.83,&141.01))&&&&&rwPath.addCurveToPoint(CGPointMake(89.83,&187.86),&controlPoint1:&CGPointMake(98.79,&174.52),&controlPoint2:&CGPointMake(90.02,&188.06))&&&&&rwPath.addCurveToPoint(CGPointMake(56.52,&108.28),&controlPoint1:&CGPointMake(89.24,&187.23),&controlPoint2:&CGPointMake(56.56,&109.11))&&&&&rwPath.addCurveToPoint(CGPointMake(64.02,&102.25),&controlPoint1:&CGPointMake(56.47,&107.75),&controlPoint2:&CGPointMake(59.24,&105.56))&&&&&rwPath.addCurveToPoint(CGPointMake(101.42,&67.57),&controlPoint1:&CGPointMake(81.99,&89.78),&controlPoint2:&CGPointMake(93.92,&78.72))&&&&&rwPath.addCurveToPoint(CGPointMake(108.38,&30.65),&controlPoint1:&CGPointMake(110.28,&54.47),&controlPoint2:&CGPointMake(113.01,&39.96))&&&&&rwPath.addCurveToPoint(CGPointMake(10.35,&0.41),&controlPoint1:&CGPointMake(99.66,&13.17),&controlPoint2:&CGPointMake(64.11,&2.16))&&&&&rwPath.addLineToPoint(CGPointMake(0.22,&0.07))&&&&&rwPath.addLineToPoint(CGPointMake(0.22,&124.79))&&&&&rwPath.closePath()&&&}&&&&&&&&&func&setUpRWLayer()&{&&&&&rwLayer.path&=&rwPath.CGPath&&&&&rwLayer.fillColor&=&rwColor.CGColor&&&&&rwLayer.fillRule&=&kCAFillRuleNonZero&&&&&rwLayer.lineCap&=&kCALineCapButt&&&&&rwLayer.lineDashPattern&=&nil&&&&&rwLayer.lineDashPhase&=&0.0&&&&&rwLayer.lineJoin&=&kCALineJoinMiter&&&&&rwLayer.lineWidth&=&1.0&&&&&rwLayer.miterLimit&=&10.0&&&&&rwLayer.strokeColor&=&rwColor.CGColor&&&}&&&&&&override&func&viewDidLoad()&{&&&&&super.viewDidLoad()&&&&&&&&&&&&&setUpRWPath()&&&&&setUpRWLayer()&&&&&someView.layer.addSublayer(rwLayer)&&&}&&&&}
代码解释:
创建颜色、路径、图形图层对象。
绘制图形图层路径。如果不喜欢编写生硬的绘图代码的话,你可以尝试PaintCode这款软件,可以利用简便的工具进行可视化绘制,支持导入现有的矢量图(SVG)和Photoshop(PSD)文件,并自动生成代码。
设置图形图层。路径设为第二步中绘制的CGPath路径,填充色设为第一步中创建的CGColor颜色,填充规则设为非零(non-zero),即默认填充规则。
填充规则共有两种,另一种是奇偶(even-odd)。不过示例代码中的图形没有相交路径,两种填充规则的结果并无差异。
非零规则记从左到右的路径为+1,从右到左的路径为-1,累加所有路径值,若总和大于零,则填充路径围成的图形。
从结果上来讲,非零规则会填充图形内部所有的点。
奇偶规则计算围成图形的路径交叉数,若结果为奇数则填充。这样讲有些晦涩,还是有图有真相:
右图围成中间五边形的路径交叉数为偶数,故中间没有填充,而围成每个三角的路径交叉数为奇数,故三角部分填充颜色。
调用路径绘制和图层设置代码,并把图层添加到视图结构树。
上述代码绘制的图标:
顺便看看使用PaintCode的效果图:
图层演示应用中,你可以随意修改很多CAShapeLayer属性:
注:我们先跳过演示应用中的下一个示例,因为CAEAGLLayer多少显得有些过时了,iOS 8 Metal框架有更先进的CAMetalLayer。在此推荐iOS 8 Metal入门教程。
内容导航&第 1 页: &第 2 页: &第 3 页:
关于&&&&的更多文章
《Swift语言实战晋级》深入挖掘Swift语言的使用规律。省略过多讲
既然强大的Android Studio来了,有什么理由不去用呢?
讲师: 184人学习过讲师: 5人学习过讲师: 18人学习过
本专题意在帮助想要了解Android的人能快速上手Android
今天,圣诞的到来,相信大家都收到礼物了吧,如果没收
上周雷军被董明珠当成一个手机贩子,360又抢了12306的
主要内容:
● 如何设计像自动售货机那样有效的用户界面。
● 深入理解窗口和对话框的管理机制。
● 为什么性能优化与我们在
Windows Phone专家
Android开发专家
51CTO旗下网站  今日热点  今日热点  【swift语言】今天早上一打开微信就发现朋友圈里有人写到“急招iOS工程师,要求Swift语言,开发经验一天以上”。基本上,今天不发Swift相关朋友圈的程序猿都不好意思说自己编程。许多非程序猿的朋友便好奇到,Swift到底是什么?swift语言首度亮相 苹果再出新思维    今日热点  今日热点  事实上,Swift是苹果新发布的编程语言,可以用来编写iOS和OS X端的应用。而让它备受关注的,则是其简洁的语法和效果实时预览的功能。  swift语言首度亮相 苹果再出新思维    今日热点  今日热点  在Swift发布前,iOS和OS X的开发语言是tive C,这是一款已经三十多岁的编程语言,并且其语法十分之吊诡,和其他C语言风格的编程语言有着极大的区别。因此,让许多想转做iOS端应用开发的程序猿纷纷吐槽,“为什么tive C这么难学?!”即便是一些已经在做iOS端开发的程序猿也表示,如果不是苹果只支持tive C,自己其实并不想用tive C做开发。swift语言首度亮相 苹果再出新思维    今日热点  今日热点  因此,苹果此次发布的Swift这款语法更为简洁的,兼容tive C的语言。而在其开发者指南中,我们可以看到Swift从Python和Java t中学得了许多东西,从而让Swift更为易读,或者说更为“口语化”。swift语言首度亮相 苹果再出新思维    今日热点  今日热点  然而,对这类语法更为简洁的语言,许多人会质疑其运行效率。对此,苹果以对复杂对象的排序为例,指出Swift在许多方面比tive C的性能更好。  swift语言首度亮相 苹果再出新思维  可以想见,Swift的发布将会带来iOS端开发的学习成本的急剧下降,也许今年年底便会涌现出许多同时开发iOS端和Android端应用的工程师。同时,iOS端涌入的大量开发者则会让苹果的第三方应用市场更加活跃。来源新华网福建频道-)

我要回帖

更多关于 swift anyobject 的文章

 

随机推荐