WWDC 2017 Session 201 地址:https://developer.apple.com/videos/play/wwdc2017/201/

主要是新的API概述,所以简单听一下,主要感兴趣的点:

  • 自动变化的大标题栏(Large Titles)
  • Safe Area Insets
  • 屏蔽系统边缘手势:preferredScreenEdgesDeferringSystemGestures
  • UIScrollView:contentLayoutGuideframeLayoutGuide
  • 闭包式KVO
  • 通过Keychain 自动填写密码(Password AutoFill for Apps )

iPhone Sound Switch

WWDC 2017 Session 803 地址:https://developer.apple.com/videos/play/wwdc2017/803/

1. 为何声音是设计的一个重要方面

  • 很多app都自己的通知的声音,为自己app设计声音可提高辨识度。

2. 为通知设计声音

  • Dark Sky为例,好的通知声音:已于辨识、传达信息、友好的、清晰的
  • 立项时要思考的问题:产品的本质?唤起什么样的情感?符合app的美学?声音来源?
  • 推荐采集合成声音的app:Voice Memos、Music Memos、Garage Band、Logic Pro
  • 好的通知声音的特性:可辨别的、符合设计、不突兀、可重复的、清晰的

3. 为UI元素设计声音

  • UI声音:键盘、滚动、按钮、点击、滑动、变换
  • 好的UI声音的特性:谨慎的使用、低音量、有帮助、愉悦的、建立深入人心的体验

4. 提示和技术

  • 思考几个问题:通知频率?品牌建立有什么作用?对UI有什么好处?没有界面时如何理解我的app?
  • 不要过度使用
  • 为用户提供开关
  • 细节很重要
  • 真机测试,包括耳机
  • 和专家合作:声音设计师、声音工程师

总结

感觉每次听下来都很容易,毕竟是苹果出品,写笔记时才感觉要操作的细节很多。作为一个开发者更多的是思考:声音对app的体验的帮助。

ps:稍后看WWDC打算参考这个 WWDC 2017 Viewing Guide:https://useyourloaf.com/blog/wwdc-2017-viewing-guide/

WWDC 2017 Session 102 地址:https://developer.apple.com/videos/play/wwdc2017/102/

1. Swift Playground

  • 更强大的 Playground,支持控制外设,如:机器人、无人机。

2. Xcode 9

  • 重写的代码编辑器( Source Editor),支持Markdown,开源转换引擎(Transformation Engine)
  • 问题(Issues) 更好的提示和更智能的自动修复
  • 当然还有缺席已久的重构(Refactoring)
  • 移动文件到group,自动移动物理位置
  • 完整支持git,和github集成

3. Swift 4

4. 调试和分析(Debugging and Analysis)

  • View Debugger
  • Thread Sanitizer、Address Sanitizer
  • 正确的 Main Thread API Checker

5. Xcode Server Built in

6. UITest更快,支持多应用多模拟器

  • 模拟器支持自定义大小

7. 无线调试

8. Frameworks

  • 简单介绍了主要更新的库,就不看了,和Keynote差不多,直接看感兴趣的Session好了。

ps:不知不觉看到了凌晨一点,今天把感性的的Session都下载了。立个flag,今年争取看30个。

WWDC 2017 Session 402 地址:https://developer.apple.com/videos/play/wwdc2017/402/

一些特性在 https://github.com/ole/whats-new-in-swift-4 的 Playground 已经演示,就不具体记录了。

总的来说:应用方面小修小补,迁移成本也很小,最高兴的就是编译方面的优化,结合Xcode的优化,相信Swift 4会更快。

1. 语言修饰和增补

  • private 变回 Swift 2,extension可见
  • 组合类和协议 (Composing Classes and Protocols),用法class & protocol
  • KeyPath
  • Swift 对 JSON 解析,Codable协议
  • 对Swift 3兼容,项目中3和4并存

2. 编译的提升

  • New build system 必须手动打开
  • index 优化,很赞会节约不少时间,我一度以为这是Xcode的bug
  • 不可预知类型性能优化(Unpredictable Performance in Swift 3),用COW优化(COW Existential Buffers)
  • 更小的二进制:移除无用的@objc部分代码,编译设置(Change build setting to Default: Swift 3 @objc Inference)
  • 符号大小(Symbol Size)

