画面半分表示のModal View

iOS 15+では、新しいSafariブックマークのような画面半分表示のModal Viewが作れるようになりました。 f:id:machinemxy:20220203220839p:plain

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とContent Compression Resistance Priority

Content Hugging Priority:二つのコンテンツが並んで、十分なスペースがある場合、そのpriority高いやつはもっとタイトな形式で表示する。
例:textAのContent Hugging PriorityはtextBより大きい場合: f:id:machinemxy:20220131121843p:plain

Content Compression Resistance Priority:二つのコンテンツが並んで、十分なスペースがない場合、そのpriority高いやつは圧縮されない。
例:longlongTextAのContent Compression Resistance PriorityはlonglongTextBより大きい場合: f:id:machinemxy:20220131122146p:plain

frameとbounds

frameはsuperViewに対する位置、x, yはsuperViewによって変わる。
boundsはview自身に対する位置、x, yは常に0。
だからviewAのsubView viewBを作って、viewBはviewAを完全重合したい場合、viewB.frame = viewA.boundと書く。
因みに、viewを移動したり変形したり場合、frameは共に変化するが、boundsは変わらない。

UIKitでStoryboardなしのアプリを作る

  1. XcodeでUIKitのアプリを作成する。
  2. Main.storyboardを削除する。
  3. ProjectファイルのTarget -> General -> Deployment Info -> Main Interfaceを空欄にする。
  4. Info.plist -> Application Scene Manifest -> Scene Configuration -> Application Session Role -> Storyboard Nameという項目を削除
  5. SceneDelegate.swiftの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