UIKit provides a variety of features for building apps, including components you can use to construct the core infrastructure of your iOS, iPadOS, or tvOS apps. The framework provides the window and view architecture for implementing your UI, the event-handling infrastructure for delivering Multi-Touch and other types of input to your app, and the main run loop for managing interactions between the user, the system, and your app.
Storyboard는 iOS 애플리케이션의 UI의 흐름을 시각적으로 표현한 것으로 화면의 내용과 화면과 화면 간의 연결을 보여준다
그리고 storyboard는 viewController와 view로 이루어진 scene의 집합으로 이루어져 있습니다.
Scene들은 두 개의 viewcontroller의 전환을 나타내는 segue 객체로 연결되어 있습니다.
Xcode는 storyboard를 위한 visual editor를 제공합니다. 이 에디터를 InterfaceBulider라고 합니다.
그리고 우리는 이 에디터를 이용해서 storyboard를 편집하면서 scene에 button, view 등을 배치하고 viewcontroller 간의 데이터 전송을 관리할 수 있습니다.
InterfaceBuilder = 코드를 이용하지 않는 StoryBoard 에디터
요 두개는 UIKit를 사용하는 프로젝트에는 들어있어야한다
UIKit apps is based on the Model-View-Controller (MVC) design pattern
Model : objects manage the app’s data and business logic.
View : objects provide the visual representation of your data.
Controller : objects act as a bridge between your model and view objects, moving data between them at appropriate times.
UIKit 및 Foundation 프레임워크는 앱의 모델 객체를 정의하는 데 사용하는 기본 유형을 많이 제공합니다. UIKit은 디스크 기반 파일에 속하는 데이터 구조를 구성하는 UIDocument 객체를 제공합니다.
Foundation 프레임워크는 문자열, 숫자, 배열 및 기타 데이터 유형을 나타내는 기본 객체를 정의합니다. Swift 표준 라이브러리는 Foundation 프레임워크에서 사용할 수 있는 많은 유형을 제공합니다.
UIKit은 앱의 컨트롤러 및 뷰 레이어에서 대부분의 객체를 제공합니다. 특히, UIKit은 UIView 클래스를 정의하며, 일반적으로 콘텐츠를 화면에 표시하는 역할을 맡습니다. (Metal 및 기타 시스템 프레임워크를 사용하여 직접 화면에 콘텐츠를 렌더링할 수도 있습니다.)
UIApplication 객체는 앱의 주요 이벤트 루프를 실행하고 앱의 전반적인 수명 주기를 관리합니다.
Ex) 만약 버튼과 이미지 뷰가 있고, 버튼은 이미지 뷰를 기준으로 가운데 정렬과 8px 아래 위치하는 제약을 설정 했을 때, 이미지의 크기나 위치가 변경 되었을 때 버튼의 위치도 자동으로 매치해주는 것!
External changes occur when the size or shape of your superview changes. With each change, you must update the layout of your view hierarchy to best use the available space.
Internal changes occur when the size of the views or controls in your user interface change.
Internationalization
여러 언어나 지역을 지원하는 앱의 경우, 아래의 차이를 고려해야한다.
유저 인터페이스를 배치하는 세가지 메인 접근 방법이 있다.
Not recommended on iOS 11 or later use **directionalLayoutMargins**
The default spacing to use when laying out content in the view.
//선언
UIEdgeInsets(top:10,bottom:10,left:10,right:10)
//할당
view.layoutMargins = UIEdgeInsets(top:10,bottom:10,left:10,right:10)
//directionalLayoutMargins 선언
//leading trailing keyword 사용, 오른쪽부터 읽는 언어권을 위해
view.directionalLayoutMargins = NSDirectionalEdgeInsets(top: 0, leading: 64, bottom: 0, trailing: 0)
Top / Bottom / Leading / Trailing
뷰 직사각형의 상하좌우 테두리를 뜻한다. 직관적이어서 별로 설명할 게 없다.
다만, Leading은 'Text가 시작하는 부분'이라는 뜻이다.
보통은 왼쪽을 뜻하는 경우가 많다.
하지만 오른쪽에서부터 왼쪽으로 시작하는 언어도 있으므로,
그런 언어를 나타내는 뷰에서는 오른쪽이 Leading이다.
A의 Top = (0 * NotAnAttribute) + 200 ❌
A의 Top = (1.0 * B의 Top) + 20 ✅
Center X / Center Y
가로, 세로 중심축을 뜻한다.
Height, Width
Top과 Bottom 사이의 높이, Leading과 Trailing 사이의 너비를 말한다.
A의 Top = B의 Height + 100 ❌
B의 Center X = A의 Width - 200 ❌
→ 그렇기에 Top bottom의 최소 마진 값만 지키면 되었다.
참조 블로그
some_View.translatesAutoresizingMaskIntoConstraints = false
를 설정해주어야 합니다.class ViewController:UIViewController {
let myButton = UIButton() // 버튼을 하나 생성
override func viewDidLoad(){
super.viewDidLoad()
myButton.setTitle("This is Button", for: .normal) // 버튼 이름 설정
myButton.setTitleColor(.white, for: .normal) // 버튼 이름 색 지정
myButton.backgroundColor = .darkGray // 버튼 색 지정
self.view.addSubview(myButton)// view에 붙여주기
myButton.translatesAutoresizingMaskIntoConstraints = false
//제약조건 설정
myButton.centerXAnchor.constraint(equalTo:view.centerXAnchor)
.isActive = true // ---- 1
myButton.centerYAnchor.constraint(equalTo:view.centerYAnchor)
.isActive = true // ---- 2
myButton.heightAnchor.constraint(equalToConstant: 200)
.isActive = true // ---- 3
myButton.widthAnchor.constraint(equalToConstant: 200)
.isActive = true // ---- 4
}
}
❗코드로 제약조건을 설정할 때에는 equalTo
가 중요하다. 기준 고정점!
class ViewController:UIViewController {
let myButton = UIButton() // 버튼을 하나 생성
let myLabel = UILabel() // Label 생성
override func viewDidLoad(){
super.viewDidLoad()
myButton.setTitle("This is Button", for: .normal) // 버튼 이름 설정
myButton.setTitleColor(.white, for: .normal) // 버튼 이름 색 지정
myButton.backgroundColor = .darkGray // 버튼 색 지정
self.view.addSubview(myButton)// view에 붙여주기
myButton.translatesAutoresizingMaskIntoConstraints = false
//제약조건 설정
myButton.centerXAnchor.constraint(equalTo:view.centerXAnchor)
.isActive = true // ---- 1
myButton.centerYAnchor.constraint(equalTo:view.centerYAnchor)
.isActive = true // ---- 2
myButton.heightAnchor.constraint(equalToConstant: 200)
.isActive = true // ---- 3
myButton.widthAnchor.constraint(equalToConstant: 200)
.isActive = true // ---- 4
//제약조건 활성화
myLabel.translatesAutoresizingMaskIntoConstraints = false
//제약조건 설정
myLabel.centerXAnchor.constraint(equalTo:myButton.bottomAnchor
,constant: 30)
.isActive = true // ---- 1
myLabel.centerYAnchor.constraint(equalTo:view.leftAnchor
, constant: 40)
.isActive = true // ---- 2
myLabel.heightAnchor.constraint(equalTo: view.rightAnchor
, constant: -40)
.isActive = true // ---- 3
}
}
myLabel
을 myButton
의 밑 변을 기준으로 30만큼 아래로 위치시키는 코드입니다. 즉 myButton
의 30만큼 아래에 myLabel
을 위치시키는 코드입니다.myLabel
을 superview
의 왼쪽 변을 기준으로 40 만큼 떨어뜨려 놓는 코드입니다.myLabel
을 superview
의 오른쪽 변을 기준으로 –40 만큼 떨어뜨려 놓는 코드입니다. 여기서 –40인 이유는 x
좌표의 양의 방향은 오른쪽이기 때문에 오른쪽에서 40만큼 왼쪽으로 떨어뜨려놓기 위해서는 –40을 사용해야합니다.고유컨텐츠크기
라고 한다.컨텐츠 포함 여부
허깅
고유 사이즈 이상으로 '늘어나지 않으려고 하는' 조건.
(줄어드는 것은 아님)
컴프레션
고유 사이즈 이하로 '줄어들지 않으려고 하는' 조건.
(늘어나는 것은 아님)