【Swift】現在の、年/月/日/時/分/秒、を別々に取得

どうも、ねこきち(@nekokichi1_yos2)です。

 

現在日時を取得する方法ですが、ネットの記事のほとんどが

  • 2020-03-12 15:11:02

の形で算出する方法しかなかったので、備忘録として記載。

 

ソースコード

 

let current = Calendar.current
print(current.component(.year, from: Date())) //年
print(current.component(.month, from: Date())) //月
print(current.component(.day, from: Date())) //日
print(current.component(.hour, from: Date())) //時
print(current.component(.minute, from: Date())) //分
print(current.component(.second, from: Date())) //秒

 

結果

  

f:id:nekokichi_yos2:20200426185045p:plain

 

f:id:nekokichi_yos2:20200426185113p:plain

【Swift】UUIDで重複しない固有IDを作る

どうも、ねこきち(@nekokichi1_yos2)です。

 

データベースにデータを保存する場合、

「どうやってユーザーとデータを紐付けるか」

の問題が発生します。

 

当然、ユーザー別に固有のID(データの羅列)が必要ですので、

  • 乱数

が思いつきます。

 

しかし、乱数は生成する度に別の文字列を生成するので、デバイス側で生成した乱数を保持しなくてはなりません。

 

もしデータ照合用に乱数をUserDefaultに保存しても、アプリを削除すれば、UserDefaultも削除されてしまいます。

 

そこで、UUID - ユニークID、の登場です。

 

 

UUIDとは?

 

一言で言うと、重複しない固有のID、です。

参考:https://wa3.i-3-i.info/word13163.html

 

例えば、IDやパスワードを設定する時、

  • 名前
  • 誕生日
  • キーワード

などの自分だけが知る要素を組み合わせます。

 

なぜなら、”自分だけ”の要素なので、他ユーザーと差別化でき、重複しづらくなるからです。

 

かといって、乱数ならまだしも、無限に近いパターンを生み出す法則や算出方法がない限り、99%重複しないIDを作るのは困難です。

 

しかし、UUIDは予め重複しないIDを生成されるよう設計されてるので、手軽に固有のIDを作れちゃいます。

(確率的にUUIDが重複する確率はほぼ0なので、心配する必要なし。)

 参考:

 

また、UUIDを利用することで

  • バイス別にUUIDが決まっている
  • UUIDの生成コードで呼び出すだけ
  • 変数などで保持しなくても良い

の利点を活かせます。

 

なので、

  • どうやってIDを生成するか
  • どこにIDを保持しておくか

を考える必要がなくなり、データ紐付けの実装が楽になります。

 

UUIDの生成方法

 

let uuid = UIDevice.current.identifierForVendor!.uuidString
print(uuid)

 

回数やアプリの初起動に関わらず、常にUUIDは同じです。 

 

 シミュレータでもUUIDが生成されます。

↓ 

iPhone 8

f:id:nekokichi_yos2:20200426181222p:plain

 

iPhone 8 Plus

f:id:nekokichi_yos2:20200426181235p:plain

 

iPhone 11

f:id:nekokichi_yos2:20200426181251p:plain

 

【Swift】ScrollViewでページングを実装

こんにちは、@nekokichi1_yos2です。

 

ScrollViewでページ送りのアニメーションを実装する場合、下記のコードを打つか、

scrollView.isPagingEnabled = true

インスペクタの"Paging Enabled"にチェックを入れます。

f:id:nekokichi_yos2:20200314115340p:plain

 

初期設定のScrollView

↓ 

 

 

PagingEnabledが可能になったScrollView

 

ただ、ページングを実装する際に注意点があります。

 

”1度のページングでScrollViewの大きさだけ移動させる”なら、ScrollViewで実装するUIViewの幅(もしくは高さ)は

  • ScrollView.frame.size.width(もしくはheight) x ○(数字)

にする必要があります。

 

もしScrollViewのサイズで割り切れないサイズを設定すれば、下記のように中途半端な幅が余ってしまいます。

(iPhone8のシミュレータ(幅375)で実装。UIViewの幅を1200に設定)

 

仮に各ページ(ページング後のScrollView)の中央にUI部品を設置する際、ScrolViewのサイズに合わせた方が、

  • ScrollViewの幅 / 2 - (UI部品の幅 / 2)
  • ScrollViewの高さ / 2- (UI部品の高さ / 2)

のように調整しやすくなります。

 

