branch10480’s blog

Topics that I've learned.

【iOS】window.rootViewController入れ替え時のアニメーション

重要な点は、UIView.transitionanimationsでViewControllerの入れ替えをするのではなく、先に入れ替え処理を書いてからUIView.transitionを呼び出すこと。(animations引数は空のクロージャ。)

class AppDelegate: UIResponder, UIApplicationDelegate {
    var window: UIWindow?

    ...
    
    func setRootViewController(_ vc: UIViewController) {
        guard let window = window else {
            return
        }
        window.rootViewController = vc
        UIView.transition(
            with: window,
            duration: 0.5,
            options: .transitionFlipFromLeft,
            animations: {},
            completion: { _ in })
    }

}

こんな感じでアニメーションさせられます。

f:id:branch10480:20210418202325g:plain:w320

アニメーションの種類は他にもあるので .transitionFlipFromLeft に定義ジャンプして確認してみてください。

ページ送りやフェードのアニメーションもできます。

参考

Swap rootViewController with animation?

【Android】 テキストの部分装飾

iOSでは NSMutableAttributedString を使いますが、Androidの場合は SpannableStringBuilder を用いるようです。

この例では以下の装飾を加えています。
target 文字列と一致する部分に

  1. フォント色を赤色
  2. フォントを太字
val textView = findViewById<TextView>(R.id.description_textview)
val message = textView.text.toString()
val target = getString(R.string.auto_renewal)
val firstIndex = message.indexOf(target)
val endIndex = firstIndex + target.length
val color = ResourcesCompat.getColor(
        applicationContext.resources,
        R.color.viewfinder_laser,
        null
)
SpannableStringBuilder(message).let {
    it.setSpan(ForegroundColorSpan(color), firstIndex, endIndex, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
    it.setSpan(
            StyleSpan(android.graphics.Typeface.BOLD),
            firstIndex,
            endIndex,
            Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
    textView.setText(it, TextView.BufferType.SPANNABLE)
}

TDD(テスト駆動開発)についての覚え書き

先日、こちらの本を概要をまとめながら読了しました。

booth.pm

前半はテスト駆動開発(TDD)についての概要説明になっていて、中盤は実際にiOSアプリ開発でTDDを実践していくという内容です。

後半は新しいアプリにへの導入や、既存プロジェクトへの導入について説明がされていて大変勉強になりました。

今回はその前半部分の私なりのまとめになりますが、実践部分を読みながら実際にコードを書いてみてTDDの触りが体験できたように思いますのでよければ是非ご購入ください。

以下、まとめになります。

続きを読む

GitHubのREADME.mdに載せる用のgif画像を作る

目的のコマンドはこちら

ffmpeg -i origin.mp4 -vf scale=640:-1 -r 24 output.gif

普段のアプリ開発やちょっとしたプロジェクトを作ったときに、動作紹介用のgif画像が欲しいときが今まで多々ありました。

そのgif作成にはffmpegを使っていますが、毎回そのコマンドを調べて叩いていたので、今回は備忘録として書いておこうと思います。

欲しいのはこんな感じのgifです。

f:id:branch10480:20210406215639g:plain

続きを読む

複数のQuickSpecのbeforeSuiteとitの実行順序

担当しているプロジェクトのUIテストコードに Quick/Nimble(テスト用フレームワーク) を導入しようとして若干ハマったのでメモします。

何に詰まったのか

最初、Spec1とSpec2のように複数のQuickSpecを用意して、それぞれ初期化処理をしてから実際のテストを走らせようとしていました。

  • Spec1
    • beforeSuite1 - (A)
    • it1 - (B)
  • Spec2
    • beforeSuite2 - (C)
    • it2 - (D)

構造としては上記にようにして、私は以下の実行順序を期待します。

  1. Spec1について、beforeSuite -> it
  2. Spec2について、beforeSuite -> it

しかし実際にテストを実行してみると、Spec2のbeforeSuiteの処理が効いているように見えません。。

なぜ...?

続きを読む

Clean Architecture についてまとめてみた

皆さんこんにちは! 最近作ろうとしているアプリを Clean Architecture で実装しようと思い立ちました。

しかしどういうものかを忘れてしまっていたため、今回は備忘録がてらブログにまとめようと思います。

Clean Architecture はシステムアーキテクチャ

アーキテクチャは大別すると、以下2つがあります。

  1. GUIアーキテクチャ
  2. システムアーキテクチャ

GUIアーキテクチャは UI と モデル を分けるというところにフォーカスしたアーキテクチャです。 一方、システムアーキテクチャは上記にとどまらず、システム全体の構造に着目したものになります。

Clean Architecture は後者です。

4つの登場人物、配置と依存関係のルール

Clean Architecture には重要なコンポーネントと呼ばれる登場人物が4人います。 それがこれらです。

続きを読む

アプリ アーキテクチャ ガイド を読んでみた

今回は業務で Android の設計について調査したので備忘録がてらつらつら書いていこうと思います。参照したドキュメントはこちらです。

アプリ アーキテクチャ ガイド

モバイルアプリのユーザー体験

Android アプリでは アプリマニフェスト にアプリコンポーネントを宣言しておき、全体的なユーザー体験をどのように組み込むかを決定します。

ちなみにアプリコンポーネントにはこのようなものがあります。

  • アクティビティ
  • フラグメント
  • サービス
  • コンテンツプロバイダ
  • ブロードキャストレシーバー

...etc

通信の問題だったり、インテントを使った別アプリ起動、メモリ解放のためのアプリコンポーネントの破棄などは任意のタイミング・順番でおこるため、アプリのデータや状態をアプリコンポーネント内に保存してはいけません。

続きを読む