Alert & Action Sheet


destructive

  • 빨간색으로 경고 (스타일 먹인거 아니다)

default

  • 파란색 기본

cancel

  • 파란색으로 default보다 볼드하다
  • 추가되는 위치에 상관없이 action sheet 맨 아래, alert 왼쪽에 붙는다.
  • cancel 스타일은 하나만 존재할 수 있으며, 두개 이상 붙일 경우 런타임 에러

스타일과 텍스트는 상관없다. 개발자가 의도에 맞게 스타일을 사용

Alert vs Action Sheet


Alert

  • title message를 nil로 잘 안씀
  • 배경을 터치해도 내려가지 않는다
  • 따라서, 좀 더 주의해야하는 상황(허용함, 허용안함 등)에서 사용한다

Action Sheet

  • 배경 터치하면 자연스럽게 사라진다

컨트롤러 종류


UIMenuController (영역 드래그했을 때 복사, 붙여넣기 뜨는거다)

UIDocumentPicker ViewController(파일에서 선택)

UIImagePicker ViewController

UIFontPicker ViewController (iOS 13부터 생겼다, 폰트를 선택할 수 있다.)

UIColorPicker ViewController (iOS 14부터 생겼다)

이외에 다양한 뷰컨트롤러가 존재한다.

  • 스토리보드에서 color well 넣으면 누르면 컬러피커뷰컨으로 이동한다

Xcode 공식문서 단축키


  • shift + command + 0

  • 사진처럼 label안에 어떤 변수들이 사용되는지

  • UIButton은 UIControl을 상속받고 있다.

  • 배운걸 확인하는 느낌으로 공식문서랑 친해지자

NS~~


  • objecctive-C에서 사용되던 것이다
  • Next Step의 약자

iOS 계층구조


Cocoa Touch Framework

  • 개발자가 100% 사용하는 박스
  • UIkit,Foundation ..
  • iOS앱을 만드는데 최소한 필요한 요소들의 묶음

Media

  • 파일, 음악, 영상들을 다루는 기능

CoreService

  • 센서, GPS, 카메라 같이 내장된 하드웨어를 이용해서 사용하는 기능

CoreOS

  • 배터리, wifi, 물리적 버튼 같은 개발자가 수정할 수 없는 사항들이 있음

아래로 갈수록 접근하기 어렵고 잘 접근하지 않는다

우리는 Cocoa touch framework기반으로 앱을 만들고

UIKIt을 주로 사용한다.

서비스에서 GPS나 센서기능을 사용할 때는 어떻게 하나요?

  • 직접 접근하지 않고 라이브러리를 통해 사용할 수 있어요~

Raw String


  • string 내부에서 큰따옴표(")등을 직접 표현하기 위해서는 \"이런 형태로 escaping을 한다.
  • 하지만 이게 번거롭기 때문에 Swift5부터는 String을 좀 더 raw하게 쓰는 방법으로 raw string을 제공한다.
  • 자세한 내용은 추후에

Action Sheet에서 title과 message 없애기


Action Sheet는 Alert와 달리 제목과 내용을 거의 사용하지 않는다. 어떻게 없앨까?

  1. title자리에 빈문자열 넣기
  • 제목영역에 그대로 칸이 남아있다
  1. title자리에 nil 문자열 넣기
  • 칸까지 잘 없어진다

Action Sheet, Alert에 다른 폰트, 컬러는 어떻게 적용하나요?

  • 기본적으로는 변경이 어렵다
  • 파고 파고들어가서 폰트와 컬러를 바꿀수 있긴 한데 거의 쓰지 않는다.
  • 내장된 기능대신 직접 만들어서 쓴다

Alert in iPadOS


iOS에서 쓰던 alert 코드를 iPad에서 그냥 쓰면 iPad에서 앱이 꺼짐

  • 화면 크기가 다르기 때문이다
  • ipad에서는 위치를 조절하는 코드가 추가로 들어가야 한다.
  • ipad에서 대응하려면 어떤 코드를 추가해야 할까?

@IBAction 팁


뷰객체 여러개에 액션을 연결해서 중복되는 기능들을 하는 button들에 기능을 한번에 부여할 수 있다.

  • 다음 경우에는, type을 UIButton으로 해놨기 때문에 gesture에는 연결 못함

  • type을 Any로 수정하면 UI Gesture Recognizer도 사용가능하다. (Any가 필요한 경우)

Any를 사용할 경우 단점

  • UIButton으로 설정 시, sender. 으로 버튼의 요소에 간편하게 접근이 가능하다

  • Any로 설정 시는 어떤 타입이든 올 수 있어 매개변수로 요소에 접근이 불가하다.

UIBUtton


iOS 15 전후로 나뉜다

iOS 15 이전

  • default

iOS 15 이후

  • gray, plain, tint등 다양한 스타일을 제공한다

  • Configuration은 15이후에 등장했다.

AppDelegate, SceneDelegate, 앱의 생명주기


iOS 13 전후

Not Running

  • 앱이 시작되기 전 상태
  • 아이폰의 어떤 영역도 차지하지 않는다

Foreground

Active

  • 앱이 화면에서 실행중인 상태이다
  • 많은 앱중에서 하나의 앱만 Active상태로 존재할 수 있다

Inactive

  • 앱이 화면에서 실행 중이나 어던 신호도 받지 않는 상태이다
  • 앱을 쓰고 있는 도중 시스템에 의해 (전화 알람 등) 잠깐 비활성화 되는 상태이다

Background

  • 앱이 화면에 보이지 않지만, 코드를 실행하고 있는 상태이다
  • ex)유튜브(백그라운드 재생), 멜론(음악 재생)
  • 뒤에 깔려 있어도 엄청 오래 안쓰게 되면, Suspend상태로 들어간다

