dasukoの技術ブログ

現役エンジニアのブログです。

【Swift】UITabBarController

はじめに

今回はUITabBarControllerを使ってみたいと思います。

公式ドキュメントはこちらです!

Apple Developer Documentation

 

UITabBarControllerは複数のViewControllerを管理してくれるContainerViewControllerで、

画面の下部にタブが表示され、ユーザが選択したタブによって表示するViewControllerを切り替えてくれます!

 

UIPageViewControllerについてはこちらで解説してますので、興味のある方は見てみてください!

dasuko.hatenadiary.jp

実装

import UIKit

public class ViewController: UITabBarController {
    
    public override func viewDidLoad() {
        super.viewDidLoad()
        
        // 背景が赤色のViewController
        let redVC = UIViewController()

        // タブのアイコンはブックマークを指定
        redVC.tabBarItem = UITabBarItem(tabBarSystemItem: .bookmarks, tag: 1)
        redVC.view.backgroundColor = .red

        // 背景が青色のViewController        
        let blueVC = UIViewController()

        // タブのアイコンはダウンロードを指定
        blueVC.tabBarItem = UITabBarItem(tabBarSystemItem: .downloads, tag: 2)
        blueVC.view.backgroundColor = .blue
        
        setViewControllers([redVC, blueVC], animated: true)
    }
}

 

実行するとこのようになります

gyazo.com

下のタブを選択する度に、で表示されているViewControllerが切り替わっているのが分かります!

 

必要な手順は以下のような流れです

  1. ViewControllerインスタンス
  2. ViewControllertabBarItemを指定
  3. setViewControllersでViewControllerのArrayを指定

 

UITabBarItemでブックマークアイコン、ダウンロードアイコン以外に指定できるアイコンについてはこちらをご確認ください。

Apple Developer Documentation

 

また、UITabBarItemには以下のようなイニシャライザも定義されており、

独自の画像を指定することも可能です。

convenience init(title: String?, 
           image: UIImage?, 
             tag: Int)

プロパティ

selectedIndex

self.selectedIndex = 0

selectedIndexを初回に設定することにより、そのインデックスのタブ(ViewController)を選択した状態にすることができます

また、現在選択中のタブのインデックスを取得できます。

selectedViewController

selectedViewControllerを参照することにより、現在選択されているViewControllerを参照することができます

tabBar

UITabBarControllerに紐づくタブバー(UITabBar)を取得できます。

デリゲート

デリゲートは一つのみご紹介します。

func tabBarController(UITabBarController, didSelect: UIViewController)

タブが選択された時に呼び出されます!

タブを選択したときに画面をリロードするみたいなことができると思います!

参考

Apple Developer Documentation

【プログラミング】プログラミングに関する質問募集します

コメントでプログラミングに関する質問を募集します!

私自身も全ての分野に精通しているわけではないので、100%回答できるわけではないですが、

一緒に悩み、考えることはできます!

 

ちなみに自己紹介記事はこちら

dasuko.hatenadiary.jp

 

 

大切なのは思考のプロセスです!

ちなみに私自身は主にモバイルアプリの開発をしています!

   

また、質問がない方でも気軽にコメントしてください^ ^

 

プログラミングは時には大変な時もあると思いますが、

助け合いこそ大事だと思うので、みんなで助け合い、みんなで更にスキルを高められるように頑張りましょう^^

 

(もちろんプログラミング以外のご意見や質問もお待ちしております)

【Swift】UIPageControlを使ってみる

はじめに

今回はUIPageControlを使ってみます!

公式ドキュメントはこちらです。

Apple Developer Documentation

UIPageControlは水平方向にページング用のドットを複数表示します。

これだけだと伝わらないと思うので、最後にgif載せます!

 

今回の実装では、前回のUIPageViewControllerを使用しています。

dasuko.hatenadiary.jp

実装してみる

今回は前回使ったUIPageViewControllerと組み合わせてUIPageControlを使ってみたいと思います!

import UIKit

class PageViewController: UIPageViewController {
    // ViewControllerを管理する
    var controllers: [UIViewController] = []
    var pageControl: UIPageControl!
    
