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

UITableView スワイプでセルを削除する

簡単に実装できるので楽ですね。

UITableViewをOutlet接続しておきます。

1@IBOutlet weak var table: UITableView!

削除処理の実装

1func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
2    if editingStyle == .delete {
3        table.deleteRows(at: [indexPath], with: .fade)
4    }
5}

Xcode: 8.3.2
Swift: 3.1
OS: Sierra 10.12

3,161 views

ContainerView 親ビューから子ビューを操作したい

iOSのアプリ開発でコンテナビュー(ContainerView)が便利なので使ってみました。
その際、子ビューから別の子ビューのメソッドを実行して操作したい、ということがありました。

やってみるとそこまで難しくなかったので、簡単にご紹介したいと思います。

パターンとして、親ビューから子ビュー、子ビューから親ビュー、子ビューから別の子ビューの3通りをご紹介します。

親ビューから子ビュー

子ビュー側

1class ChildController: UIViewController {
2    func test() {
3        //code
4    }
5}

親ビュー側

1let targetVC = childViewControllers[0] as! ChildController
2targetVC.test()

子ビューから親ビュー

親ビュー側

1class ParentController: UIViewController {
2    func test() {
3        //code
4    }
5}

子ビュー側

1let parentVC = self.parent as! ParentController
2parentVC.test()

続きを読む…»

11,237 views

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

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