カテゴリー
SugiBlog Webエンジニアのためのお役立ちTips

スクリーンショットを添付してメール送信

MFMailComposeViewControllerを使ってメールを作成します。

まずはMessageUIをインポートします。

デリゲートを追加します。

1class sample: UIViewController, MFMailComposeViewControllerDelegate {
1func mail(subject: String, mailbody: String) {
2    let composeVC = MFMailComposeViewController()
3    composeVC.mailComposeDelegate = self
4 
5    composeVC.setToRecipients(["送信先メールアドレス"])
6 
7    composeVC.setSubject(subject)
8 
9    composeVC.setMessageBody(mailbody, isHTML: false)
10 
11    let layer = UIApplication.shared.keyWindow?.layer
12    let scale = UIScreen.main.scale
13    UIGraphicsBeginImageContextWithOptions((layer?.frame.size)!, false, scale)
14 
15    layer?.render(in: UIGraphicsGetCurrentContext()!)
16    let screenshot = UIGraphicsGetImageFromCurrentImageContext()
17    let image = UIImageJPEGRepresentation(screenshot!, 1.0)
18    UIGraphicsEndImageContext()
19 
20    composeVC.addAttachmentData(image!, mimeType: "image/png", fileName: "screenshot.png")
21 
22    self.present(composeVC, animated: true, completion: nil)
23}

デリゲートで必要なメソッド
メール送信やキャンセルの操作を受けて実行されます。

1func mailComposeController(_ controller: MFMailComposeViewController, didFinishWith result: MFMailComposeResult, error: Error?) {
2    controller.dismiss(animated: true, completion: nil)
3 
4    switch result {
5    case .sent: //送信
6            break
7    case .saved: //保存
8            break
9    case .failed: //失敗
10            break
11    case .cancelled: //キャンセル
12            break
13    default:
14        break
15    }
16}

Xcode: 8.3.2
Swift: 3.1
OS: Sierra 10.12

1,736 views

GoogleMapの操作 for iOS

GoogleMapの位置や、ズームレベルを変更します。

指定した座標に位置を設定
座標はCLLocationCoordinate2Dで渡します。

1let update = GMSCameraUpdate.setTarget(coordinate)

GoogleMapを更新する

アニメーションで更新する

その他の操作
ZoomIn ズームレベルを1.0拡大
ZoomOut ズームレベルを1.0縮小
ZoomTo ズームレベルを指定します。

それ以外の操作は公式リファレンスを参照ください。
https://developers.google.com/maps/documentation/ios-sdk/views?hl=ja

Xcode: 8.3.2
Swift: 3.1
OS: Sierra 10.12

1,608 views

座標から住所に変換する 逆ジオコーディング

緯度経度の座標から逆ジオコーディング(リバースジオコーディング)で住所を取得することができます。
これにはGoogleのAPIを利用しますので、GoogleMapsをインポートしている前提でのお話です。

座標をGoogleMapから取得します。
例えばタップであればcoordinate: CLLocationCoordinate2Dが取得できますので
これを元にCLLocationオブジェクトを作成します。

1let location: CLLocation = CLLocation(latitude: coordinate.latitude, longitude: coordinate.longitude)

逆ジオコーディングを行うメソッド
結果をアラートで表示しています。

1func ReverseGeocoder(location: CLLocation) {
2 
3    var address: String = ""
4 
5    CLGeocoder().reverseGeocodeLocation(location, completionHandler: {(placemarks, error)->Void in
6 
7        if error != nil {
8            print("error")
9            return
10        }
11 
12        if placemarks!.count > 0 {
13            let pms = placemarks![0]
14            address = self.makeAddressString(placemark: pms)
15 
16            let aTitle = "住所表示"
17            let aMessage = address
18            let alert = UIAlertController(title: aTitle, message: aMessage, preferredStyle: .alert)
19 
20            alert.addAction(UIAlertAction(title: "OK", style: .default, handler: nil))
21 
22            self.present(alert, animated: false, completion: nil)
23 
24        } else {
25 
26            print("error")
27 
28        }
29 
30    })
31 
32}

取得できた住所を一連の文字列に変換するメソッド

1func makeAddressString(placemark: CLPlacemark) -> String {
2 
3    var address: String = ""
4 
5    //address += placemark.postalCode != nil ? placemark.postalCode! : ""
6    address += placemark.administrativeArea != nil ? placemark.administrativeArea! : ""
7    address += placemark.subAdministrativeArea != nil ? placemark.subAdministrativeArea! : ""
8    address += placemark.locality != nil ? placemark.locality! : ""
9    address += placemark.subLocality != nil ? placemark.subLocality! : ""
10    address += placemark.thoroughfare != nil ? placemark.thoroughfare! : ""
11    address += placemark.subThoroughfare != nil ? placemark.subThoroughfare! : ""
12 
13    return address
14 
15}

Xcode: 8.3.2
Swift: 3.1
OS: Sierra 10.12

3,911 views

アラートを表示する UIAlertController

アラートを表示するにはUIAlertControllerを利用します。

アラート(ダイアログ)を表示する

タイトルとメッセージを設定し、アラートのオブジェクトを作成します。

1let aTitle = "タイトル"
2let aMessage = "メッセージ表示"
3 
4let alert = UIAlertController(title: aTitle, message: aMessage, preferredStyle: .alert)

OKボタンを作成します。

1alert.addAction(
2    UIAlertAction(title: "OK", style: .default, handler: { action in
3        print("OKをタップした場合の処理")
4    })
5)

キャンセルボタンを作成します。
処理は何もしないので、handlerはnilで大丈夫です。

1alert.addAction(UIAlertAction(title: "キャンセル", style: .cancel, handler: nil))

アラートを表示する

1self.present(alert, animated: false, completion: nil)

続きを読む…»

3,575 views

複数のStoryboardを使った画面遷移

アプリ開発をしていく中で様々な画面を作成していくと、Storyboardが複雑化してしまいます。
そこで、シーンをグループ分けしStoryboardを分割することで開発が楽になります。

今回は別のStoryboardのシーンへ遷移させる方法をご紹介します。

新規ファイルでStoryboardを追加します。

通常はMain.storyboardがありますので、Sub.storyboardを作成します。

ViewControllerを追加し、Storyboard IDを設定します。

仮に「sub_exam」としておきます。

あとは遷移したいところに以下のコードを追加するだけです。

1let SubStoryboard: UIStoryboard = UIStoryboard(name: "Sub", bundle: nil)
2let subExam: UIViewController = SubStoryboard.instantiateViewController(withIdentifier: "sub_exam")
3show(subExam, sender: nil)

Sub.storyboardのViewControllerをイニシャルビューとしている場合は以下のようになります。

1let subExam: UIViewController = SubStoryboard.instantiateInitialViewController() as! UIViewController

続きを読む…»

5,017 views