[iOS] Scene(화면)과 Segue(화면 전환)

김민석·2024년 8월 20일
0

iOS

목록 보기
8/12
post-thumbnail

Scene

공식 문서 설명

앱 UI의 여러 인스턴스를 동시에 관리하고, 리소스를 적절한 UI 인스턴스로 전달합니다.

UIKit은 객체를 사용하여 앱 UI의 각 인스턴스를 관리!

Scene은 UI의 한 인스턴스를 표시하기 위한 View Controller가 포함!

각 장면에는 UIKit과 앱 간의 상호 작용을 조정하는 데 사용하는 해당 객체도 있습니다.

Scene은 서로 동시에 실행되어 동일한 메모리와 앱 프로세스 공간을 공유합니다.
결과적으로 단일 앱에는 여러 장면과 장면 Delegate 객체가 동시에 활성화될 수 있습니다.
UIWindowScene UIWindowSceneDelegate



StoryBoard에서 Scene 추가로 만드는 방법

아래와 같이 ViewController를 만들면

새로운 Scene를 추가 가능








Segue


설명

iOS에서 화면 이동을 하는 역할

세그를 이용해서 부드럽게 화면 전환 가능

세그는 일방통행 골목 같음 → 한쪽으로만 이동 가능
→ 출발지는 뷰 컨트롤러가 될 수도 버튼이나 테이블 셀 등의 컨트롤이 될 수도
→ 사용자 이벤트를 전달받아서 화면 전환의 매개체 역할
→ 출발 지점에 따라 부르는 방식이 달라짐

  • 출발지가 뷰 컨트롤러다 ➡️ 메뉴얼 세그웨이 (Manual Segue)
  • 출발지가 버튼 등 컨트롤이다 ➡️ 액션 세그웨이 (Action Segue)



사용

control로 VC를 선택하여 생성 가능



Segue 종류


  • Show : 가장 기본적인 세그. stack구조로 새 화면이 원래 화면을 덮는 형식.
  • Show Detail : 화면을 둘로 나누는 SplitView 구조로 원래 화면을 Master, 새 화면을 Detail로 표시. 아이패드 처럼 큰 화면에서 둘로 분할됨.
  • Present Modally : 새 화면이 모달처럼 원래 화면 위 전체를 뒤덮음. 원래 화면은 새 화면 뒤에 그대로 존재
  • Popover Presentation : 화면이 큰 아이패드에서 팝업창을 띄움.
  • Custom : 사용자 정의 세그를 만듬.



Presentation(화면 띄우기) 종류


enum UIModalPresentStyle: Int {
    case automatic
  // 시스템이 보여주는 방식을 정한다.
    case fullScreen
  // 스크린을 덮는 보여주는 방식
    case pageSheet
  // 기본 뷰를 일부분을 덮는 보여주는 방식
    case formSheet
  // 스크린의 중앙에 컨텐츠를 보여주는 방식
    case currentContext
  // 다른 뷰컨트롤러를 통해 내용을 보여주는 방식
    case custom
  // 사용자 정의 animator 객체로 부터 관리되는 보여주는 방식
    case overFullScreen
  // 스크린을 덮는 뷰를 보여주는 방식
    case overCurrentContext
  // 다른 뷰 컨트롤러의 컨텐츠를 통해 보여주는 방식
    case blurOverFullScreen
  // 새로 표현하는 뷰를 보여주기 전에 기존의 뷰를 흐릿하게 하며 보여주는 방식
    case popover
  // popover뷰로 보여주는 방식
    case none
}



Transition(화면 전환 방식) 종류


  • Cover Vertical: 위에서 아래로 올라옴
  • Flip Horizontal: 좌우로 뒤집어지는 효과
  • Cross Dissolve: 점점 사려지고 다음 화면 나오는 효과
  • Partial Curl: 종이 넘기는 효과




코드로 동작 만들기


Action으로 동작도 가능(StoryBoard 연결 있음)

위와 같이 Segue를 만들고

Action에 이걸 넣어도 가능

performSegue(withIdentifier: "showSegue", sender: sender)

Action으로 동작도 가능(StoryBoard 연결 없이)

  1. 아래와 같이 Identify에 이름을 넣기
  1. Action 부분에 아래와 같이 코드 작성
if let thirdView = self.storyboard?.instantiateViewController(identifier: "thirdView") {
    present(thirdView, animated: true, completion: nil)
}
  1. 그러면 아래와 같이 따로 Segue를 StoryBoard에서 연결해주지 않아도 화면 전환 가능



Unwind Segue

Unwind Segue는 View가 쌓여있을 때 지정한 곳으로 화면을 되돌리는 역할을 합니다.
pop과 dismiss를 한번 해서는 되돌아 갈 수 없는 곳으로도 갈 수 있습니다.

1. first view에 second view로 진행하는 액션과 UIStoryboardSegue를 파라미터 받는 IBAction을 만듭니다.

@IBAction func unwindVC1 (segue : UIStoryboardSegue) {}

2. Unwind를 하고자 하는 3번 ViewController가 존재하는 Storyboard에서 Control 키를 누른 채, 아래와 같이 클릭된 ViewController 아이콘에서 Exit으로 드래그하면 1번 ViewController에서 선언한 함수가 팝업에 뜹니다. 팝업에 뜬 segue를 클릭합니다.

3. 선언된 Unwind segue를 클릭하여 오른쪽 사이드 바에서 identifier를 선언해줍니다.

4. 3번 ViewController에서 아래의 코드를 선언해주면 Unwind Segue 구현이 완료됩니다.

@IBAction func goTo1(_ sender: UIButton) {
performSegue(withIdentifier: “unwindToVC1”, sender: self)
}

이 과정을 마치면 3번 View에서 어떠한 경우에도 1번 View로 이동하게 됩니다.



뒤로가기 버튼 자동 생성(Push)


  1. 원래는 그냥 카드 형태로 뒤로가기가 가능
  2. 뒤로가기 버튼이 자동 생성을 하고 싶으면?
  3. 네비게이션 컨트롤러 생성
  4. push방식으로 화면 전환



세그웨이 직전 제어


  • prepareForSegue() : 세그웨이 직전 제어
  • 세그웨이가 발생하기 직전에 수행된다.
  • sender 는 Segue를 발생시킨 trigger오브젝트이다.
    • 한 뷰 컨트롤러에서 다른 뷰컨트롤러의 세그웨이는 여러 개가 존재 할 수 있다
    • 그에 해당하는 trigger 에 따른 분기가 가능하다.
  • 이 메소드내에서 새로 보여질 뷰컨트롤러의 데이터를 제어할 수있다.
  • segue.identifier 프로퍼티를 이용해서 segue 종류에 따른 분기가 가능하다.
    • 한 뷰 컨트롤러가 전환 될 뷰 컨트롤러가 다양하여 Segue가 여러개 존재 할 수 있다.
  • segue.destination / segue.source 프로퍼티를 이용해서 destination 에 해당하는 뷰 컨트롤러에 데이터를 전달할 수 있다.



SheetPresentatilnController(특정 영역만큼 띄우기)

https://odinios.tistory.com/2

참고 자료

https://velog.io/@wook4506/iOS-Swift-화면-이동하기-세그-Segue
https://codecrafting.tistory.com/36
https://o-o-wl.tistory.com/44
https://sylii.tistory.com/4

다음 포스팅에서는
push와 present의 차이와
NavigationController의 push와 present 예정

profile
개발을 배우는 대학생입니다!

0개의 댓글

관련 채용 정보