3. 字符串

  • Unicode支持,重音或表情,为一个字母,count为1。In Swift, a Character is a grapheme.

  • 表情处理速度提升

  • characters 改为集合类型

  • 字符串也改为集合类型

  • 支持切片(Slicing),let s = "one,two,three"; s.split(separator: ",")

  • 子字符串(Substrings)浪费内存,应该String(substring)

  • 终于支持多行字符串,格式为首尾 """

4. 一些通用特性

  • 拓展Sequence
  • Sequence拥有Element
  • 通用的下标(Generic Subscripts)

5. 独占的访问内存(Exclusive Access to Memory)

运行时强制:

  • 全局变量(Global variables )
  • 类的属性(Properties of classes )
  • 逃逸闭包中的变量(Local variables captured in escaping closures)

默认编译时打开,运行时关闭,可在build settings更改。

这一段有点难,回头再看看Onevcat翻译的 所有权宣言 - Swift 官方文章 Ownership Manifesto 译文评注版

自从学习iOS开发以来,断断续续加起来也有2年时间了。最近离职,是时候做一下总结,梳理一下知识点。

iOS开发最开始入门是 Stanford University Developing iOS 7 Apps,虽然是英语,但是最基本的概念也是那时候一点点学的。当然后来离职参加培训班,是进步最快速的一段时间,也培养了真正自学的能力。到后来参加iOS的工作,一直以来引以为好的就是自学能力。因为对于iOS开发来说:语言、设计模式、框架、文档、调试和测试等都已经掌握了,实际开发工作中,无非是一些实际的问题或者新的框架和系统特性,只要查询文档或者Google一下都能解决了。

框架

谈到iOS框架,必须是MVC,工作以来的项目一直都是MVC。足够简单的分层和经久验证的良好设计。对于其他的如:MVVM,只是了解,实际项目中未曾应用。比较简单的业务逻辑和团队人数少的情况下,MVC足够好用。

语言

Objective-C是入门语言,其语言复杂性足够新手望而却步,但是也就属性特性和方法调用比较难。后来工作中一直使用Swift,才感觉到现代语言的简单和强大。尤其是Swift多范式,支持函数式编程,尤为方便。由于对Swift的偏爱,我也逐渐把第三方库都替换成了Swift对应的版本。Cocoapods对于Framework的支持也比较好, 添加use_frameworks!,即可调用Objective-C的库也很Swifty。

设计模式

Delegate、通知、KVO、Target-Action、Block(Closure)、工厂方法、单例等就不一一介绍,更具实际需求选择合适且喜欢的就行。特别推荐这篇文章:消息传递机制

Cocoa Touch

iOS渲染层次树、view、layer、响应链、Core Animation、自定义view、常见UIKit的控件的继承关系,table view、collection view等都应该熟练使用。

学习资源

微博、Twitter、博客、书、视频教程都是很好的。列几个对我影响比较的:

常用库

这里是最为推荐的几个库:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

pod 'SwiftyJSON'
pod 'SnapKit'
pod 'IGListKit'
pod 'Kanna'
pod 'URLNavigator'
pod 'MXSegmentedPager'
pod 'QMUIKit'
pod 'IBAnimatable'
pod 'Ruler'
pod 'DZNEmptyDataSet'
pod 'CYLTabBarController'
pod 'FDFullscreenPopGesture'
pod 'MJRefresh'
pod 'SwiftyUserDefaults'
pod 'YYKit'

# Test tools
pod 'MLeaksFinder'
pod 'FLEX', '~> 2.0', :configurations => ['Debug']
pod 'Reveal-SDK', '~> 4.0', :configurations => ['Debug']

视频cell滑动时自动播放,实现起来主要是获取滚动时刻的cell的frame,IGListScrollDelegatelistAdapter(_:didEndDragging:willDecelerate:) 获取可见cell,播放符合规则的视频cell,并暂停其余cell。

主要记录思路,供大家参考。规则如下:

  • 视频frame超过一半在Screen上的最前面的cell
  • 少于一半则停止播放,以导航栏底部64为准线
  • vc appear 手动调用此方法
  • vc didMove(toParentViewController:) release player
  • visibleCells 方法返回 cell indexPath 不是顺序的,是个坑,要重新排序
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
extension VideoSectionController: IGListScrollDelegate {

// MARK: - GListScrollDelegate

func listAdapter(_ listAdapter: IGListAdapter!, didScroll sectionController: IGListSectionController!) {

}

func listAdapter(_ listAdapter: IGListAdapter!, willBeginDragging sectionController: IGListSectionController!) {

}

func listAdapter(_ listAdapter: IGListAdapter!, didEndDragging sectionController: IGListSectionController!, willDecelerate decelerate: Bool) {

guard var cells = self.collectionContext?.visibleCells(for: sectionController) as? [VideoCell] else { return }

// cells 重新排序
cells = cells.sorted { (cell0, cell1) -> Bool in
guard let indexPath0 = collectionContext?.index(for: cell0, sectionController: sectionController) else {
return true
}
guard let indexPath1 = collectionContext?.index(for: cell1, sectionController: sectionController) else {
return true
}

if indexPath0 < indexPath1 {
return true
} else {
return false
}

}

for cell in cells {

let videoCenter = cell.convert(cell.videoCoverImageView.center, to: nil)

if videoCenter.y < 64 {
// pause
cell.pause()
} else {
// play
cell.play()
break
}
}

}
}
1
2
3
4
5
6
7
8
override func didMove(toParentViewController parent: UIViewController?) {
super.didMove(toParentViewController: parent)

if parent == self.navigationController?.parent {
print("Back tapped")
NotificationCenter.default.post(name: Notification.Name.VideoPlayer.VideoCellStopPlay, object: nil, userInfo: nil)
}
}

官方教程地址:https://www.paintcodeapp.com/examples

PaintCode能够画出各种自定义的曲线图形(再也不怕设计师的各种曲线和细节实现不了),而且很方便的集成到iOS项目中,支持Swift和Objective-C。尤其是 Dynamic Shapes 支持简单约束,可以保持大小变化时图形规则变化。

软件截图:

操作很简单,和Sketch习惯差不多。

Screen Shot 2017-02-05 at 12.14.33

自定义视图代码:

实现一个带有箭头的圆形边框的图片视图

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import UIKit

class ButtonView: UIView {

var image: UIImage? {
didSet {
if imageView == nil {
imageView = UIImageView()
imageView?.backgroundColor = .clear
imageView?.layer.masksToBounds = true
self.insertSubview(imageView!, at: 0)
}
imageView?.image = image
}
}

private var imageView: UIImageView?

override func draw(_ rect: CGRect) {
// 重点代码,一行即可完成
JLXStyleKit.drawBubbleButton(frame: self.bounds)
}

override func layoutSubviews() {
super.layoutSubviews()

imageView?.frame = CGRect(x: self.bounds.width * 0.5 / 38.0, y: self.bounds.width * 0.5 / 38.0, width: self.bounds.width * 37 / 38.0, height: self.bounds.width * 37 / 38.0)
imageView?.layer.cornerRadius = bounds.width / 2.0
}

}

运行截图:

Simulator Screen Shot Feb 5, 2017, 12.16.37

Demo 地址

https://github.com/gewill/PaintCode-Dynamic-Bezier-Shapes-Demo

Apple Swift 博客原文地址:https://developer.apple.com/swift/blog/?id=39

主要变化:Swift 3 中 Any 映射 Objective-C 的 id

Objective-C Swift 2 Swift 3
id AnyObject Any
NSArray * [AnyObject] [Any]
NSDictionary * [NSObject: AnyObject] [AnyHashable: Any]
NSSet * Set<NSObject> Set<AnyHashable>
  • 方法和协议的中的AnyObject均改为Any
  • 调用大部分 C 和 Objective-C 需要显示类型转换,指针为 UnsafePointer<AnyObject>
  • Objective-C 协议仍是限制在 Class,而 structs 和 enums 无法符合。需要显示转换,如:String as NSString, Array as NSArray
  • Any 没有 AnyObject 中的一些魔法查询方法可用,如:(x as AnyObject).description
  • Swift 值类型隐式转换 id
  • Cocoa 也紧随 Swift 进化的脚步,而变得更强大
0%