본문 바로가기
ios 개발 일지

[패스트캠퍼스][나만의 iOS 앱 개발 입문] [ iOS개발 강의] 4주차 학습일지

by IGBR 2022. 1. 18.

이번 주부터 본격적인 앱을 만들며 직접 실습을 하는 주차이다.

스위프트라는 처음 보는 언어를 공부하며 어려운 것도 많았던 반면 강사분의 친근하고 쉬운 설명을 통해 많은 배움이 있었다. 강의가 끝나더라도 계속해서 복습을 하여 스위프트를 통한 iOS 개발자가 꼭 되고 싶다. 


스위프트 프로젝트 생성 시 기본적으로 존재하는 파일들

1. AppDelegete.swift

- 앱의 Life Cycle(생명주기)를 관리하는 소스코드가 포함된 파일

- 앱을 실행하거나 종료 또는 백그라운드에서의 앱의 활동을 관리함

2. SceneDelegate.swift

- UI(사용자 인터페이스)의 Life Cycle(생명주기)를 관리하는 소스코드가 포함된 파일

3. ViewController.swift

- 화면에서 보이는 뷰에서 처리하는 부분들에 대한 소스 코드가 포함된 클래스 파일

- 뷰 하나당 클래스 하나가 대응됨

4. Main.storyboard

- 앱의 구성을 보다 쉽게 이해하고 프로그래밍할 수 있도록 시각적인 그림으로 표현하는 파일

- 화면에 보이는 구성 및 뷰와 뷰의 연결관계 등 쉽게 표현 가능

5. Assets.xcassets

- 앱에 사용될 다양한 에셋들을 관리

- 에셋과 다양한 디바이스의 속성에 대한 파일의 맵핑을 통해 앱 리소스에 접 글 할 수 있도록 함

6. LaunchScreen.storyboard

- 스플래시 화면( 인트로라고 불리기도 한다.)을 만드는 스토리보드

- 앱을 처음 실행할 시 자동적으로 나오고 사라지는 화면을 구성할 때 사용

7. Info.plist

- 앱을 실행하는 데 있어서 필요한 정보를 저장하고 있는 파일


Xcode에서 프로젝트 관련 단축키 모음

Cmd + Shift + O


버튼 클릭 구현

1. View에서 버튼 생성

- ViewController와 MainView를 생성하여 버튼을 하나 생성

// ViewController.swift
import UIKit

class ViewController: UIViewController {
    
    lazy var mainView: MainView = {
        return MainView(frame: self.view.bounds)
    }()
    
    static func instance() -> ViewController {
        return ViewController(nibName: nil, bundle: nil)
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        view = mainView
        view.backgroundColor = .white
    }
}
// MainView.swift
import UIKit

class MainView: UIView {
    lazy var button: UIButton = {
        let button = UIButton()
        
        button.setTitle("Button", for: .normal)
        button.setTitleColor(.black, for: .normal)
        return button
    }()
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        addSubview(button)
        
        button.frame = CGRect(x: 200, y: 200, width: 100, height: 100)
    }
    
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }
}

2. 버튼이 입력될 때 실행될 함수와 연결

- 버튼이 눌릴 때 함수인 onTapButton()를 정의한다. 

- addTarget메서드를 통하여 onTapButton() 함수를 호출시키도록 정의한다.

// ViewController.swift
import UIKit

class ViewController: UIViewController {
    
    lazy var mainView: MainView = {
        return MainView(frame: self.view.bounds)
    }()
    
    static func instance() -> ViewController {
        return ViewController(nibName: nil, bundle: nil)
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        view = mainView
        view.backgroundColor = .white
        
        mainView.button.addTarget(self, action: #selector(onTapButton), for: .touchUpInside)
    }
    
    @objc
    func onTapButton() {
        print("Button was tapped.")
    }
}

>> 버튼을 누를 때마다 "Button was tapped."가 출력된다.


모달

모달은 사용자가 원래 보고 있는 화면에 다른 화면을 띄우는 방식을 말한다. 그래서 모달은 흐름을 나타낼 때보다는 사용자의 주의나 이목을 끌어야 할 때 많이 사용되는 기법이다. 화면을 완전히 전환하는 내비게이션 인터페이스와는 완전히 다른 방식이기에 모달로 보이는 화면은 되도록 단순하고 사용자가 빠르게 처리할 수 있는 내용을 표현하는 것이 좋다.

 

띄울 화면을 드래그 앤 드랍으로 segue를 연결할 수 있다.

 

모달의 Presentation Style

모달이 어떻게 표현될 것인가를 정해준다.

 

- UIModalPresentationFullScreen : 전체 화면을 덮음

- UIModalPresentationPageSheet : 페이지를 덮음

- UIModalPresentationFormSheet : 폼 형태로 덮음

- UIModalPresentationPopover : 팝 오버로 표현(아이폰은 지원 X)

- UIModalPresentationCureentContext : 원래의 뷰의 크기에 맞춤

- UIModalPresentationCustom : 사용자가 커스텀 가능

 

모달의 Transition Style

전환 시 어떠한 애니메이션을 사용할 건지 정해준다.

 

- coverVertical : 하단에서 새로운 뷰가 올라옴. (default)

- flipHorizontal : 수평으로 뒤집어짐

- crossDissolve : 화면 전체가 빠르게 바뀜 

- partialCurl : 위로 책을 넘기는 느낌으로 전환됨

 

coverVertical


Segue로 뷰 전환시 데이터 전달 방법

- storyboard에서 Segue를 이용하는 방법
FirstViewController -> SecondViewController로 향하는 segue를 먼저 생성하고 이름을 FirstToSecond로 지정해준다.

FirstViewController -> Segue -> SecondViewController 과정에서 Segue 실행 시 prepare 함수가 호출되는데 이 함수에서 전달하고자 하는 데이터를 함께 넘길 수 있도록 한다

import UIKit

class FirstViewController: UIViewController{

    @IBOutlet weak var sendButton: UIButton!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
    }
    
    @IBAction func sendData(_ sender: Any) {
        performSegue(withIdentifier: "FirstToSecond", sender: nil)
    }
    
    // segue 실행 전 전달하려는 데이터 set 
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.destination is SecondViewController {
            guard let vc = segue.destination as? SecondViewController else { return }
            vc.data = "hello World"
        }
    }
    
}

 

 

이렇게 4주차도 끝이 났다. 벌써 마지막 주인 5주 차가 남았는데 마지막까지 열심히 해서 꼭 유종의 미를 거두고 싶다. 

지금은 간략하게 적어두지만 새로운 개념이 생길때 마다 찾아와서 게시글들을 수정해 나갈 계획이다. 천천히 쌓이는 게시글만큼 나도 같이 기반이 다져졌으면 한다.

댓글