SSAC_iOS_Day 5 | TIL

린다·2021년 10월 1일
0

SSAC_iOS_Dev

목록 보기
1/33
post-thumbnail

👩‍💻 수업

📂 다크모드

  • iOS 13 버전부터 등장했다.
  • 애플이 설정해둔 System 컬러는 다크모드에 자동으로 대응이 가능하다.
  • 다크 모드 디자인을 추가적으로 대응하지 않고 라이트 모드와 다크 모드에서 일관적인 디자인을 유지하기 위해서는 Info.plistAppearance 항목을 추가한 뒤 Value에 Light를 작성해주면 된다.

Semantic Colors

  • 의미적 색채 개념. 컬러값 보다는 목적 혹은 사용되는 객체에 따라 시스템화돼있다.
  • Custom 대응을 위해 Asset Catalog를 사용할 수 있다.

Asset Catalog

  • Asset 폴더의 Image Set, Color Set을 사용하여 다크모드에 쉽게 대응할 수 있다.
  • Any와 Dark 두 가지로 설정하면 다크 모드일 때 사용할 컬러 혹은 이미지를 설정할 수 있다.

다크모드 판별

  • Wandoo!를 업데이트할 때 한 번 봤던 코드여서 조금 익숙했다~!
  • 이때 #available은 버전 별 분기 처리를 해줘야하는 경우 사용하는 키워드이고
  • UiTraitCollection은 iOS 인터페이스 환경에 대한 정보를 갖고 있는 객체이다!
if #available(iOS 13.0, *) {
  switch traitCollection.userInterfaceStyle {
      case .light, .unspecified:
          view.backgroundColor = UIColor(named: "light")

      case .dark:
          dismissButton.backgroundColor = UIColor(named: "dark")
  }
} else {
	view.backgroundColor = .white
}

📂 Auto Layout

  • 각 디바이스 사이즈별 화면 호환성을 위해서 필요한 개념
  • 제약 조건 설정하는 방법
  1. 디바이스 기준의 여백 잡기
    ➡️ 크기, 객체 간의 간격을 설정하지 않으면 충돌이 생길 수 있다.

  2. 뷰 객체 간의 간격 조절
    ➡️ 여기서 빌드하면 문제가 생길 확률이 높다.
    ➡️ 각 개체의 크기가 정해지지 않았기 때문에

  3. 뷰 객체 중 일부분의 크기를 설정
    ➡️ 만약 두 객체가 있는 경우, 하나의 높이만 설정해주면 된다. 모든 영역에 대해 고정 높이를 설정해주면 문제가 생길 수 있기 때문에

Ex. 카카오톡 프로필 사진 위치는 어떻게 설정해야할까?

  1. 여백을 30으로 주고 나머지를 이미지가 채우도록 (여백에 대한 가이드)
  2. 고정돼있는 크기를 먼저 처리해달라. 디바이스가 어떤 크기 일지는 모르겠지만 최소한 프로필 이미지가 들어가는 영역은 80x80이었으면 좋겠다.
    ➡️ 이러한 경우에는 디바이스의 크기에 따라 여백이 너무 작아지거나 커질 수 있는 문제점이 있다.
    ➡️ 다양한 디바이스에 대한 대처가 가능하도록 비율을 기준으로 잡기도 한다.
  • 뷰 객체가 선택된 상태에서 Opt키 누르면 constraint 확인할 수 있다.
  • Preview에서 다른 기종들 추가하여 확인 가능하다.
  • 스토리보드에서 객체들 Cmd+C Cmd+V 혹은 Cmd+D로 복제가 가능하지만 IBOutlet이 연결돼있는 상태에서는 문제가 생길수도 있기 때문에 주의해야한다.
  • TextField, Switch 등등 높이 변경이 불가능한 컴포넌트들도 존재. 하지만 오토레이아웃(Height)으로 조절이 가능한 경우도 있다.
  • IBAction은 하나의 메서드로 여러 컴포넌트들에 적용시킬 수 있다.
  • 모든 컴포넌트들은 UIView에서 시작했다고 보면 된다. UIView를 상속하여 구성됐기 때문에 이에 대해 조절 가능한 요소들을 인스펙터창에서 확인할 수 있다.

📂 매개변수

  • 아래의 코드에서 buttonOutletName외부 매개변수, btn내부 매개변수이다.
    btn, title은 함수 내부에서 사용할 수 있고 buttonOutletName, buttonTitle은 함수 외부에서 사용한다.
func buttonUISetting(buttonOutletName btn: UIButton, buttonTitle title: String = "사탕"){
        btn.setTitle(title, for: .normal)
        btn.setTitleColor(.black, for: .normal)
        btn.layer.cornerRadius = 10
        btn.backgroundColor = .white
    }
  • 아래와 같이 '_' , 즉 와일드 카드 식별자를 사용하여 외부 매개변수를 생략할 수 있다.
    이런 경우, 메서드를 호출하는 경우에 buttonUISetting(tagButton1, "사탕")처럼 매개변수를 언급해주지 않아도 된다. 하지만 내부 매개변수는 함수 내부에서 사용해야하기 때문에 생략이 불가능하다.
  • 또한 너무 많이 생략하는 경우 메서드가 어떤 맥락에서 사용되는지 이해하기 어려울 수 있기 때문에 생략은 적절하게 해야한다.
