-
Notifications
You must be signed in to change notification settings - Fork 0
240102 Day6 #2
Description
240102 Day6
앱 생명주기
Not Running
앱 시작되기 전 상태
Active(Foreground)
앱이 화면에서 실행중인 상태
Inactive(Foreground)
앱이 화면에서 실행중이나 어떤 신호도 받지 않는 상태(전화가 오거나, 알람)
Background
앱이 화면에 보이지 않지만 코드를 실행하고 있는 상태
Suspended
앱이 곧 종료될 상태
AppDelegate
앱 생명주기를 관리함.
iOS 13 이후부터는 UI를 담당하지 않고 앱만 담당.
옛날에 면접 질문으로 AppDelegate 많이 물어본 이유?
- iOS 12까지는 AppDelegate만 있었음.
SceneDelegate
탄생 배경
- iOS 13에 iPadOS가 등장하게 되면서 함께 등장
- 한 화면에 여러 앱을 띄울 수 있고, 같은 앱도 여러 개 띄울 수 있게 되면서 생명주기가 복잡해짐
- 그래서 SceneDelegate 등장.
iOS 13 미만도 지원해야할 때
@available 키워드 사용해서 UIScene관련 코드에 붙이기
@available, #available, @unavailable 관련해서 알아보기
- appdelegate scene 관련 함수
- scenedelegate 클래스
그래도 13 이상이 지원되는거지, 13 미만은 저 코드가 실행이 안됨.
→ appDelegate에 UIWindow를 만들어주면 된다.
UIWindow
아이폰은 UIWindow 하나를 띄워놓고,
UIWindow 위에 뷰컨트롤러가 올라간다.
즉, 실질적으로 화면을 보여주는 역할
실습
UIDatePicker
버전별로 조금 다름
액션함수 value Changed 액션으로
- 휠 방식은 휠을 움직이다 멈췄을 때 액션 감지됨.
출력되는 현재 시간은 영국 표준시.
→ 어떻게 고칠까? 아래를 보셈.
DateFormatter
올바른 시간과 편한 포맷으로 시간을 출력하기 위해서는 DateFormatter가 필요!
알아서 시간도 시차에 맞게 변경해줌.
let format = DateFormatter()
format.dateFormat = "yyyy년 MM월 dd일 hh시 mm분" // "2024년 01월 01일 12시 30분"
//format.dateFormat = "yyyy년 M월 d일" // "2024년 1월 1일"
let result = format.string(from: datePicker.date)연도는 YYYY보다 yyyy를 쓰자
YYYY를 쓰면 해외의 주번호(?) 때문에 연말에 연도이상해짐.
UIView tag
각각의 기능을 분류할 수 있음.
label에 여러 줄의 문자열이 안먹힐때
label numberofline 설정안해주면 안먹힘(기본값이 1이기 때문)
몇줄이라도 다 보여주고 싶다면 0으로 설정.
label.numberOfLines = 0
액션함수 기능이 안눌러도 화면 뜨자마자 실행하고플 때
액션함수를 viewDidLoad()에 명령하면 됨
override func viewDidLoad() {
super.viewDidLoad()
datePickerValueChanged(datePicker)
}return이 있는 함수를 경고 안띄우고 싶을 때
반환값을 사용안해서 노란 경고 뜸
@discardableResult 사용하면 해결완료!
implicit return
swift 5.1+
함수 내 코드가 한 줄이면 return 생략가능
func getRandomNumber() -> Int {
Int.random(in: 1...100)
}UIAlertController
UIViewController를 상속받았음. → present()로 띄움.
// 1. 컨텐츠
let alert = UIAlertController(title: "기념일 저장", message: "이 날짜를 저장하시겠습니까?", preferredStyle: .alert)
// 2. 버튼
let button1 = UIAlertAction(title: "버튼1", style: .cancel)
let button2 = UIAlertAction(title: "버튼2", style: .destructive)
let button3 = UIAlertAction(title: "버튼3", style: .default)
let button4 = UIAlertAction(title: "버튼4", style: .default)
// 3. 컨텐츠 + 버튼
alert.addAction(button1)
alert.addAction(button2)
alert.addAction(button3)
alert.addAction(button4)
// 4. 띄우기
present(alert, animated: true)버튼 순서는 add한 순서대로
하지만, .cancel 스타일은 항상 자동으로 가장 왼쪽 도는 맨 아래에 붙음.
- .cancel 스타일은 하나만 가능!
액션버튼이 2개 이하면 가로로 뜬다.
.alert
- 사용자가 꼭 선택해야 할 때나 중요한 경우일 때 쓰임
.actionSheet
- 화면 하단에 쓰윽 보여주고 싶을 때
- title과 message를 잘 안씀.(nil로 설정할 것.)
StackView
균일한 간격을 표현할 때 주로 사용.
Spacing: stack view 안의 뷰 간 간격
Alignment: 서로 다른 크기를 가진 뷰들의 정렬 기준
- Horizontal
- Fill: 높이 사이즈 만큼 뷰 가득 채움
- Top: 위쪽으로 정렬
- Center: 가운데 정렬
- Bottom: 밑쪽으로 정렬
- Vertical
- Fill: 넓이 사이즈 만큼 뷰 가득 채움
- Leading: 왼쪽으로 정렬
- Center: 가운데 정렬
- Trailing: 오른쪽 정렬
distribution: stack view 안의 뷰들의 관계(분배 방법)
- Fill Equally: 모든 뷰들의 길이 동등하게
- Equal Spacing: 뷰 들의 간격을 동일하게(spacing 설정값 상관없이 동일한 spacing으로 재조정)
- Equal Centering: 뷰 들의 가운데를 기준으로 간격 동일하게
- Fill Proportionally: 뷰 안의 컨텐츠 크기에 비례하여 뷰 속 여백 설정(spacing은 설정한 값으로)