どっこと備忘録群

アウトプットしないとインプットできない私が Androidアプリ開発をメインとした備忘録を載せています。

iOSについて

UILabelの高さを可変にする

Androidでいうところの layout_height="wrap_content" 。 実装はとても簡単で、 numberOfLines0 を設定し、 sizeToFit() をコールする。

label.numberOfLines = 0
label.text = "ここにはとても長いテキストが入ります。ここにはとても長いテキストが入ります。ここにはとても長いテキストが入ります。"
label.sizeToFit()

これだけで、 UILabel の高さをテキスト量に応じて可変にすることができる。

参考

引数付きStringイニシャライザ

Swiftで文字列内に変数を埋め込む際、フォーマットを指定して整形したい場合は String(format:) を使用する。

let month = "12"
let day = "31"
let text = String(format: "%@月%@日", month, day)
print(text) // 出力: 12月31日

可変長引数(Variadic Parameters) の実装方法

Javaと似ており、型名の末尾に ... を追加するだけで可変長引数を定義することができる。 関数内部で参照する際は、通常の配列(Array)と全く同じように扱うことが可能。

func print(texts: String...) {
    // 配列のように要素数を参照できる
    if texts.count == 0 {
       return
    }
    
    // 配列のようにインデックスで要素を参照できる
    print("first: \(texts[0])")
    
    // for-in文によるループ処理も可能
    for text in texts {
      print("element: \(text)")
    }
}

参考

フォーマット指定子(%03d など)を使った数値の桁埋め(ゼロパディング)の実装

Androidでは String.format(text, value) としてフォーマットしたテキストを出力させるが、iOSの場合もほぼ同様。 String のイニシャライザにフォーマットと値を渡すだけ。

let number = 3
let numberString = String(format: "%03d", number) // 出力: "003"

参考

Enumの全要素を配列で取得する

Enumの定義に CaseIterable プロトコルを準拠させてあげるだけ。

enum Size: CaseIterable {
  case maximum
  case big
  case medium
  case small
  case minimum
}

このように定義することで、自動的に allCases プロパティにアクセスできるようになり、全要素が格納された配列として扱える。

Size.allCases.map { /* 各ケースに対する処理 */ }

また、 firstIndex(of:) を用いることで、定義されているケースのインデックス(順番)も容易に取得可能。

let index = Size.allCases.firstIndex(of: .big)!

参考

ボタンタップ中の色を変える

Viewのプロパティである isHighlighted の更新を受けて、背景色を設定すればよい。 カスタムViewを実装する際に isHighlighted をオーバーライドし、プロパティオブザーバである didSet の中で backgroundColor を切り替える。 実装例は以下。

override open var isHighlighted: Bool {
    didSet {
        backgroundColor = isHighlighted ? .lightGray : .blue
    }
}

ちなみに isHighlighted とは、Androidでいうところの state_pressed に相当する状態フラグ。 UIButton などの UIControl クラスを継承したViewであれば、状態に応じて背景を切り替えるメソッド(setBackgroundImage(_:for:) など)が標準で用意されているため、それらを使えばタップ中の色を容易に変更することが可能。

参考

テキストフィールドに入力中のキーボードを閉じる

iOSではアプリからキーボードを閉じるのは非常に簡単で、 UITextFieldendEditing(true) を呼び出すだけでよい。

@IBOutlet weak var textField: UITextField!

func closeKeyboard() {
    // キーボードを閉じる
    textField.endEditing(true)
}

Androidでは InputMethodManager にアクセスしたり、必要なトークン(WindowToken)を渡したりといった手続きが必要で少々煩雑であるのに対し、 iOSのこの設計はとにかくシンプルで扱いやすい。

参考

iOSの UIView に角丸や枠線を付ける

角丸にする

UIView が共通で保持している layer(CALayer)というプロパティに対応するパラメータがある。 コード上であれば、以下のように値を設定することで簡単に角丸にすることができる。

// 角丸の半径(半径を大きくするほど丸みが強くなる)
view.layer.cornerRadius = 8.0

枠線を付ける

枠線の実装も同様で、 layer に対して以下のように値を設定することで枠線を付けることができる。

// 枠線の太さ
view.layer.borderWidth = 2.0

// 枠線の色(CGColorクラスを設定する必要がある点に注意)
view.layer.borderColor = UIColor.blue.cgColor

参考

UILabel/UITextField/UITextViewの違い

  • UILabel:Androidの TextView に相当する。テキストを表示するだけのView。
  • UITextField:単一行(singleLine)限定の EditText に相当する。テキストの入力は1行のみである。
  • UITextView:複数行入力が可能なAndroidの EditTextScrollView に包まれたテキストエリアに相当する。複数行の表示・入力に対応している。

UIAlertController を用いたアラートダイアログの表示方法

// アラートの生成
let alert = UIAlertController(title: "タイトルテスト", message: "メッセージテスト", preferredStyle: .alert)

// ボタン(アクション)を追加する
let action = UIAlertAction(title: "ボタン", style: .default, handler: { action in
    /** タップ時の処理をここに記述 **/
})

// アラートにアクションを追加。addActionを複数回呼ぶことでボタンを複数配置することも可能
alert.addAction(action)

// 画面上にダイアログを表示
present(alert, animated: true)

ダイアログを表示させる present(_:animated:completion:) メソッドは、ViewControllerのライフサイクル上で呼び出すタイミングが早すぎるとViewの階層構造が未完成のため無視されてしまう(表示されない)ケースがある。 そのため、安全に呼び出すには必ず viewDidAppear() 以降のタイミングで実行する必要がある。

参考

iOS よくわからないエラー集

failed to get the task for proces

Xcodeのプロジェクトで設定した証明書ファイル群にデバッグビルドによるビルドができるような設定になっていない。

Undefined symbol:...

Undefined symbol: _GULLogBasic
Undefined symbol: _OBJC_CLASS_$_***
Undefined symbol: _OBJC_CLASS_$_***
Undefined symbol: _OBJC_CLASS_$_***
Undefined symbol: _OBJC_CLASS_$_***

ライブラリをアプリに組み込んでビルドしたときに発生するエラー。ライブラリがシミュレータに対応していない。 「シミュレータでも動作するライブラリを使う」か「シミュレータをターゲットにビルドするときは、該当のライブラリを組み込まずに使う。

最終更新: 2026.6.13