なので、1度のスワイプでScrollViewをページングするなら、UIViewをScrollView x 数字のサイズにした方がいいでしょう。 

 

import UIKit

class ViewController: UIViewController {
    
    @IBOutlet weak var scrollView1: UIScrollView!
    
    var vc1 = UIView()

    override func viewDidLoad() {
        super.viewDidLoad()
        
        //ScrollView上に要素を配置
        horizontalScroll()
        //ScrollViewのページングを可に
        scrollView1.isPagingEnabled = true
    }
    
    //横スクロール
    func horizontalScroll() {
        vc1.frame = CGRect(x: 0, y: 0, width: scrollView1.frame.size.width * 6, height: scrollView1.frame.size.height)
        for i in 0...6 {
            let button = UIButton()
            button.frame = CGRect(x: (i*200), y: 30, width: 80, height: 55)
            button.setTitle("\(i)", for: .normal)
            button.setTitleColor(.white, for: .normal)
            button.layer.borderWidth = 1
            vc1.addSubview(button)
        }
        scrollView1.addSubview(vc1)
        scrollView1.contentSize = vc1.bounds.size
    }

 

 

【Swift】ScrollViewで何ページ目か(現在地)を確認

こんにちは、@nekokichi1_yos2です。

 

 

(ページングの実装)

nekokichi2yos2.hatenablog.com

 

 ScrollViewで今現在、何ページ目かを知りたい時、contentOffset、を使えばわかります。

 

 contentOffsetとは、初期位置(0,0)からどれだけ移動したかを示すもの。

(ScrollViewで言うと、(0,0)からどれだけスクロールしたかを示す)

 

x,y座標のそれぞれを取得するなら、contentOffset.x、contentOffset.y、と指定するだけです。

 

例えば、iPhone 8の幅の分だけスクロールした場合、contentOffset.xの値はiPhone 8の幅の値となります。

 

画面サイズを1ページとすると、仮にScrollViewで実装するUIViewの幅がiPhone 8の幅ならば、

  • contentOffset.x / iPhone 8 の幅 = 初期ページから何ページ目にスクロールしたか

がわかります。

 

iPhone8の幅が375.0で、750.0(2画面の幅)だけ移動したなら、

  • 750.0 / 375.0 = 2.0(ページ目)

 に移動したことになります

 

とりあえず、

  • contentOffsetは(0,0)からの移動量 
  • contentOffset / 画面サイズ = ○ページ目(いくつ画面サイズを移動したか)

と覚えておきましょう。

 

import UIKit

class ViewController2: UIViewController,UIScrollViewDelegate {
    
    @IBOutlet weak var scrollView: UIScrollView!
    @IBOutlet weak var label: UILabel!
    
    //ScrollView用のUIView
    let vc = UIView()
    
    override func viewDidLoad() {
        super.viewDidLoad()

        scrollView.delegate = self
        
        label.text = "\(Int(self.scrollView.contentOffset.x / self.scrollView.frame.size.width))ページ"
        
        //ScrollViewの上にView - labelを設置する
        createScrollView()
    }
    
    func createScrollView()  {
        //scrollViewの幅と高さ
        let width = Int(self.scrollView.frame.size.width)
        let height = Int(self.scrollView.frame.size.height)
        //origin.x,origin.y:UI部品のx,y座標
        //今回は4ページなので、scrollView.frame.size.width * 4
        vc.frame = CGRect(x: scrollView.frame.origin.x, y: scrollView.frame.origin.x, width: CGFloat(width) * 4, height: CGFloat(height))
        //Viewの上にlabelを設置していく
        for i in 0...3 {
            let label = UILabel()
            //UI部品のx,y座標は左上の角なので、それぞれの幅と高さの半分を引く
            //移動したページの分だけ座標も加算されるので、(width * i)
            label.frame = CGRect(x: (width / 2) - 75 + (width * i), y: height / 2 - 25, width: 150, height: 50)
            label.textColor = .black
            label.textAlignment = .center
            label.backgroundColor = .cyan
            vc.addSubview(label)
        }
        //scrollViewの上にViewを設置
        scrollView.addSubview(vc)
        scrollView.contentSize = vc.bounds.size
    }
    
    func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
        //ページの移動後、現在のページ番号をlabelに表示
        label.text = "\(Int(self.scrollView.contentOffset.x / self.scrollView.frame.size.width))ページ"
    }

}