もがき系プログラマの日常

もがき系エンジニアの勉強したこと、日常のこと、気になっている技術、備忘録などを紹介するブログです。

iphoneアプリ勉強

はじめに

こんばんは。

連続投稿です。

前回の記事でも書きましたが、こちらの「先月号」のWeb+DB Press.104号で紹介されているものをやってみようと思います。

WEB+DB PRESS Vol.104

WEB+DB PRESS Vol.104

  • 作者: 末田卓巳,林田千瑛,陶山嶺,八谷賢,辰己佳祐,竹澤俊季,服部智,藤岡裕吾,牧大輔,西郡卓矢,松木雅幸,穴井宏幸,新日出海,桑原仁雄,小田知央,ひげぽん,池田拓司,はまちや2,竹原,大場光一郎,大場寧子,松館大輝,日高尚美,Vu Xuan Dung,WEB+DB PRESS編集部
  • 出版社/メーカー: 技術評論社
  • 発売日: 2018/04/24
  • メディア: 単行本
  • この商品を含むブログを見る

今回はiphoneアプリ開発です。

ちなみに自分のiphoneアプリ開発の経験値は

  • Objective-C時代に3ヶ月くらい
  • Swift2時代に1ヶ月くらい

という感じで、アプリ開発に関しては完全ペーペーです。

そしてだいぶ昔にやったことなので、完全に忘れています。

React-NativeとかIonicとかにも興味あるんですが、ネイティブな開発も、知識としては入れておきたいので、少し触っとこうと思います。

今回は、iphoneアプリ開発特集で紹介されている部分を抜粋して、写真撮影とtwitter投稿までをやってみようと思います。

やってみた

はじめのはじめ

とりあえずXcodeを立ち上げて、Create a new Xcode Projectを選択します。

f:id:kojirooooocks:20180630023628p:plain

Xcodeが開いたら、Single View Appが選択されていると思いますので、そのままそれを選択します。

Single View Appは一番シンプルなテンプレートという感じです。

f:id:kojirooooocks:20180630023646p:plain

Choose option for your new projectの画面では、ProjectName Organization Identifier を入力してNextを押します。

  • Use Core Data
  • Include Unit Tests
  • Include UI Tests

は今回使いません。

f:id:kojirooooocks:20180630023707p:plain

こんな感じでXcodeプロジェクトが立ち上がります。

f:id:kojirooooocks:20180630023721p:plain

少しづつ思い出してきた・・・!

写真撮影機能

ImageView設置

storyboardを使って、UIを配置していきます。

カメラで撮影した写真をアプリ上で表示するための場所を作るため、ImageViewを配置します。

f:id:kojirooooocks:20180630023736p:plain

contentModeを設定します。

本では Aspect Fitを設定してますが、コレはなんだろうとちょっと調べると、こちらのサイトで紹介されていました。

Aspect Fit = 縦横の比率はそのままで長い辺を基準に全体を表示する

なるほどなるほど。早速合わせます。

f:id:kojirooooocks:20180630023749p:plain

UIToolbar設置

次はアプリ内で、カメラを起動するボタンと、シェア用のボタンを配置するためUIToolbarを設置します。

こんな感じで画面の下部に設置します。

f:id:kojirooooocks:20180630023800p:plain

デフォルトでボタンが一個付いてるんですが、つけたいのはカメラ起動ボタンとシェアボタンの2つなので、もうひとつツールバーにボタンを設置します。

Button ではなく Bar Button Item なので注意。

f:id:kojirooooocks:20180630023812p:plain

Bar Button Itemドラッグアンドドロップすると、↑の画像のようにデフォルトのボタンの横にくっついてしまいます。

左右にボタンを配置したいので、ボタンとボタンの間に Flexible Spece Bar Button Item を使用します。

f:id:kojirooooocks:20180630023824p:plain

次に配置したボタンをカメラ起動ボタンの方はカメラアイコン、シェアボタンの方はシェア用のアイコンに変更します。

f:id:kojirooooocks:20180630023837p:plain

f:id:kojirooooocks:20180630023849p:plain

こんな感じです。

おーー!アプリっぽいですね。

AutoLayoutで配置を整える

いろんなiphone端末の画面サイズをよしなに対応してもらうためのAutoLayoutを設定します。

本で紹介されている通り、高さの固定が必要なツールバーのAutoLayoutを設定していきます。

f:id:kojirooooocks:20180630023903p:plain

画像のように設定します。

高さを44に固定して、左右と下の余白を0に指定します。



ImageViewは上下左右の余白を0固定にします。

f:id:kojirooooocks:20180630023917p:plain

シミュレーター立ち上げてみます。

f:id:kojirooooocks:20180630023930p:plain

いい感じ!!

カメラ起動

アプリがカメラにアクセスするための許諾設定を行います。

本で紹介されている通り

  • Privacy - Photo Library Additions Usage Description
  • Privacy - Camera Usage Description

を追加します。

f:id:kojirooooocks:20180630023943p:plain

次はカメラ起動用のコードです。 ViewController.swiftに以下のようなコードを記述します。

    @IBAction func didTouchCameraButton(_ sender: Any) {
        let pickerController = UIImagePickerController()
        pickerController.sourceType = .camera
        self.present(pickerController, animated: true)
    }

次にコードとUIを繋ぎ合わせます。

各IBAction、IBOutletの行ラインに丸いアイコンが表示されていると思うので、それをクリックしてドラッグアンドドラックしつつ、各UIに紐づけます。

そうすると以下のような感じになります。

f:id:kojirooooocks:20180630024001p:plain

f:id:kojirooooocks:20180630024013p:plain

f:id:kojirooooocks:20180630024024p:plain

実機を接続してアプリを立ち上げると、カメラを使用できるかどうかの確認が出ます。

f:id:kojirooooocks:20180630024048p:plain

許可すると撮影ができます。

やったー!

プレビューを表示

delegateを設置します。

以下のようなコードにviewController.swiftを変更します。

import UIKit

class ViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate { ← 追加
    @IBOutlet weak var imageView: UIImageView!

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }

    @IBAction func didTouchCameraButton(_ sender: Any) {
        let pickerController = UIImagePickerController()
        pickerController.sourceType = .camera
        pickerController.delegate   = self                 ← 追加
        self.present(pickerController, animated: true)
    }
    
    @IBAction func didTouchShareButton(_ sender: Any) {
    }

    // ↓ 追加
    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
        if let image = info[UIImagePickerControllerOriginalImage] as? UIImage {
            imageView.image = image
            UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil)
        }
        picker.dismiss(animated: true, completion: nil)
    }
}

f:id:kojirooooocks:20180630024211p:plain

でました!!

Twitter投稿

次は、シェアボタンの機能を作成します。

UIActivityという機能を使うようです。

こんな感じで追加します。

    @IBAction func didTouchShareButton(_ sender: Any) {
        guard let imageData = UIImageJPEGRepresentation(imageView.image!, 1.0) else {
            return
        }

        let activityController = UIActivityViewController(activityItems: [imageData], applicationActivities: nil)
        self.present(activityController, animated: true, completion: nil)
    }

起動させてみます。

f:id:kojirooooocks:20180630024238p:plain

f:id:kojirooooocks:20180630024322p:plain

できたー!!!!

終わりに

写真撮ってTwitter投稿するだけのアプリでしたけど、本に沿ってやれば簡単にできました。

本では更に写真加工をしたりもするので、さらにいろいろとできそうです。

やっぱアプリ面白いなぁー。

お疲れ様でした。