func buttonUISetting(_ btn: UIButton, _ title: String){
        btn.setTitle(title, for: .normal)
        btn.setTitleColor(.black, for: .normal)
        btn.layer.cornerRadius = 10
        btn.backgroundColor = .white
    }
  • _ title: String = "사탕"처럼 매개변수의 타입 뒤에 Default Value를 설정해줄 수 있다. 이런 경우, 메서드를 호출할 때 buttonUISetting(tagButton1)처럼 매개변수가 생략되면 정해져있는 Default Value가 적용된다.
  • 매개변수가 여러 개 일 때, 기본값이 없는 매개변수를 기본값이 있는 매개변수 앞에 사용한다. 즉 기본값이 있는 매개변수가 뒤로 온다는 뜻.
  • 기본값에 옵셔널도 사용 가능.
func buttonUISetting(_ btn: UIButton, _ title: String = "사탕"){}

📂 기타

  • 키보드가 활성화된 상태에서 didEndOnExit 이벤트를 사용하여 Return키가 선택되는 이벤트 발생 시 view.endEditing(true)로 키보드를 내려줄 수 있다.
  • 아래와 같은 코드에서 sender는 내부 매개변수 호칭이다. 따라서 UIButton의 속성들을 메서드 내에서 활용할 수 있다. (Ex. sender.currentTitle)
@IBAction func foodTagButtonClicked(_ sender: UIButton) {
        userSearchTextField.text = sender.currentTitle
    }
  • IBAction으로 구현한 메서드도 다른 파트에서 호출이 가능하다.
override func viewDidLoad() {
        super.viewDidLoad()
        foodTagButtonClicked(tagButton1)
    }

👩‍💻 추가 스터디

📂 조건문

if

  • 주어진 조건이 참인 경우에만 구문 실행.
  • if - else
  • if - else if - else

Switch

  • 조건이 많은 경우에 사용하기 좋은 조건문
  • 원하는 조건들을 명시하여 case로 나누고, 이에 대응하지 않을 경우를 대비하여 default를 사용할 수 있다.
  • 이때 default는 필수 요소이다.

📂 Function

  • 프로그램의 실행 과정 중 독립적으로 처리될 수 있는 부분을 분리해 구조화시킨 부분
  • 동일한 과정을 반복 수행해야하는 경우에 효율적으로 사용할 수 있다. 더불어 유지보수에도 용이하다.

Function vs Method

  • 상황과 위치에 따라 부르는 이름이 다를 뿐 역할은 동일하다.
  • Function: 모듈 전체에서 전역적으로 사용할 수 있는 함수
  • Method: Struct, Class, Enum 등 특정 타입과 연관된 함수

매개 변수(Parameter) vs 전달 인자(Argument)

  • 전달 인자: 함수를 실제로 호출할 때 전달하는 값, value
  • 매개 변수: 전달 인자를 받을 변수, variable
func presentAlert(title: String) {
	print(title)
}

presentAlert(title: "hello")

이때 매개변수는 title, 전달 인자는 "hello"

재정의(Overriding)

  • 상위 클래스에 선언한 메서드를 하위 클래스에서 재정의해서 사용하는 것.
  • 매개변수의 이름, 타입, 반환 타입이 동일해야함. 또한 Override 키워드가 필수다.
  • 우리가 매일 보는 viewDidLoad() 또한 오버라이딩된 함수다. UIViewController Class에 이미 한 번 func viewDidLoad()가 정의돼있으나 이를 오버라이딩하여 우리가 필요한 함수들을 추가하여 사용할 수 있다.
override func viewDidLoad() {
	super.viewDidLoad()
}

중복정의(Overloading)

  • 동일한 메서드를 매개변수만 다르게 정의하여 사용하는 것
func reload(tv: UITableView) {
	tv.reloadData()
}

func reload(tv: UITableView, cv: UICollectionView) {
	tv.reloadData()
    cv.reloadData()
}

👩‍💻 Mission

  • 추후 서버 연동 등의 작업을 통해 외부에서 신조어 검색 데이터를 가져오는 케이스로 앱이 업데이트된다면, 검색 속도에 대한 개선이 필요할 수 있다. 또한 결과를 가져오는데 시간이 걸려서 로딩이 발생할 경우 사용자 UX를 통해 적절하게 기다려줄 수 있는 제스쳐를 구현해줘야함.
  • 검색결과가 3초가 지나야만 신조어 결과값을 가져올 수 있다고 가정해본다면, 어떤 UX를 통해 사용자가 결과값이 나올 때까지 기다릴 수 있게끔 유도할 수 있을까?
  • 검색결과가 오는 동안 해시태그 버튼이나 검색 버튼 등을 계속 클릭한다면 어떻게 될까? 이는 어떻게 해결할 수 있을까?

0개의 댓글