ステップ1
ステップ2
現在使えるフォントを確認する:
for family in UIFont.familyNames.sorted() { let names = UIFont.fontNames(forFamilyName: family) print("Family: \(family) Font names: \(names)") }
実行を中止:Ctrl + C 入力行を削除:Ctrl + U 入力行の最後の単語を削除:Ctrl + W
Array(repeating, count)はクラスを作成の時には使えない。
例えばArray(repeating: UIView(frame: .zero), count: 5)
を書いた時実に作ったViewは一つだけ。五つのポインターは同じViewに指しているだけ。
正しいやり方は(0...4).map { _ in UIView(frame: .zero) }
だ。
iOS 15+では、新しいSafariブックマークのような画面半分表示のModal Viewが作れるようになりました。
let modalVC = ModalViewController() let modalNC = UINavigationController(rootViewController: modalVC) if #available(iOS 15.0, *) { if let sheet = modalNC.sheetPresentationController { // 以下の設定より、デフォルトは半分で表示、ドラッグしてほぼ全画面まで拡大も可能 sheet.detents = [.medium(), .large()] } } self.present(modalNC, animated: true)
Content Hugging Priority:二つのコンテンツが並んで、十分なスペースがある場合、そのpriority高いやつはもっとタイトな形式で表示する。
例:textAのContent Hugging PriorityはtextBより大きい場合:
Content Compression Resistance Priority:二つのコンテンツが並んで、十分なスペースがない場合、そのpriority高いやつは圧縮されない。
例:longlongTextAのContent Compression Resistance PriorityはlonglongTextBより大きい場合:
frameはsuperViewに対する位置、x, yはsuperViewによって変わる。
boundsはview自身に対する位置、x, yは常に0。
だからviewAのsubView viewBを作って、viewBはviewAを完全重合したい場合、viewB.frame = viewA.bound
と書く。
因みに、viewを移動したり変形したり場合、frameは共に変化するが、boundsは変わらない。
guard let _ = (scene as? UIWindowScene) else { return }
を下記コードに変更:guard let windowScene = (scene as? UIWindowScene) else { return } let window = UIWindow(windowScene: windowScene) window.rootViewController = ViewController() window.makeKeyAndVisible() self.window = window