카테고리 없음

iOS 12주차

늠재 2025. 11. 24. 15:47

URL 구조체

여러 가지 애플리케이션과 브라우저를 띄울 수 있다.

 

함수를 찾았을 때 진한 색으로 나오는 경우 반드시 써야하고

흐린 색으로 나오는 경우에는 default 값이 정해져 있어 굳이 쓰지 않아도 된다.

한 번 쓰기 시작하면 계속 사용해야 해서 오른쪽에 붙어있다.

WebKit 자동 추가 안될 때 수동으로 추가하는 방법

 

프로젝트 네비게이터에서 프로젝트 폴더 좌클릭 - Build Phases - +클릭 - Webkit 프레임워크 추가

옵셔널 변수 오류
guard let 적용
정렬 메뉴, align

 수평, 수직에 대해 얼마나 떨어뜨릴지 설정 가능. 휴대폰을 회전시켰을 때도 앱의 기능과 버튼들이 제대로 된 위치에 놓일 수 있도록 한다.

아이폰이든 아이패드든 0,0에 두게 되면 항상 정가운데에 있게 해준다.

 

버튼이 많지 않고 하나만 있을 때에는 이렇게 해도 괜찮지만

실무에서 제대로 쓰이는 앱의 화면 상 버튼이나 레이블이 한두 개가 아니기 때문에 여러가지를 잡고 스택 뷰에 넣어놓으면

그 스택뷰 하나에 대해서만 간격을 설정해두면 어렵지 않게 작업할 수 있다.

 

 

 

AutoLayout을 사용하는 법 - 뤼튼

Xcode에서 오토레이아웃 하는 법! 

 

 

1. 뷰 배치하기 (기본)

먼저 스토리보드나 XIB 파일에서 화면에 UILabel이든 UIButton이든 필요한 뷰들을 원하는 위치에 대충 드래그해서 올려놔.

2. 제약조건(Constraints) 추가하기 (핵심!)

뷰를 선택하고 Xcode 화면 오른쪽 아래에 있는 세 가지 버튼을 주로 사용하게 될 거야.

1) Pin 버튼 (상하좌우 간격, 크기 조절)

  • 핀 모양 아이콘 (네모 안에 짝대기 4개 있는 거)
  • 용도: 선택한 뷰의 상하좌우 간격(Top, Bottom, Leading, Trailing)과 크기(Width, Height)를 설정할 때 써.
    • 예시: "이 버튼은 화면 위에서 20pt 떨어지고, 왼쪽에서 16pt 떨어지게 해줘."
    • 간격 설정: 보통 Safe Area 기준으로 많이 설정해.
    • 크기 설정: Width, Height에 고정값을 줄 수도 있고, 다른 뷰와의 비율로 설정할 수도 있어.
  • Add N Constraints 버튼을 누르면 설정이 적용돼.

2) Align 버튼 (정렬)

  • 두 번째 아이콘 (네모 두 개가 겹쳐진 거)
  • 용도: 뷰들을 서로 정렬할 때 사용해.
    • 예시: "이 버튼을 화면 정중앙에 배치해줘.", "얘랑 얘랑 수평으로 맞춰줘."
    • Horizontally in Container (컨테이너 중앙 가로), Vertically in Container (컨테이너 중앙 세로) 가 많이 쓰여.

3) Resolve Auto Layout Issues 버튼 (문제 해결)

  • 세 번째 아이콘 (빨간색 동그라미 안에 화살표 같은 거)
  • 용도: 오토레이아웃 설정하다 보면 빨간색/주황색 줄이 막 생기면서 경고나 에러가 뜰 때가 있어. 그때 이 버튼을 눌러서 해결할 수 있어.
    • Update Frames: 현재 제약조건에 맞춰 뷰의 실제 크기와 위치를 업데이트해줘. (제약조건 다 추가한 후 항상 한 번씩 눌러주는 습관 들이면 좋음!)
    • Add Missing Constraints: Xcode가 알아서 빠진 제약조건을 채워주는 기능인데, 이건 생각만큼 똑똑하진 않으니 직접 설정하는 걸 추천해 ㅠㅠ

3. 제약조건 확인 및 수정

뷰를 선택한 다음, Xcode 오른쪽 패널의 Size Inspector (측정자 모양 아이콘) 탭으로 가면 해당 뷰에 적용된 제약조건 리스트를 볼 수 있어. 여기서 제약조건 값을 바꾸거나 지울 수 있어.

4. Stack View 활용하기 (꿀팁!)

여러 뷰를 일렬로 나열하거나 정렬해야 할 때 UIStackView를 사용하면 오토레이아웃 잡기가 엄청 쉬워져. Stack View 안에 뷰들을 넣으면 알아서 간격이나 정렬을 관리해주거든. 복잡한 UI 만들 때 이거 모르면 진심 고생한다 ㅠㅠ

  • 뷰들을 여러 개 선택한 후, 아래 오토레이아웃 버튼 중 오른쪽 하단 끝에서 두 번째 아이콘 (Embedding in Stack View) 을 누르면 돼.