    override func viewDidLoad() {
        super.viewDidLoad()

        // 赤いViewController
        let redVC = UIViewController()
        redVC.view.backgroundColor = .red
        
        // 青いViewController    
        let blueVC = UIViewController()
        blueVC.view.backgroundColor = .blue

        controllers = [redVC, blueVC]
        // 最初のViewControllerを赤色のViewControllerを設定
        setViewControllers([controllers[0]], direction: .forward, animated: true, completion: nil)
        self.dataSource = self
        
        pageControl = UIPageControl(frame: CGRect(x:0, y:self.view.frame.height - 100, width:self.view.frame.width, height:50))
        pageControl.numberOfPages = controllers.count
        pageControl.currentPage = 0
        self.view.addSubview(pageControl)
    }
}

// MARK: - UIPageViewControllerDataSource
extension PageViewController: UIPageViewControllerDataSource {
    func presentationCount(for pageViewController: UIPageViewController) -> Int {
        return controllers.count
    }
    
    func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? {
        var index = controllers.firstIndex(of: viewController)!
        pageControl.currentPage = index
        index = index - 1

        if index < 0 {
            return nil
        }
        
        return controllers[index]
    }
    
    func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? {
        var index = controllers.firstIndex(of: viewController)!
        pageControl.currentPage = index
        
        if index == controllers.count - 1 {
            return nil
        }

        index = index + 1
        return controllers[index]
    }
}

プロパティ

現在のページを指定するにはcurrentPageに現在のページのインデックスを設定します。

pageControl.currentPage = 0

 

表示するページ数を設定します。

pageControl.numberOfPages = controllers.count

UIPageControlのドットの色を指定します。

pageControl.pageIndicatorTintColor

実行してみる

実行してみました。

少し判定がシビアで、ページを完全に切り替えないと、UIPageControlに反映されないですね gyazo.com

参考

Apple Developer Documentation

PageViewControllerとPageControl - すいすいSwift

【Swift】PageViewControllerを使ってみる!画面遷移の実装

はじめに

今回はUIPageViewControllerを使ってみます!

面倒なのでStoryboardは使わずにやってみます!

 

UIPageViewControllerはこちらです!

Apple Developer Documentation

PageViewControllerを使ってみる

今回は

import UIKit

class PageViewController: UIPageViewController {
    // ViewControllerを管理する
    var controllers: [UIViewController] = []
    
    override func viewDidLoad() {
        super.viewDidLoad()

        // 赤いViewController
        let redVC = UIViewController()
        redVC.view.backgroundColor = .red

        // 青いViewController        
        let blueVC = UIViewController()
        blueVC.view.backgroundColor = .blue

        controllers = [redVC, blueVC]
        // 最初のViewControllerを赤色のViewControllerを設定
        setViewControllers([controllers[0]], direction: .forward, animated: true, completion: nil)
        self.dataSource = self
    }
}

// MARK: - UIPageViewControllerDataSource
extension PageViewController: UIPageViewControllerDataSource {
    func presentationCount(for pageViewController: UIPageViewController) -> Int {
        return controllers.count
    }
    
    func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? {
        if let index = controllers.firstIndex(of: viewController),
           index > 0 {
            return controllers[index - 1]
        }
        return nil
    }
    
    func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? {
        if let index = controllers.firstIndex(of: viewController),
           index < controllers.count - 1 {
            return controllers[index + 1]
        }
        
        return nil
    }
}

ViewControllerの設定

setViewControllers([controllers[0]], direction: .forward, animated: true, completion: nil)

ここでViewControllerを設定しています。

directionforwardに指定していますが、reverseもあります。

direction  
foreward 左から右にフリックするとページが進みます
reverse 右から左にフリックするとページが進みます

実行してみたらこんな感じになります。

ページをめくるようなアニメーションが自動で導入されるんですね!

gyazo.com

DataSource

今表示しているViewControllerの前のViewControllerを指定します。

nilを返した場合はページを前に戻すことができなくなります。

(一番最初のページの場合など)

func pageViewController(_ pageViewController: UIPageViewController, 
   viewControllerBefore viewController: UIViewController) -> UIViewController?

  今表示されているViewControllerの後に表示するViewController を指定します。

(一番最後のページの場合など)

func pageViewController(_ pageViewController: UIPageViewController, 
    viewControllerAfter viewController: UIViewController) -> UIViewController?

ページインジケータに表示するインデックス

optional func presentationIndex(for pageViewController: UIPageViewController) -> Int

ページインジケータに表示するアイテムの数

optional func presentationCount(for pageViewController: UIPageViewController) -> Int

TransitionStyle

ページ遷移するときのスタイルを指定できます。

これは後から変更できず、Storyboardから設定する場合はTransitionStyleから設定します。

コードから設定する場合はUIPageViewControllerインスタンスを初期化するときに

