hoz blog

営業からSEに転職した文系エンジニアです。プログラミングと趣味の株に関してブログを書いていこうと思います。

【Swift】ScrollViewにボタンをつけることで任意のイメージを選択時に背景画像に適用する

UIScrollViewにボタンをつけることで任意のイメージを選択時に背景画像に適用する方法を記載。


まず、ストーリーボードにUIScrollViewを配置
f:id:takanori5:20171022231805p:plain

続いてソースに関連付け

    @IBOutlet var sc: UIScrollView!

f:id:takanori5:20171022231936p:plain

あとは以下のようにコードをゴリゴリ書きましょう

   //scrollView用
    var uv = UIView()

//以下はvieDIdLoad内に記述することで画面表示時に scrollViewに画像がセットされている状態にする

        //位置とサイズを決める
        uv.frame = CGRect(x: 0, y: 418, width: self.view.frame.size.width*2, height: 128)
        
        //UIButtonを作成
        for i in 0..<6{
            let button:UIButton = UIButton()
            //x軸はi*80都することでボタンを一定間隔ごとに配置していく
            button.frame = CGRect(x: i*80, y: 0, width: 80, height: 80)
            button.tag = i
            //どこのメソッドを呼ぶか定義しておく
            button.addTarget(self, action: #selector(tap/*これを呼ぶ*/), for: .touchUpInside/*タッチアップ時にメソッド発動*/)
            let buttonImage:UIImage = UIImage(named: String(i) + ".jpg")!
            button.setImage(buttonImage, for: UIControlState.normal)
            uv.addSubview(button)
        }
        //scrollViewにUIViewを貼り付ける
        sc.addSubview(uv)
        ///scrollVieのサイズをUIViewのサイズに合わせておく(2倍のサイズにしているためスクロールする)
        sc.contentSize = uv.bounds.size

【Swift】値を渡しながら画面遷移する

Swiftで値を渡しながら画面遷移する方法について書きます。

かなり簡単にかけます。


segueにIDをつけておきます。
f:id:takanori5:20171022123751p:plain

今回はNextと設定

推移元のcontrollerにprepareメソッドをoverride
これが画面推移前に呼ばれるメソッドなので、値を渡したい時はここでセットしていきます。

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
  //上記でセットしたidentifierのsegueであれば、
       //推移先のcontrollerの変数(ここではUIImage)に推移元のcontrollerのUIImageをセット
        if segue.identifier == "next" {
            let subVC:EditViewController = segue.destination as! EditViewController
            subVC.willEdit = imageView.image!
        }
    }

これで値を渡すことができました。

画面推移は以下

     //以下を推移したいタイミング(例えばボタンのタップ時のメソッドの中で呼ぶ)
     performSegue(withIdentifier: "next", sender: nil)

以上です。かなり簡単ですね。

takanori5.hatenablog.com
takanori5.hatenablog.com

超簡単!Swiftでカメラを利用する方法

カメラの起動、撮影などを自分のアプリで利用する方法もかなり簡単に実装可能です。


宣言するプロトコルは以下の二つ

UIImagePickerControllerDelegate, UINavigationControllerDelegate

importするlibrary

Photos


controllerでimport

import Photos


plistに情報を追加する
f:id:takanori5:20171018124410p:plain

f:id:takanori5:20171018171154p:plain

privacyと入力し、以下のcamera ...を選択
f:id:takanori5:20171018171810p:plain

valueには適当な文字列(カメラを使う)などを入力

これは許可画面に表示される文字に利用されます。


続いてPhotoLibraryも同様に追加
f:id:takanori5:20171018172226p:plain


以上で事前準備はOKです。

あとは実装していくだけです。

カメラを利用する場合には以下のように書きます。

