20190512のiOSに関する記事は6件です。

Flutter始めてみる 〜環境構築からDemoアプリ起動編〜

こんにちはひろにぃです。
タイトル通りやっていきます。

目次

  • 作業環境
  • Flutterのインストール
  • 依存ツールのチェック
  • Android Studioの設定
  • Demoアプリの起動

作業環境

  • macOS Mojave version 10.14.4
  • Flutter v1.5.4-hotfix.2 // Stable版
  • Android Studio 3.4
  • Android SDK version 28.0.3
  • Xcode 10.2.1

Flutterのインストール

ではインストールします。

公式URL https://flutter.dev/docs/get-started/install/macos

$ cd
$ git clone -b stable https://github.com/flutter/flutter.git
$ echo "export PATH=$PATH:$HOME/flutter/bin" >> ~/.zshrc
$ source ~/.zshrc

これでFlutterのインストール完了です。続いて、Flutterに必要なツールがインストールされているかチェックします。

依存ツールのチェック

$ flutter doctor

実行すると以下の画像のように依存ツールがインストールされているかの有無が表示されます。
問題がある場合は、指示に従って修正してください。

スクリーンショット 2019-05-11 21.42.07.png

[!] Android toolchain

ほかのエラーはbrewでインストールしろと書いてありますが、これだけはURL先を見ろと言われます。
Terminalに書いてある通りアップデートしてやりますが、つまずいたところがあるのでここにメモします。

# update
$ ~/Library/Android/sdk/tools/bin/sdkmanager --update

ERROR: JAVA_HOME is set to an invalid directory
上記を実行するとこのようなエラーが出るかもしれません。
その場合は、 $JAVA_HOME を有効なものに変更してください。

# 解決例の一つ
$ brew tap homebrew/cask-versions
$ brew cask install adoptopenjdk8

$ echo $JAVA_HOME
# /Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Home

アップデート後、ライセンスを有効にしてやります。

$ flutter doctor --android-licenses

Android Studioの設定

FlutterとDartのプラグインをインストールします。
Configure -> Plugins と移動しMarketPlaceでFlutterとDartで検索して当該プラグインをインストールします。
その後、IDEを再起動します。

スクリーンショット 2019-05-12 23.08.22.png

するとAndroid Studioのトップ画面に Start a new Flutter Project が追加されています。

スクリーンショット 2019-05-12 23.09.43.png

それをクリックしプロジェクトを作成していきます。

Demoアプリの起動

まず、Flutter Application を選択します。

スクリーンショット 2019-05-12 23.12.17.png

名前と保存先をテキトーに決めて 次へ

68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3135383332342f30643962643939332d313431382d303562652d643131652d3533653862303134613966622e706e67.png

今回はDefaultのDemoアプリを起動するのでなにもいじらずこのままで Finish します。

スクリーンショット 2019-05-12 23.13.15.png

プロジェクトが開いたら、画面右上にある <no devices> と書かれたところをクリックして ios, Android のエミュレーターを起動します。

スクリーンショット 2019-05-12 23.13.58.png

エミュレーターが起動したら下記のようになります。
buildターゲットを選択し、横にある横三角ボタンで実行してください。

スクリーンショット 2019-05-12 23.15.34.png

すると、以下のようになります。

スクリーンショット 2019-05-12 23.05.05.png

以上です。お疲れ様でした。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【iOS】画面遷移方法まとめ

画面遷移の方法についてまとめます。

プッシュ遷移とモーダル遷移

まずiOSアプリには、2種類の画面遷移方法があります。

  • プッシュ遷移
  • モーダル遷移

実装方法は後に書きますが、まずは両者の使い分けについて整理します。

プッシュ遷移

雑に説明すると、普通の画面遷移のことです。
プッシュと呼ばれているのは、NavigationContollerが画面のスタックを持っていて、
そのスタックにpushしながら遷移するからだと思われます。
具体的なユースケースとしては、モーダル遷移にすべきじゃないとき全部という感じですが、挙げるとすれば下記でしょうか。

  • NavigationBarの戻る・進むボタンで移動することが想定される画面

モーダル遷移

「モーダル」(modal)という言葉をどう訳せばいいのか、色々調べてもわからなかったのです。
よく下からニュッと出てくる画面、とか説明されます。
単に、下から次の画面を出すのが目的ではありません。

Modalityという単語の意味は、いくつか意味があるのですが、