以下のメソッドを使います。

init(transitionStyle style: UIPageViewController.TransitionStyle, 
navigationOrientation: UIPageViewController.NavigationOrientation, 
options: [UIPageViewController.OptionsKey : Any]? = nil)
TransitionStyle
pageCurl ページをめくるようなアニメーションが実行されます
scroll スクロールでページをめくります(ページをめくるアニメーションなし)

PageCurlの場合

gyazo.com

Scrollの場合

gyazo.com

参考

【Swift】Swift入門 ~ UIPageViewControllerを使ってみる ~ | blog(スワブロ) | スワローインキュベート

【Swift】Page View Controllerの設定。画面遷移のアニメーションを変更する。(Swift 2.1、XCode 7.2) | はじはじアプリ体験メモ

【Swift】Realmを使ってみた

Realmとは

Realmとはモバイル向けのデータベース管理システムライブラリです。

オープンソースで実装も確認することができます。

github.com

iOSはこちら

github.com

 

ちなみにRealmがサポートしている言語はSwiftだけではなく、以下のような言語をサポートしています。

Realmの特徴

データベースアクセスが高速

Realmの特徴はなんと言ってもデータベースアクセスが高速であることです。

SQLiteよりも高速であると言っているので、かなり速いですね。

こちらの記事でもSQLiteとのパフォーマンスの比較をしていますが、

InsertでもSelectでもReadでもUpdateでもRealmの方が速いという結果になっています。

tech.iheart.com

実装がシンプル

Realmはかなり直感的に理解できる非常にシンプルなライブラリです。

また、オープンソースなので実装をいつでも確認できるというのも大きいですね。

後述しますが、モデルクラスも簡単に定義できます。

インストール

インストール方法としては、以下の選択肢があります。

インストールの選択肢が多いのも魅力の一つかもしれないですね。

  • Dynamic Framework
  • Swift PM
  • CocoaPods
  • Carthage

CocoaPodsでインストール

今回はCocoaPodsでインストールしました。

CocoaPodsでインストールする場合はPodfileに以下を追加して、pod installします。

pod 'RealmSwift'

実装

Realmの初期化

Realmを初期化する場合は以下のようにします。

let realm = try! Realm()

引数にConfigurationを渡して、インメモリで使用するようにすることも可能です。

モデルの定義

モデルを定義する場合はObjectを継承したクラスを実装します。

Realmでサポートしている型はBoolIntInt8int16Int32Int64DoubleFloatStringDateDataです。

上記の型を使用する場合は、@objc dynamicをつける必要があります。

class Model: Object {
    @objc dynamic var name: String? = nil

オブジェクトの取得

Realmのデータベースからオブジェクトを取得する場合は以下のように書くことができます。

let realm = try! Realm()
let model = realm.objects(Model.self).first

filterを使うこともできます。

let realm = try! Realm()
let model = realm.objects(Model.self).filter("id == \(id)").first

オブジェクトの追加

Realmのデータベースにオブジェクトを追加する場合は、writeブロックを使用します。

let realm = try! Realm()
let model = Model()

try! realm.write {
    realm.add(model)
}

オブジェクトの更新

Realmのデータベース内のオブジェクトを更新する場合は、データベースからオブジェクトを取得し、

writeブロック内でオブジェクトの値を変更します。

let realm = try! Realm()
let model = realm.objects(Model.self).filter("id == \(id)").first

try! realm.write {
    model.name = "Model"
}

まとめ

Realmは高速なデータベースである上に、非常にシンプルに実装することができ、

わからない点があってもオープンソースであったり、ドキュメントが公開されていたり、利用している人が多いこともあって すぐに調べて解決することができます。

データベースを更新するときにはMigrationが必要になるので、その点だけ注意です。

(詳しくは以下参照)

docs.mongodb.com

参考

github.com

docs.mongodb.com

世の中の人全員が幸せになる方法を考えてみた(みんなで幸せになりたい(*^^*))

こんにちは!dasukoです(⌒▽⌒)

今回はみんなが幸せになるにはどうしたらいいかというのを考えてみたいと思います( ^ω^ )

 

 

どういうときに幸せを感じるか?

まず、人はどういう時に幸せを感じるか?を考えてみたいと思います。

これは完全に個人の見解となるので、間違っていたら指摘してください( ̄∇ ̄)

 

