3D Touch大法

Demo同步更新到Swift2.3

3D Touch最先应用在Apple Watch上面,但叫Force Touch,后在iPhone6s上加入了此特性,并改名3D Touch。值得注意的是目前3D Touch只支持iPhone6S以后的机型,包括现有Xcode7中6s的模拟器也不支持,不过Github上的SBShortcutMenuSimulator项目通过Hack方式已经实现了Quick Actions快捷访问,但不能使用Peek&Pop快速预览。

#技巧3# postNotificationName触发后的监听代码是同步还是异步执行的?

昨天去酷狗面试,被问到postNotificationName触发后的监听代码是同步还是异步执行的?,我当时知道触发后的监听代码和触发的代码是在同一线程上执行的,但却回答了是异步,哎,我这逻辑又下降了。。。。

举个栗子,比如说HTTP异步请求返回代码中我们触发一个通知,这个时候在监听的代码中直接去设置视图就会报错,因为当前线程不是主线程,正确的姿态应该是

1
2
3
dispatch_async(dispatch_get_main_queue(), { () -> Void in
NSNotificationCenter.defaultCenter().postNotificationName(kNotificationName, object: nil)
})

当然你也可以选择另一种方式,NSNotificationQueue通知队列,我们可以通过它做很多基于Runloop的需求,最重要的是它是异步执行的。

1
2
let queue = NSNotificationQueue.defaultQueue()
queue.enqueueNotification(NSNotification(name: kNotificationName, object: nil), postingStyle: NSPostingStyle.PostNow)

参考:

cocoa的NSNotification通知

#技巧2# 强制旋转应用当前屏幕

经常有这样的需求,APP只需要竖屏,但是一些特殊的场景下需要横屏。

比如说调用系统的MPMovieViewController播放视频时,我们会在AppDelegate中或者UIViewController中更新允许横屏的配置,当播放器旋转到横屏(此时设备应该也是处于横屏),APP现有ViewController也会跟着旋转,那么问题来了,当再次回到APP时,此时现有ViewController是处于横屏的,我们再去代理中更新为竖屏会发现代理根本不会被调用,这时我们就需要用到下面这段代码,去手动触发屏幕旋转事件

1
2
3
let vc = UIViewController();
self.presentViewController(vc, animated: false, completion: nil)
vc.dismissViewControllerAnimated(false, completion: nil)

参考:参考:

iOS屏幕旋转学习笔记

#技巧1# iOS8以后presendViewController透明效果无效

iOS弹出的视图背景默认是黑色,如果想去掉,以往我们使用 self.modalPresentationStyle = .CurrentContext 就可以实现效果,如以下半透明的代码

1
2
3
4
let vc = UIViewController()
vc.view.backgroundColor = UIColor(red: 0.000, green: 0.000, blue: 0.000, alpha: 0.5)
self.modalPresentationStyle = .CurrentContext
self.presentViewController(vc, animated: true, completion: nil)

但是你会发现这段代码在iOS8、iOS9上面运行依旧一片黑,因此iOS8以后得这么干

1
2
3
4
5
6
7
8
let vc = UIViewController()
vc.view.backgroundColor = UIColor(red: 0.000 , green: 0.000 , blue: 0.000, alpha: 0.5)
if let version = Float(UIDevice.currentDevice().systemVersion) where version >= 8 {
vc.modalPresentationStyle = .OverCurrentContext //注意此处是弹出VC对象,不是self
} else {
self.modalPresentationStyle = .CurrentContext
}
self.presentViewController(vc, animated: true, completion: nil)

iOS8后增加了OverCurrentContext取代CurrentContext,并且设置的对象是弹出的VC

iOS国际化

Demo同步更新到Swift2.3

在真正将国际化实践前,只知道通过NSLocalizedString方法将相应语言的字符串加载进来即可。但项目的新需求增加英文版本,并支持应用内无死角切换~,这才跳过各种坑实现了应用内切换语言,并记录至此。

蓝牙编程

蓝牙技术,很早以前就被有了,如今已更新4.0版本。很多热门技术都是基于它工作的,如Android平台的NFC,iOS的iBeancon,Apple Watch的WatchConnectivity框架等,现在的智能家居基本也是基于蓝牙4.0与APP进行通信,可见蓝牙在实践工作中的重要性。在iOS中,蓝牙是基于4.0标准的,设备间低功耗通信。

hello

Hello,new Blog~

之前一直都是在csdn上写博客(其实也没怎么写(⊙o⊙)…),最近订了些目标,个人网站就是其中一项

so~ Just do it!