项目开发常用实用技术
实现拨打电话
要实现打电话功能,最简单最直接的方式便是:直接跳到拨号界面
(注意:这个需要真机调试,模拟器无效果)
UIApplication.sharedApplication().openURL(NSURL(string :"tel://123456")!)
邮件发送功能的实现
使用MessageUI.framework框架除了可以发送短信,还能发送Email,步骤如下:
(1)首先判断设备是否有发送邮件功能
(2)如果设备允许发送邮件,创建一个MFMailComposeViewController视图控制器,并对其设置邮件标题,正文内容,收件人,附件等。
(3)邮件发送后,会执行回调代理方法,可以获取发送结果(成功,失败或取消)
效果图如下:
代码如下:
import UIKit import MessageUI class ViewController: UIViewController ,UINavigationControllerDelegate, MFMailComposeViewControllerDelegate{ override func viewDidLoad() { super.viewDidLoad() //首先要判断设备具不具备发送邮件功能 if MFMailComposeViewController.canSendMail(){ let controller = MFMailComposeViewController() //设置代理 controller.mailComposeDelegate = self //设置主题 controller.setSubject("我是邮件标题") //设置收件人 controller.setToRecipients(["a1@hangge.com","a2@hangge.com"]) //设置抄送人 controller.setCcRecipients(["b1@hangge.com","b2@hangge.com"]) //设置密送人 controller.setBccRecipients(["c1@hangge.com","c2@hangge.com"]) //添加图片附件 var path = NSBundle.mainBundle().pathForResource("hangge.png", ofType: "") var myData = NSData(contentsOfFile: path!) controller.addAttachmentData(myData, mimeType: "image/png", fileName: "swift.png") //设置邮件正文内容(支持html) controller.setMessageBody("我是邮件正文", isHTML: false) //打开界面 self.presentViewController(controller, animated: true, completion: nil) }else{ println("本设备不能发送邮件") } } //发送邮件代理方法 func mailComposeController(controller: MFMailComposeViewController!, didFinishWithResult result: MFMailComposeResult, error: NSError!) { controller.dismissViewControllerAnimated(true, completion: nil) switch result.value{ case MFMailComposeResultSent.value: println("邮件已发送") case MFMailComposeResultCancelled.value: println("邮件已取消") case MFMailComposeResultSaved.value: println("邮件已保存") case MFMailComposeResultFailed.value: println("邮件发送失败") default: println("邮件没有发送") break } } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } }
短信发送功能的实现
使用MessageUI.framework框架可以实现短信发送功能,步骤如下:
(1)首先判断设备是否有发送短信功能
(2)如果设备允许发送短信,创建一个MFMessageComposeViewController视图控制器,并对其设置短信内容和收件人号码列表。
(3)短信发送后,会执行回调代理方法,可以获取发送结果(成功,失败或取消)
代码如下:
import UIKit import MessageUI class ViewController: UIViewController ,UINavigationControllerDelegate, MFMessageComposeViewControllerDelegate{ override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. //首先要判断设备具不具备发送短信功能 if MFMessageComposeViewController.canSendText(){ let controller = MFMessageComposeViewController() //设置短信内容 controller.body = "短信内容:欢迎来到hangge.com" //设置收件人列表 controller.recipients = ["] //设置代理 controller.messageComposeDelegate = self //打开界面 self.presentViewController(controller, animated: true, completion: { () -> Void in }) }else{ println("本设备不能发送短信") } } //发送短信代理 func messageComposeViewController(controller: MFMessageComposeViewController!, didFinishWithResult result: MessageComposeResult) { controller.dismissViewControllerAnimated(true, completion: nil) switch result.value{ case MessageComposeResultSent.value: println("短信已发送") case MessageComposeResultCancelled.value: println("短信取消发送") case MessageComposeResultFailed.value: println("短信发送失败") default: break } } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } }
手机摇晃的监测和响应
摇晃手机也是一种常用的交互手段(比如微信摇一摇功能)。iOS SDK中已经将shake事件方便地融合进去了,就像触发touch事件一样简单,发生摇晃事件后程序会自动执行。
import UIKit class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() } //开始摇晃 override func motionBegan(motion: UIEventSubtype, withEvent event: UIEvent) { println("开始摇晃") } //摇晃结束 override func motionEnded(motion: UIEventSubtype, withEvent event: UIEvent) { println("摇晃结束") } //摇晃被意外终止 override func motionCancelled(motion: UIEventSubtype, withEvent event: UIEvent) { println("摇晃被意外终止") } }
判断设备方向(或监听设备方向的改变)
通过UIDevice.currentDevice()来获取设备,可以取得设备当前的方向。
同时,我们可以添加一个通知来监听设备方向的变化,这样在开发中可以对不同的方向定制不同的排版布局界面。
下面通过一个样例,演示如何监测设备方向:
import UIKit class ViewController: UIViewController { @IBOutlet weak var orientationLabel: UILabel! override func viewDidLoad() { super.viewDidLoad() //感知设备方向 - 开启监听设备方向 UIDevice.currentDevice().beginGeneratingDeviceOrientationNotifications() //添加通知,监听设备方向改变 NSNotificationCenter.defaultCenter().addObserver(self, selector: "receivedRotation", name: UIDeviceOrientationDidChangeNotification, object: nil) //关闭设备监听 //UIDevice.currentDevice().endGeneratingDeviceOrientationNotifications() } //通知监听触发的方法 func receivedRotation(){ var device = UIDevice.currentDevice() switch device.orientation{ case .Portrait: orientationLabel.text = "面向设备保持垂直,Home键位于下部" case .PortraitUpsideDown: orientationLabel.text = "面向设备保持垂直,Home键位于上部" case .LandscapeLeft: orientationLabel.text = "面向设备保持水平,Home键位于左侧" case .LandscapeRight: orientationLabel.text = "面向设备保持水平,Home键位于右侧" case .FaceUp: orientationLabel.text = "设备平放,Home键朝上" case .FaceDown: orientationLabel.text = "设备平放,Home键朝下" case .Unknown: orientationLabel.text = "方向未知" default: orientationLabel.text = "方向未知" } } }
使用相机拍摄照片
1,打开相机拍照
通过设置图片控制器UIImagePickerController的来源为UIImagePickerControllerSourceType.Camera,便可以打开相机
import UIKit class ViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate { override func viewDidLoad() { super.viewDidLoad() } //拍照 @IBAction func fromPhotograph(sender: AnyObject) { if UIImagePickerController.isSourceTypeAvailable(.Camera){ //创建图片控制器 let picker = UIImagePickerController() //设置代理 picker.delegate = self //设置来源 picker.sourceType = UIImagePickerControllerSourceType.Camera //允许编辑 picker.allowsEditing = true //打开相机 self.presentViewController(picker, animated: true, completion: { () -> Void in }) }else{ println("找不到相机") } } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } }
2,调用前置,后置摄像头
相机默认使用后置摄像头,可以设置UIImagePickerControllerCameraDevice类型来使用前置摄像头或后置摄像头。
像iTouch设备不具备前置摄像头,我们可以事先判断下是否支持前置。
//如果有前置摄像头则调用前置摄像头 if UIImagePickerController.isCameraDeviceAvailable(UIImagePickerControllerCameraDevice.Front){ picker.cameraDevice = UIImagePickerControllerCameraDevice.Front }
3,设置闪光灯
通过cameraFlashMode属性可以设置闪光灯:开启/关闭/自动
picker.cameraFlashMode = UIImagePickerControllerCameraFlashMode.On
系统声音服务的使用(播放声音,提醒,震动)
1,系统声音服务介绍:
系统声音服务提供了一个Api,用于播放不超过30秒的声音。它支持的文件格式有限,具体的说只有CAF、AIF和使用PCM或IMA/ADPCM数据的WAV文件。
但此函数没有提供操作声音和控制音量的功能,因此如果是要为多媒体或游戏创建专门声音,就不要使用系统声音服务。
2,系统声音服务支持如下三种类型:
(1)声音:立刻播放一个简单的声音文件。如果手机静音,则用户什么也听不见。
(2)提醒:播放一个声音文件,如果手机设为静音或震动,则通过震动提醒用户。
(3)震动:震动手机,而不考虑其他设置。
3,使用样例(首先类中要引入AudioToolbox)
import AudioToolbox
(1)声音播放
@IBAction func systemSound(sender: AnyObject) { //建立的SystemSoundID对象 var soundID:SystemSoundID = //获取声音地址 var path = NSBundle.mainBundle().pathForResource("msg", ofType: "wav") //地址转换 var baseURL = NSURL(fileURLWithPath: path!) //赋值 AudioServicesCreateSystemSoundID(baseURL, &soundID) //播放声音 AudioServicesPlaySystemSound(soundID) }
(2)提醒
@IBAction func systemAlert(sender: AnyObject) { //建立的SystemSoundID对象 var soundID:SystemSoundID = //获取声音地址 var path = NSBundle.mainBundle().pathForResource("msg", ofType: "wav") //地址转换 var baseURL = NSURL(fileURLWithPath: path!) //赋值 AudioServicesCreateSystemSoundID(baseURL, &soundID) //提醒(同上面唯一的一个区别) AudioServicesPlayAlertSound(soundID) }
(3)振动
@IBAction func systemVibration(sender: AnyObject) { //建立的SystemSoundID对象 var soundID = SystemSoundID(kSystemSoundID_Vibrate) //振动 AudioServicesPlaySystemSound(soundID) }
判端网络连接状态,连接类型(3G还是Wifi)
IJReachability是一个使用Swift写的第三方网络检测类。可以测试网络是否连接,并支持3G和Wifi的检测。
使用样例:
使用样例:
import UIKit class ViewController: UIViewController { @IBOutlet weak var statusLabel: UILabel! @IBOutlet weak var typeLabel: UILabel! override func viewDidLoad() { super.viewDidLoad() } @IBAction func checkConnect(sender: AnyObject) { //判断连接状态 if IJReachability.isConnectedToNetwork(){ statusLabel.text = "网络连接:可用" }else{ statusLabel.text = "网络连接:不可用" } //判断连接类型 let statusType = IJReachability.isConnectedToNetworkOfType() switch statusType{ case .WWAN: typeLabel.text = "连接类型:移动网络" case .WiFi: typeLabel.text = "连接类型:WiFi" case .NotConnected: typeLabel.text = "连接类型:没有网络连接" } } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() }