2.(生理学)視覚、聴覚、触覚などの五感や感覚。また、それらを用いて外界を知覚する手段のこと。また、それらの感覚に働きかける人工的な情報伝達手段。
モダリティ - ウィクショナリー日本語版

多分ここでは「五感に訴えかける人工的な情報伝達手段」の意味なのだと思われます。
なんかいくつか検索して出てきた日本語記事見ましたが、上手い訳語をあててる例があまりないですね。。。
意味を考えると、この場では「応答待ち」とかがいいんだと思います。

Human Interface Guidelinesから該当箇所を丸々引用すると、

(拙訳)
Modality(応答待ち)は、ユーザーがタスクを完了させるか、メッセージorビューを却下するまで、他の動作をさせないためのものです。アクションシート(?)、アラート、アクションビュー(?)で応答待ち処理を実装できます。応答待ちのビューが画面に表示されたら、ユーザーはボタンをタップするか、応答待ち処理から抜けるかを選ばなければいけません。
Modality creates focus by preventing people from doing other things until they complete a task or dismiss a message or view. Action sheets, alerts, and activity views provide modal experiences. When a modal view appears onscreen, the user must make a choice by tapping a button or otherwise exiting the modal experience.
Human Interface Guidelines

つまりユーザーに絶対に入力させたい情報がある場合に、一時的に画面遷移を発生させる処理がモーダル遷移です。
Human Interface Guidelinesでも書かれていますが、多用すべき方法ではありません。
基本的に何かメインの処理をしたいユーザーを、別の操作をさせて妨害することになるので、多用するとUXが低下するので、本当に必要なケース以外で使うべきではありません。
たとえば動画アプリを入れたのに、動画を再生するまでにアラート画面が何個も出て、そのたびに「OK」を押さなければいけないのはうっとうしいですよね?

具体例は下記のようなケースです。

  • デバイスへのアクセス許可(カメラ、アルバム、位置情報など。これは最低限やらないと、App Storeに公開できません)
  • ユーザーID/パスワードの入力画面
  • テーブルビューの各アイテムへのアクセス(たとえばメーラーの個別のメール閲覧など)

Interface Builderか、コードか

さて、具体的な実装方法についてまとめていきたいのですが、
単純な画面遷移であれば、Interface Builderを使って、StoryBoardを編集すれば、プログラミングなしで実装可能です。
たとえばユーザーが画面のボタンを押したら画面が動く処理であれば、GUIで簡単に作れます。
ただもっと複雑な条件をつけたいのであれば、コードを書く必要があります。

Interface Builder

Interface Builderを使った方法を説明します。

Interface Builderでプッシュ遷移する

ノンプログラミングで、画面遷移を実装する方法を書きます。
image.png
完成形としてはこんな感じです。

下記の手順でいけます。

  1. 「Single Page Application」として新しいプロジェクトをつくる
  2. 「Main.storyboard」を選択
  3. 表示されているView Controllerを選択
  4. 「Editor」→「Embed In」 →「Navigation Controller」を選択
  5. 新たなView Controller(遷移先の画面)を追加する
  6. 一枚目のView ControllerにButtonを追加
  7. Controlを押しながら、追加したButtonを二枚目の画面へドラッグアンドドロップ ※わかりやすいように、一枚目の背景を赤、二枚目の背景を青に変えています。

ここまでやると、下記のような表示が出ると思います。
ちなみに、この矢印をSegue(セグウェイ)と呼びます。

image.png
「Show」を選択すると、プッシュ遷移ができます。

シミュレータで起動すると、こんな画面です。
image.png
Buttonを押してみましょう。

image.png
二枚目に遷移しましたね。
Navigation BarのBackを押すと前の画面に戻れます。

Interface Builderでモーダル遷移する

モーダル遷移も、プッシュ遷移と途中まで同じ方法で実装できます。

image.png
このとき、「Present Modally」を選択しましょう。
モーダル遷移に設定できます。

モーダルで遷移させた際は、Navigation Barが表示されません。
ここがプッシュ遷移との大きな違いです。
現在説明しているアプリの例だと、モーダル遷移にすると戻れなくなります。
モーダル遷移先の画面を閉じる処理は、何かしら開発者が実装する必要があります。

用語の整理

Interface Builderで画面と画面を結んでいる矢印をSegue(セグウェイ)と呼びます。
また、画面をSceneと呼びます。
Storyboard上で、SceneとSceneを結ぶのがSegueです。