Suspended

  • 앱이 곧 종료될 상태이다
  • 시스템에 의해 Not Running상태로 간다 (언제인지는 알 수 없다)

iOS 13 이후(ipad OS의 등장)


  • 아이패드에서 두가지 앱을 동시에 띄울수 있게 되었다
  • slide over로 더 띄울 수 있음

기존에는 AppDelegate에서 앱의 생명주기를 다 관리했으나 이제 하나의 화면에 2가지 이상의 앱이 뜨는 상황이 발생하여 UI LifeCycle을 따로 관리할 필요성이 생겼다

  1. 앱 실행 / 제거 → App Delegate
  2. UI LifeCycle → Scene Delegate

SceneDelegate 관련 생각해볼것


iOS 14 부터는 전화오면 full스크린으로 뜨지 않고 화면 상단에 뜬다.

  • 이 때는 active일까? inactive일까?

pip모드로 유튜브 영상을 보고 있을 때 보고 있던 앱은

  • active일까? inactive일까?

시리 버튼을 눌러서 시리가 떴을 때는

  • active일까? inactive일까?

iOS 버전 대응하기


버전을 iOS 12.4로 낮춰보자

  • SceneDelegate를 13.0부터 지원하기 때문에 에러가 뜨는 것을 확인할 수 있다

어떻게 대응할까?

다음과 같이 @available을 사용해서 대응할 수 있다.

iOS 14.0부터 지원되는 datePicker의 기능에 대응해보자

  • .inline은 14.0부터 지원한다 이전에는 다 wheel방식이었다.

  • 다음과 같이 기능을 사용하는 곳에서 조건문을 통해 분기하여, 버전별로 대응할 수 있다.

DatePicker


  • 그냥 쓰면 영국 표준시 기반으로 뜬다
  • 시간 설정을 잘 해줘야함

Clips to Bounds


  • layer에 cornerRadius를 적용했을 때, 이미지 뷰는 둥글게 깎이나 label은 깎이지 않고 있다.

  • label에 clipsToBounds를 true로 설정하면 깎인다.

  • view의 layer는 테두리이다.

  • Clips to Bounds는 테두리를 제외한 영역을 버릴지 말지, 결정한다

왜 어떤건 clipsToBounds해야 깎이고 어떤 건 안써도 깎이나요?
- 이는 뷰 객체 별로, 기본 설정이 다르기 때문이고 굳이 외우진 않는다.

  • 그래서 cornerRadius를 줄 때, 습관적으로 clipsToBounds = true를 항상 세트로 쓰는 경우도 많다.

Shadow


  • 그림자는 바깥쪽에 적용되는 거라, clipsToBounds를 false로 설정해줘야 한다.

그럼 cornerRadius와 shadow를 같이 줘야 할 때는 어떻게 할까?

Signing


시뮬레이터 → 가짜기기 → X None으로 설정해도 무방하다

기기 → 진짜기기 → Team 필수

  • 아무앱이나 설치하게 하면, 실기기에 문제가 발생할 수 있기 때문이다

출시되지 않은 앱을 실제 기기에서 빌드하려면

  • 설정 - 개인정보 보호 및 보안 - 개발자모드
  • 개발자 모드 on

hidden 속성


hidden일 경우, 자기 자리는 차지하고 안보이는 것이다

카카오톡에서 단톡방 사람 수, 핀 기호 같은 건 하나가 없어지면 밀려서 그 자리를 채운다 어떻게 할까?

  • StackView 내의 객체를 hidden처리 하면, 빈 자리를 채우면서 땡겨온다.

alpha VS opacity


Alpha

  • 부모 뷰의 alpha를 바꾸면 포함된 자식 뷰도 다 투명해진다
    Opacity

  • 하위 뷰에 영향없이 투명도를 조절할 수 있다.

Xcode 팁


Connect Via network

  • 맥북과 아이폰이 동일한 Wifi를 사용하고 있으면 무선빌드가 가능하다.

Device Conditions

  • 환경을 의도적으로 낮춘다
  • 인터넷이 안되는 환경 등에서 앱을 테스트할 때 사용한다

Simulator

  • 출시때는 15.0정도 받아서 체크하는 것을 권장한다

date formatter


  1. 시간대 변경
  2. 날짜 포맷 변경

6월 16일 이렇게 날짜를 표현을 하고 싶을 때

형식: yyyy-MM-dd hh:mm:ss

  • 위와 같이 공통적인 형태로 정의되어있다
  • M월 d일 = 6월 1일
  • MM월 = 06월
  • dd일 = 01일

mm 은 분임, MM과 구별 주의한다^^

날짜 계산


  1. time interval (second, 초 기반) 하루 = 86400초
  • 초단위로 더한다..
  1. Calendar
  • 날짜, 시간 등 맞는 단위로 add를 해준다! 이전 날짜일 경우 -n

outlet에 !가 왜 붙을까?



다음과 같이 ?로 설정할 수 있는데

사용하는 모든 곳에서 옵셔널 처리를 해줘야 한다.
그래서 쓰기 쉽게 Xcode에서 기본적으로 기본은 !로 설정되어있다.

background100ImageView가 nil이니?
nil이면 뒤에 코드가 실행되지 않음 → 앱 꺼지지 않는다

profile
Divide and Conquer

0개의 댓글