  • 自分が好きなこと、熱中できることをやっているとき
  • 課題を解決できたとき、目標を達成できたとき
  • 人から褒められたとき、認められたとき
  • 充実感を感じたとき

 

個人的にはこの4つかなと思ってます。

 

お金持ってたら幸せを感じるんじゃない?と思う人もいるかもしれませんが、

それは完全にお金を持っていない人の意見であり、

お金を持っていても、友達がいなかったり、人から褒められることがなかったり、

日々の生活に充実感を感じていない人はたくさんいます。

 

お金を稼ぐことが目的である場合は、2つ目の自分の目標を達成できた時に該当するので、

その瞬間は幸せを感じることはあると思います^ ^

 

これらは自己承認欲求が満たされた時や、嬉しい楽しいなどポジティブな感情が生まれた時に幸せを感じている

と言い換えられるかもしれません。

課題を解決できたとき、目標を達成できたとき

これは達成感って呼ばれてるやつですかね^ ^

  成功している人の多くは目標を常に立てていますよね^^

目標を達成した時に達成感及び幸せを感じているからこそ

次の新たな目標をまた立て、また幸せを感じることができ、

結果として成功していると思っています。

自分が好きなこと、熱中できることをやっているとき

正直これが一番大事で、

自分が好きなこと、熱中できることをしている時に幸せを感じるというのは理解してもらえると思うのですが、

趣味がない人って本当に幸せを感じる機会が少ないと思うんですよね…

 

如何に自分が好きなこと、熱中できることを見つけることができるかが、自分が幸せになれるかどうかを決めると思っています!

人から褒められたとき、認められたとき

これはよく自己承認欲求と呼ばれる「人は誰かから認められたい存在」というやつですね

これに関しては敢えてあまり深く言及しないこととします^^

充実感を感じたとき

これに関しては他の項目と重複する場合が多いです。

重複しないケースで言うと、予定をたくさん詰め込んでいる時!などがあります

一日の予定をたくさん詰めることにより、充実感を感じることができ、

また、ネガティブな感情が生まれる余裕がなくなります。

結果として幸せを感じやすい環境になると言えます。

 

また、結婚して子供を産んで、家族で生活している場合、

目標を達成したり、好きなことができなくても

家族と生活している何気ない日々に充実感を感じている人も多いのではないでしょうか?

(独身の意見です。違ったらごめんなさい)

どういう時に幸せを感じるかの結論

後述しますが、人生で充実感を感じていない人、幸せを感じていない人の多くは

が原因だと思っています。

つまり、特に何もやることがないって状態の人です。

目標もない、趣味もない、人から褒められることもできていない。

 

このつまらないと感じてしまっている人生を大きく変えるためにできることは何か?

 

この中であれば、趣味を見つけることではないでしょうか?

不幸を感じるのはどんなときか?

  • 嫌だと思うことがあったとき
  • 孤独な時
  • 幸せを感じる条件のどれにも当てはまらない

嫌だと思うことがあったとき

嫌なことがあったときは、不幸を感じるのは当然ですね…

まあ嫌だと感じないようにするということも解決策としてあるかもしれませんが、

嫌なことを感じている場合、それはその一瞬だけということが多いのではないでしょうか

つまり、総じて人生で幸福感を感じていない理由にこれは該当しないと思います

孤独な時

孤独を感じた時、人は不幸だと感じますね

孤独が嫌だから友達と群がりたがったり、SNSでみんなと繋がりたかったり、

結婚したい、恋人がほしいと思うのでしょうね。

 

どうすれば孤独を感じなくなるでしょうか?

それは後述する結論で述べたいと思います

幸せを感じる条件のどれにも当てはまらない

これに該当するのが家にいても何もやることがない人です。

趣味や習慣がなかったり、自分が熱中できることがない人です。

幸せを感じることがないと、自然と不幸を感じたりもするものです。

特に何もやることがないというの状態をできるだけ避けましょう!

どうすれば不幸を感じないか?

孤独な時、もしくは幸せを感じる条件のどれにも当てはまらないときに多く不幸を感じますが、

不幸を感じないようにするにはどうすればよいでしょうか?

 

人は感情をコントロールできません。

ネガティブなことを考えている人は、ネガティブなことを考えたいと思っていません。

では、考える余裕を作らなければいいのではないでしょうか?

 

このアプローチで不幸を感じないようにする簡単な解決方法は2つあると思います。

結婚するのがいいっていうのはハードルも高いし、ネガティブなことを考える時間はできてしまうので除外)

一つ目は好きなこと、熱中できることをやるです