コード

コードで画面遷移します。
Interface Builderは細かいUIを直感的に調整できるので、基本的には使うべきです。
ただ、エンジニアからすると、コードの外でUIの設定を持つので、ちょっと扱いづらいところがあるので、
原理主義的な人だと、Interface Builderは一切使わず、すべてコードでやってしまいます。
それはちょっと過激派ですが、Interface Builderでどこまでやるかはチームによるみたいです。
コードで画面遷移を実装する場合、Segueを使うか、使わないかが焦点になると思います。
やり方としては、どっちでもできます。

Segueを使ったプッシュ遷移

厳密に言うと、最初に紹介したInterface Builderを使って遷移する方法もSegueを使ったものです。
ただそのSegueの発動ポイントを、コード中に書くか書かないかの違いです。
Interface Builder上で、遷移元のViewControllerをControlを押しながらドラッグして遷移先のViewまでドロップしてください。
ドロップする際に、先程と同様に「Show」とか「Present Modally」とかを選ぶことになると思いますので、「Show」を選択してください。
すると2つのViewの間に矢印が出来たと思います。

image.png
この矢印がSegueをあらわしています。
Segueのidentifierに名前を入れましょう。
なんでもいいですが、ここでは例としてSegueNameと入れています。

そして、遷移元のViewController中で、画面遷移させたい場面に、下記のコードを入れてください。

//SegueNameはInterfaceBuilder上で自分がつけた名前にしてね
    performSegue(withIdentifier: "SegueName", sender: nil)

senderに変数を指定すると、値が受け渡せるので、全部Interface Buiderで行った例よりも、動作の幅が広がります。
ググると、selfをつけている例もありますが、ViewController内であれば、省略可能だと思います。

Segueを使ったモーダル遷移  

Interface Builder上でSegueを作成するとき、「Show」ではなく、「Present Modally」を選んでください。
あとはプッシュ遷移と同じです。

Segueを使わないプッシュ遷移

Segueを使わないでコーディングすると、どうなるのでしょうか。
ここでは、Storyboardをコードで呼び出して、そこから遷移先のViewControllerを指定し、プッシュ遷移する方法を紹介します。
まず遷移先のViewControllerのStoryboard IDに名前を入れてください。
image.png
ここではnextViewとしました。
あとは遷移させたいところに、下記のコードを書いてください。

let storyboard: UIStoryboard = self.storyboard!
let nextView = storyboard.instantiateViewController(withIdentifier: "nextView")
navigationController?.pushViewController(nextView, animated: true)

Segueを使わないモーダル遷移

遷移先のViewControllerのStoryboard IDに名前を入れるところまでは一緒です。

let storyboard: UIStoryboard = self.storyboard!
let nextView = storyboard.instantiateViewController(withIdentifier: "nextView")
//ここがpushとは違う
self.present(nextView, animated: true, completion: nil)

戻りたいときはdismissを使います。

ちなみに

遷移先のView / ViewControllerの生成とかやろうと思えばコードで記述できるので、Interface Builderをまったく使わないで画面遷移を書くこともできます。
まあでも、UIを細かく調整するのであれば、素直にInterface Builder使うが吉と思われます。

おまけ

Twitterやってます。エンジニアの知り合いが全然いないので、積極的につながりたいです!
よろしければフォローお願いします。

https://twitter.com/eg_19_

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【iOS】波アニメーションが簡単に実装できるUIライブラリ「WaveAnimationView」を作りました!

どうもみなさま初めまして、mani(@mani_transm)と申します。

Swiftを触り始めてもうすぐ1年というまだまだiOSはルーキーな大学3年生ですが、この度OSSライブラリを開発、公開するところまで辿り着けました!?

開発自体はそんなに時間はかからなかったのですが、壁に当たっては乗り越えを何回も繰り返して体力が持ってかれたので、開発記はまた後日書こうと思います()

なので今回は、「こういうの作ったよー!」っていうのを書いていこうと思います!

iOSデベロッパーの方々に「良いなコレ〜」って思って頂けたら幸いです!(スターください)

WaveAnimationView is a library to install wave progress-animation for iOS.
GitHub: WaveAnimationView - A library to install wave progress-animation for iOS

Waveアニメーションを簡単に実装できるUIライブラリ