⚠️ 오토레이아웃 할 때 주의할 점!

  • 모든 축(X, Y)과 크기(Width, Height)가 정의되어야 해: 뷰 하나가 화면에서 어디에 위치하고 얼마나 커야 하는지 오토레이아웃이 헷갈리지 않게 모든 정보를 줘야 해. 이게 부족하면 오류(빨간 줄)가 뜨는 경우가 많음.
  • 충돌하는 제약조건 주의: "얘는 왼쪽에서 10pt, 근데 동시에 오른쪽에서 20pt?" 이렇게 말이 안 되는 제약조건을 주면 충돌 에러(빨간 줄)가 생겨.
  • 프레임 업데이트: 제약조건을 추가/수정한 후에는 꼭 Update Frames를 눌러서 뷰의 실제 표시가 제약조건대로 되는지 확인하는 습관을 들이자!

 

**** present 함수 ****

1. present 함수란?

present는 스위프트(iOS 개발)에서 한 화면(뷰 컨트롤러) 위에 다른 화면을 모달(덮어씌우듯)로 띄울 때 사용하는 함수야.
즉, 현재 화면에서 튀어나와서 새 화면이 전체 또는 일부를 덮는 방식.

예) 설정 화면, 로그아웃 확인 팝업, 알림창 이런 거 모달 화면으로 많이 쓰지.


2. 함수 시그니처

swift

func present(
    _ viewControllerToPresent: UIViewController,  // 띄울 새 화면 (뷰 컨트롤러)
    animated flag: Bool,                            // 애니메이션 유무 (애니메이션할지 말지)
    completion: (() -> Void)? = nil                 // 화면 뜬 뒤 실행할 코드 (옵셔널)
)
  • viewControllerToPresent : 새로 보여줄 화면을 객체로 넘겨줘야 함. 보통 UIViewController를 상속한 화면 클래스 인스턴스.
  • animated : true면 화면 전환 애니메이션 생김, false면 바로 뽝.
  • completion : 모달 전환이 끝난 후 추가 실행할 코드(클로저)를 넣을 수 있어. 안 써도 돼.

3. 왜 모달 방식일까?

  • 모달은 현재 작업을 잠시 멈추고(기존 화면과 독립적) 새 작업을 처리하게 해줌.
  • 새 화면 닫을 때는 dismiss(animated:completion:)으로 다시 이전 화면으로 돌아가.
  • 화면이 완전히 겹치는 경우가 많아서 유저가 새 작업 끝내기 전까지 기존 화면 건드릴 수 없게 만드는 용도.

4. 실제 사용법 예시

swift

// 새 화면 인스턴스 생성
let detailViewController = DetailViewController()

// 현재 화면에서 모달로 새 화면 띄우기
present(detailViewController, animated: true) {
    print("새 화면이 성공적으로 떴어!")
}

위 예시는 UIViewController 내부에서 호출하는 상황 가정


5. 사용하는 환경 팁

  • 스토리보드 쓰면 뷰 컨트롤러를 식별자(ID)로 불러서 쓸 수 있어:

swift

let storyboard = UIStoryboard(name: "Main", bundle: nil)
if let detailVC = storyboard.instantiateViewController(withIdentifier: "DetailVC") as? DetailViewController {
    present(detailVC, animated: true, completion: nil)
}
  • 만약 present로 띄운 화면 안에서 다시 이전 화면으로 돌아가려면 이렇게 dismiss 호출해야:

swift

self.dismiss(animated: true, completion: nil)

6. present와 push 차이

  • present: 화면을 덮으며 모달 방식 전환 (닫을 때 dismiss 필요)
  • push: 내비게이션 스택에 쌓으면서 화면 이동 (뒤로가기 버튼으로 돌아감)

push는 UINavigationController가 있을 때 쓸 수 있고,
present는 뷰 컨트롤러 간 독립적 전환할 때 주로 써.


7. 요약

변수명역할설명
viewControllerToPresent 새 화면 띄우고자 하는 UIViewController 객체
animated 애니메이션 여부 화면 전환 시 애니메이션 포함 여부 (true or false)
completion 완료 후 처리 화면 전환 완료 시 실행할 코드(옵셔널)

이렇게 present는 iOS에서 아주 기본적이고 자주 쓰이는 화면 전환 방식이야.
처음엔 헷갈려도 계속 써봐! 화면 띄우고 닫는 흐름 감 잡히면 진짜 편함.

 

 

이 기본 소스에서 저 상태로 엔터를 누르게 되면 아래 화면처럼 바뀌게 되는데

후행 클로저의 형태이다.

이렇게 하면 기능 상 동영상이 나올 준비가 모두 끝마치게 되면 자연스럽게 동영상이 시작되도록 한다.

기능은 다 같지만 마지막 후행 클로저가 가장 좋은 방법.

self.은 있어도 되고 없어도 됨

let multiply = {(a: Int, b: Int) -> Int in
return a * b
}
var result = multiply(10, 20)
print(result)
let add = {(a: Int, b: Int) -> Int in
return a + b
}

result = add(10, 20)
print(result)
func math(x: Int, y: Int, cal: (Int, Int) -> Int) -> Int {
return cal(x, y)
}
result = math(x: 10, y: 20, cal: add)
print(result)
result = math(x: 10, y: 20, cal: multiply)
print(result)

result = math(x: 10, y: 20, cal: {$0 + $1})
//첫 번째와 두 번째 더하기, 단축인자라고 한다.
print(result)

shorthand argument name 이라고도 한다. 코드를 최대한 간편하게 만들어준다.