(ちなみにアルバムを利用する場合は、UIImagePickerControllerSourceType.cameraのところを

UIImagePickerControllerSourceType.

photoLibraryに変更するだけであとは一緒です。)


        let sourceType:UIImagePickerControllerSourceType = UIImagePickerControllerSourceType.camera
        
        // カメラが利用可能かチェック
        
        if UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.camera){
            // インスタンスの作成
            let cameraPicker = UIImagePickerController()
            cameraPicker.sourceType = sourceType
            cameraPicker.delegate = self

            self.present(cameraPicker, animated: true, completion: nil)
        }

以上でOKです。

もし、撮影したimageをすぐ背景に適用したいなどであれば

imagePickerController というdelegateメソッドないに記述すればOK

Swift UITextFieldタップ時にUIDatePickerを表示する方法

以下のように、UITextFieldのタップ時にUIDatePickerを表示する方法を記載。

日本語のサイトにSwiftのver4.0での実装方法が載っておらず、苦戦したため備忘です。

 
f:id:takanori5:20171022101916p:plain


 

1.story boadにUITextFieldを配置し、ソースコードに関連付け

@IBOutlet var dateTextField: UITextField!

 

2.UITextFieldDelegateプロトコルを宣言

UITextFieldDelegate

class ViewController: UIViewController, UITextFieldDelegate {

 

3.viewDidLoadでdatePickerのインスタンスを生成し、フォーマットした値をtextFieldに入れる

    override func viewDidLoad() {

        super.viewDidLoad()

        dateTextField.delegate = self

        let datePicker = UIDatePicker()   

        // ②日本の日付表示形式にする

        datePicker.locale = NSLocale(localeIdentifier: "ja_JP") as Locale

        datePicker.addTarget(self, action: #selector(ViewController.datePickerValueChange(sender:)), for: UIControlEvents.valueChanged)

        dateTextField.inputView = datePicker

        

    }

 

 

 

XCodeが異常に重くなった時の対処法

XCodeで新規でプロジェクトを作りまくり開発を行なっていたところ

インジケーターがいちいち周り、異常に重くなり開発が進まなくなりました。

 

ログがたまりまくっていることが原因でした。

以下のコマンドでログを削除

これでめちゃくちゃ軽くなりました!!

mv ~/Library/Developer/Xcode/iOS Device Logs/ iOS* ~/backup_log/

Swift UserDefautsでUIImageを保存する方法

例えばフォトアルバムから取得したimageを背景などに設定し、

利用したい場合、取得したファイルを永続化する必要があります。

 

そんな時にはUIImageを一度NSData型に変換して保存します。取得するときに、再変換すればUIImageを取得することが出来ます。

 

以下のようなソースになります。

保存

 UserDefaults.standard.set(UIImageJPEGRepresentation(image, 0.8), forKey: "imageData")

        

 

取得

let imageDate:NSData = UserDefaults.standard.object(forKey: "imageData") as! NSData

        backImageView.image = UIImage(data:imageDate as Data)

超簡単!Swiftで音を再生する方法

Swiftを音を再生する方法は超簡単です。

 

ライブラリをimport

音の再生に必要なframeworkをimportしましょう!

importするframeworkは `AVFoundation`

 

 

以下のようにしましょう

まずプロジェクトを選択し、Generalの下の方の

Linked Framework and Libraries

 

f:id:takanori5:20171018124410p:plain

 

+ボタンをおし、AVFoundatioをadd

 

f:id:takanori5:20171018124844p:plain

 

これでプロジェクトでAVFoundationが利用できるようになりました。

 

続いて利用したいVIewControllerに取り込みましょう!

import AVFoundation

 

そしてAVAudioPlayerを宣言

var audioPlayer: AVAudioPlayer!

 

あとは音楽を再生したい箇所で以下のようにかけばOKです

 

        if let url = Bundle.main.url(forResource: "delete", withExtension: "mp3") {

            do {

                audioPlayer = try AVAudioPlayer(contentsOf: url)

                audioPlayer?.play()

            } catch {

                audioPlayer = nil

            }

        } else {

            //error

        }

 

audioPlayer?.play()で再生

stop()で停止できます。

 

超簡単ですね!!

 

takanori5.hatenablog.com