今回作ったのがこちらの「WaveAnimationView」。
波のアニメーションを簡単に実装できる、いわゆるUIライブラリですね。
WaveAnimationView-header-min.png
以前から個人でアプリ開発やってて、アニメーションとかこだわるタイプだったので、
「Waveアニメーションのライブラリとかないかなー」と思って調べたら全く無かったっていうのが今回このWaveAnimationViewを作るに至ったきっかけです。

「WaveAnimationView」で出来ること

気になるWaveAnimationViewで出来る事ですが、

主にProgressViewやLoading,背景のアニメーションで波形アニメーションを実装することができます!

Demoとして作ってみたものが下です↓

Progress Loading Background
sample_1.gif sample_2.gif sample_3.gif

使い方

※導入方法はCocoaPods、Carthageに対応してます。詳しくはGitHubをご参照のほど。

WaveAnimationViewは、

1. インスタンス生成
2. startAnimation()を呼ぶ
3. stopAnimation()を呼ぶ(ViewControllerが解放される時点で)

の、この3行だけ書けばアプリに導入できます。

import UIKit
import WaveAnimationView

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        // 1
        let wave = WaveAnimationView(frame: CGRect, color: UIColor)

        //superView.addSubView(WaveAnimationView)

        // 2
        wave.startAnimation()

    }

    override func viewDidDisAppear() {
        super.viewDidDisAppear(animated)

        // 3 - Be sure to read the following Attension!
        wave.stopAnimation()

    }
}

またDemoのように、WaveのfillColorを前面・背面で別々に変えたり、
好きな画像を用意するだけでマスク処理ができたり
などオプションもあります。

Front/Back FillColor

let wave = WaveAnimationView(frame: CGRect, frontColor: UIColor, backColor: UIColor)

maskImage

wave.maskImage = UIImage(named: "image name")

Set/Get Progress

//get progress
wave.progress = 1.0 //0.0 .. 1.0, default is 0.5