これは幸せを感じる条件にもありました。

人は熱中している時、そのこと以外のことは考えられないものです。

ゲームに集中しているときに会社であった嫌なことを忘れていたり、美味しいものを食べているときに誰かと喧嘩したことを忘れていたり

といった経験はないでしょうか???

 

熱中できることを探すのが幸せになる一番の近道だと思います。

二つ目は無の状態をなくすです

つまり、予定を埋めましょうということです。

忙しくなれば、自然と無駄なことを考える時間がなくなります。

すると、必然的にネガティブな思考をする余裕がなくなります。

これで絶対に幸せを感じるというわけではないですが、不幸せを感じることは少なくなるでしょう。

(充実感を感じることができれば、幸せも感じれるようになるはず)

結論

どうやったら幸せになれるかの結論です。

結論としては、趣味や習慣を増やしましょう!

そして、目標をできるだけ立てて、それを達成できるように頑張りましょう!

 

例えば、一ヶ月毎日ブログを書くという目標を立てると、それは習慣となりますね^^

一ヶ月後に目標が達成できたとき、「やったー!目標達成できたー!」と幸せを感じることができるのではないでしょうか?

また、ブログを書くのには多くの時間がかかります。

(社会人であれば、帰宅後ブログを書くことになるので、かなり大変だと思います)

つまり、ネガティブな思考をする余裕がかなりなくなるわけです!

これにより、不幸を感じる機会が減り、幸せを感じる機会が増えるわけです^^

ブログでアクセスが増えると、人から認められているように感じることができ、自己承認欲求も満たされるかもしれません

 

ブログを書くというのはあくまで一例ですが、

何か趣味や習慣を見つけ、目標を立て実行してみることをオススメします( ✌︎'ω')✌︎

 

私自身はみんなで幸せになりたいと思っているので、

目標を立てたり、習慣を決めた時やそれらを実行しているときに

何か困ったことがあれば、いつでも相談してください^^

全力でサポートします!!!!!!!٩( 'ω' )و

 

 

あーーーうまく書けなくてごめんなさい!!!

文章練習中です!

頑張ります(^○^)

今更自己紹介してみたw

はじめまして!

dasukoです!!!

 

今更ですが、自己紹介をします^ ^

めっちゃ今更w

 

学歴的には、大卒です!

理由は大学院に行く理由がなかったからです!

 

正直、大学も行かなきゃよかったなーと後悔してたりします

大学の授業を通して得られるスキルや知識より、実際の業務を通して得たスキルの方がより実用的であることは明らかだからです>_<

 

大学卒業後は、何回か転職をしながらも、いくつかの有名企業でエンジニアをしています^ ^

転職や就職はあまり苦労したことがなく、新卒の時の就職活動も第一志望の1社しか受けてません!

就職活動にはセンスがあって、自分にはそのセンスがあるのかなーと思います

 

なので、時々就活についての情報も発信していければと思ってます^^

 

 

社会人になってからはずっとエンジニアをしてます!

なので、一エンジニアとして技術的な情報やエンジニアの日常を発信していきます٩( 'ω' )و

 

 

ブログを始めた理由は、退屈な日常を変えたかったからです!

より詳しく言うと、、、人は時間をもて余せば余すほど、幸福度が下がると思ってます

敢えて習慣を一つ増やし、一日の予定を詰め込むことにより、幸せを感じたくてはじめました^^

 

あとは、少しでも人の役に立ちたいと思っています!

人の役に立てるような情報発信ができるようにがんばっていきます(^○^)

 

もう一つ理由をあげると、文章を書くのが得意ではないので、

克服したくて、ブログをはじめました( ^ω^ )

※普段は顔文字も使いませんwww

 

 

あとは、、、

歳はアラサーです

 

趣味は

  • ゲーム
  • 料理
  • 個人開発
  • ジム
  • 英会話

っていう感じです^^

 

ゲームはモバイルゲームばかりやってます!

(最近はAmong usやりたいけど友達がいないからできないです....T_T)

  

個人でアプリ開発をしていたりもするので、アプリ開発も趣味です^^

 

ジムには毎日行ってます!!

英会話もなるべく毎日やってます^^

 

あとは最近本当に実験的に動画を撮影して編集してYoutubeにアップロードするっていうのをやってますw

※Youtuberは目指してないですw

 

こんな感じですかね。。。

 

TwitterのフォローやDMは気軽にしてください^^

 

コメントでも大丈夫です^^

 

みなさん!よろしくお願いします!