//set progress - Example: UISlider
@IBAction func slide(_ sender: UISlider) {
     self.wave.setProgress(to: sender.value //0.0 .. 1.0)
}

「UIProgressViewと基本的には同じ機能を持ちつつ、好きな形でWaveアニメーションを組み込める」というのがWaveAnimationViewを開発する上で意識した利点です。

GitHubリポジトリはこちら

最後にリポジトリへのURLを貼っておきます。

初めてのライブラリ制作なので、「全然コードがなってない!」とか「ここもっと良い感じに改良できるよ」っていうのがありましたら是非是非Twitterでも大丈夫なのでフィードバックをお願いします!?Twitter: @mani_transm

※READMEが結構ガバガバ英語かもしれないのでご容赦ください(白目)

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

iOSでAVと向き合う Vol.1 基本編

はじめに

Appleプラットフォーム(iOS/macOS/tvOS)ではオーディオビジュアル(AV)の再生と作成をAVFoundation1 2AVKit3というFrameworkで実現しています 。

今回からドキュメントの内容を翻訳・写経したり、先駆者の記事を読み解きつつこれらのFrameworkについてまとめていきたいと思います。

本シリーズのゴール

読者の皆様にiOSでAVの再生と作成を行うための基礎と取っ掛かりをインプットし、アプリケーションの開発時に困らなくなることをゴールとします。

この回でのゴール

次回以降の説明に備え、AVFoundationやAVKitの概要を知ること

本シリーズの対象者

本シリーズの対象者は以下のスキルセットを持ち、iOSでAVを再生したり作成したりについて興味がある方が対象です。
- iOSアプリの開発を行ったことがある
- Swift/Objective-Cがある程度分かる人

注意

  • 本シリーズでは主にiOSに限定して話を展開します。
  • 本シリーズで出てくる単語 AVとは = オーディオビジュアル = ビデオ、音声・音楽のことです

iOS上でAVを取り扱うためには

iOSでは以下のようなアーキテクチャでAVを取り扱います。それぞれの四角形がFrameworkとなっています。
AVFoundationではCore Audio、Core Media、Core AnnimationのFrameworkを活用してAVの各種操作を可能にしています。

Core ~~ Framework

Core ~~~ と名前の付いたFrameworkでそれぞれメディアの低レベルレイヤでの処理(映像や音声へのバイトデータ操作など)や処理で利用するデータ型を提供しています。

Core Media

AV処理で欠かせない各種パイプライン処理と処理で利用するデータ型を定義しています4。具体的には、Core Media でAVの各フレームでのピクセルデータ、音声の波形データなどを参照・操作することが可能になります。

Core Audio

音声を処理するために必要なデータ型を定義し、それらはオーディオ関係の処理でハードウェアとのやり取りに使用することができる5

Core Animation

Viewやその他の画面に表示されるような要素をアニメーションさせるために使われるグラフィックの描画やそれに必要なデータ型を定義したFrameworkになります6

つまり、AVの再生時においてCore Mediaで処理した各ピクセルデータを端末内のオンボードグラフィックスハードウェア(いわゆるGPU部分)に渡されてアニメーションとしてView内に表示します。

AVFoundationとは

AVFoundationは、AVの再生と作成に使用できるフレームワークで、AVに関する作業を細かいレベルで行うためのインタフェースを提供してくれます。たとえば、メディアファイルの再生、検査、作成、編集、再エンコードなどができます。他にも、デバイスから入力ストリームを取得して、リアルタイムでキャプチャ中 および再生中のビデオを操作することもできます。

ざっくり言ってしまうと、iMovieの各種機能がプログラムから呼び出せるイメージです。

AVKit

AVFoundationの機能にUIKit内で定義されているコンポーネントをもとにUIを与え、それらを呼び出せるようにしているFrameworkです。AVを再生したい、UIの用意は自分でしなくでもOSデフォルトのUIが与えられれば良いといった方のためのものです。

ユーザーコントロール、チャプター操作、字幕やクローズドキャプションのサポート、再生ルート選択機能を備えたメディア再生用のUIを提供してくれます。AVの操作や編集は未対応です。加えて、再生時のUIは決まったものが提供される関係上カスタマイズできる余地も少ないです。

avplayercontroller.png7
8
9

まとめ

基本的にはiOS上でAVを取り扱っていく際は、AVFoundationを学んでいくのが最初は良いと思います。

AVを再生したいだけで、UIのカスタマイズはあまり考えてない、その他の機能も要件的に必要ない場合はAVKitを勉強して利用すると簡単で良いかと思います。

次回はAVメディアの再生に重きを置き、サンプルプログラムを実装しつつ理解を深めていきましょう。
その2(まだ未投稿)へつづく

参考文献

iosの動画再生周りの基礎を調べた
AVPlayerについて調べた

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Swift5.0チートシート ~Swift 5.0を爆速でキャッチアップしよう!~

この記事について

「Swift5.0のキャッチアップをまだできてない...! 」という方に向けて、Swift5.0のアップデートについてまとめたチートシートを作りました。

今回23個もの項目があるので、なるべくスマート✨かつ爆速?でキャッチアップしちゃいましょう!

なるべくシンプルな説明になるよう心がけています。内容の詳細については、公式ドキュメントを参考にするのが良いと思います。
今回載せる画像自体の転用は自由ですのでご自由にご利用ください。

全体の内容がまとまったスライドはこちらです
筆者の理解も完全ではないので、訂正がありましたらご指摘いただけると幸いです。mm

目次

  1. 全体的なアップデート
  2. 標準ライブラリのアップデート
  3. 言語仕様/コンパイラのアップデート

1. 全体的なアップデート

ABI Stability

Swift5 Cheet Sheet

2. 標準ライブラリのアップデート

1. Stringの特殊文字

Swift5 Cheet Sheet (1)

2. Unicode Property

Swift5 Cheet Sheet (2)

3. 型名の変更 (DictionayLiteral -> KeyValuePairs)

Swift5 Cheet Sheet (3)

4. Never型のプロトコル準拠

Swift5 Cheet Sheet (4)

5. ContactValueMapの追加

Swift5 Cheet Sheet (5)

6. Character Propertiesの追加

Swift5 Cheet Sheet (6)

7. isMultipleの追加

Swift5 Cheet Sheet (7)

8. 文字列補間のカスタマイズ

Swift5 Cheet Sheet (8)

9. SIMD Vectorsの追加

Swift5 Cheet Sheet (9)

10. カスタマイゼーションポイントの除外

Swift5 Cheet Sheet (10)

11. Numericプロトコルの修正

Swift5 Cheet Sheet (11)

12. Sequence.SubSequenceの消去

Swift5 Cheet Sheet (12)

13. Result型の追加

Swift5 Cheet Sheet (13)

14. withContiguous{Mutable}StorageIfAvailableの追加

Swift5 Cheet Sheet (14)

15. RangeのCodableへの準拠

Swift5 Cheet Sheet (15)

16. StringのencodedOffsetの廃止

Swift5 Cheet Sheet (16)

3. 言語仕様/コンパイラのアップデート

17. Enumへのunknown詞の追加

Swift5 Cheet Sheet (17)

18. リテラルを使った強制init

Swift5 Cheet Sheet (18)

19. Dynamically callable

Swift5 Cheet Sheet (19)

20. compilation conditionsの未満オプション

Swift5 Cheet Sheet (20)

21. Identity keypath

Swift5 Cheet Sheet (21)

22. try?のオプショナル構造の簡略化

Swift5 Cheet Sheet (22)

あとがき

いかがでしたでしょうか?
Swiftの最新バージョンに触れてみることは、自分のコードの品質チェックのきっかけになるのはもちろん、今まで触ったこともない仕様との出会いがあったりして非常に楽しいものです。Swift5.0はxcode10.2以上で動かすことができるので、皆さんもぜひ一度ご自身でコードを書いて見てください。

参考にした記事

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

未経験がSwift言語で簡易的なtodoアプリを作ってみた

背景

  • Todoするフレームワーク
  • スポーツtodoアプリを実装する前の段階の環境構築

前提

  • 特にライブラリを使用しない。

今回のOutPut

  • Todoアプリを追加、表示
  • 削除機能はない

(図1.1 出力結果)


(図1.2 出力結果)

import UIKit
import FSCalendar
import CalculateCalendarLogic

class ViewController: UIViewController,FSCalendarDelegate,FSCalendarDataSource,FSCalendarDelegateAppearance{

    @IBOutlet weak var calendar: FSCalendar!


    override func viewDidLoad() {
        super.viewDidLoad()
        // デリゲートの設定
        //self.calendar.dataSource = self
        //self.calendar.delegate = self

    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    fileprivate let gregorian: Calendar = Calendar(identifier: .gregorian)
    fileprivate lazy var dateFormatter: DateFormatter = {
        let formatter = DateFormatter()
        formatter.dateFormat = "yyyy-MM-dd"
        return formatter
    }()

    // 祝日判定を行い結果を返すメソッド(True:祝日)
    func judgeHoliday(_ date : Date) -> Bool {
        //祝日判定用のカレンダークラスのインスタンス
        let tmpCalendar = Calendar(identifier: .gregorian)

        // 祝日判定を行う日にちの年、月、日を取得
        let year = tmpCalendar.component(.year, from: date)
        let month = tmpCalendar.component(.month, from: date)
        let day = tmpCalendar.component(.day, from: date)

        // CalculateCalendarLogic():祝日判定のインスタンスの生成
        let holiday = CalculateCalendarLogic()

        return holiday.judgeJapaneseHoliday(year: year, month: month, day: day)
    }
    // date -> 年月日をIntで取得
    func getDay(_ date:Date) -> (Int,Int,Int){
        let tmpCalendar = Calendar(identifier: .gregorian)
        let year = tmpCalendar.component(.year, from: date)
        let month = tmpCalendar.component(.month, from: date)
        let day = tmpCalendar.component(.day, from: date)
        return (year,month,day)
    }

    //曜日判定(日曜日:1  土曜日:7)
    func getWeekIdx(_ date: Date) -> Int{
        let tmpCalendar = Calendar(identifier: .gregorian)
        return tmpCalendar.component(.weekday, from: date)
    }


    // 土日や祝日の日の文字色を変える
    func calendar(_ calendar: FSCalendar, appearance: FSCalendarAppearance, titleDefaultColorFor date: Date) -> UIColor? {

        //let selectDay = getDay(date)

        //祝日判定をする(祝日は赤色で表示する)
        if self.judgeHoliday(date){
            return UIColor.red
        }

        //土日の判定を行う(土曜日は青色、日曜日は赤色で表示する)
        let weekday = self.getWeekIdx(date)
        if weekday == 1 {   //日曜日
            return UIColor.red
        }
        else if weekday == 7 {  //土曜日
            return UIColor.blue
        }

        return nil
    }

}

次回やりたいこと

  • カレンダーアプリと組み合わせたい
  • 機能追加
  • メイン画面に日付をタップしたら、予定を画面下半分に表示
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む