오토레이아웃이란?

|

개인공부 후 자료를 남기기 위한 목적임으로 내용 상에 오류가 있을 수 있습니다.


오토레이아웃이란?

아이폰 기종은 우리도 다 알다시피 iPhone4, iPhoneSE, iPhone8, iPhone8 Plus 그리고 iPhoneX등 다양한 사이즈와 화면비율로 출시되면서 사이즈의 구애를 받지 않고 시각적으로 동일한 화면을 구현해야 하는 데 이를 위한 가장 편리하고 권장되는 방법이 오토레이아웃 이다.

  • 뷰의 제약 사항을 바탕으로 뷰 체계 내의 모든 뷰의 크기와 위치를 동적으로 계산
  • 애플리케이션을 사용할 때 발생하는 외부 변경과 내부 변경에 동적으로 반응하는 사용자 인터페이스를 가능하게 함

외부변경(External Changes)

슈퍼뷰의 크기나 모양이 변경될 때 발생
각각의 변화와 함께 사용가능한 공간을 가장 잘 사용할 수 있도록 뷰 체계의 레이아웃을 업데이트 해줘야 함

  • 사용자가 아이패드의 분할뷰(Split View)를 사용하거나 사용하지 않는 경우
  • 장치를 회전하는 경우
  • 활성화콜(acitive call)과 오디오 녹음 바가 보여지거나 사라지는 경우
  • 다른 크기의 클래스를 지원하기 원하는 경우
  • 다른 크기의 스크린을 지원하기 원하는 경우

이러한 변경사항은 대부분은 실행 시간에 발생할 수 있으며 애플리케이션으로부터 동적인 응답을 요구한다. 다른 스크린 크기를 지원하는 것과 같은 것은 애플리케이션이 다른 환경에 적응하는 것을 나타낸다. 스크린 크기가 일반적으로 실행 시간에 변경되지 않는다고 하더라도, 적응형 인터페이스를 만들면 애플리케이션이 아이폰 4S, 아이폰 6 플러스, 또는 아이패드에서도 모두 동일하게 잘 작동할 수 있다. 오토레이아웃은 아이패드 내부 변경에서 슬라이드와 분할뷰를 지원하는 핵심 요소이기도 합니다.

내부변경(Internal Changes)

사용자 인터페이스의 뷰의 크기 또는 설정이 변경되었을 때 발생

  • 애플리케이션 변경에 의해 콘텐츠가 보여지는 경우
  • 애플리케이션이 국제화를 지원하는 경우
  • 애플리케이션이 동적 타입을 지원하는 경우

애플리케이션 콘텐츠가 변경됐을 때, 새로운 콘텐츠는 예전과 다른 레이아웃을 필요 할 수 있다. 새로운 애플리케이션이 각각의 신문 기사의 크기에 기반을 둔 레이아웃을 조정할 필요가 있는 경우와 같이, 텍스트 또는 이미지를 보여주는 애플리케이션에서 일반적으로 발생하는 일이다. 이와 비슷하게, 사진 콜라주는 이미지 크기와 영상의 가로 세로의 비율을 다뤄야한다.

오토레이아웃이 왜 필요할까?

오토레이아웃은 아래의 경우와 같이 인터페이스의 절대적인 좌표가 아닌 동적으로 상대적인 좌표가 필요한 경우에 유용 하다.

  • 애플리케이션이 실행되는 iOS 기기의 스크린 화면의 크기가 다양한 경우
  • 애플리케이션이 실행되는 iOS 기기의 스크린이 회전할 수 있는 경우
  • 상태표시줄(Status Bar)에 전화 중임을 나타내는 액티브 콜(active call)과 오디오 녹음 중임을 나타내는 오디오 바가 보여지거나 사라지는 경우
  • 애플리케이션의 콘텐츠가 동적으로 보여지는 경우
  • 애플리케이션이 지역화(Localization)를 지원하는 경우
  • 애플리케이션이 동적 타입을 지원하는 경우

오토레이아웃 속성

오토레이아웃의 속성은 정렬 사각형을 기반으로 한다.

  • Width : 정렬 사각형의 너비
  • Height : 정렬 사각형의 높이
  • Top : 정렬 사각형의 상단
  • Bottom : 정렬 사각형의 하단
  • Baseline : 텍스트의 하단
  • Horizontal : 수평
  • Vertical : 수직
  • Leading : 리딩, 텍스트를 읽을 때 시작 방향
  • Trailing : 트레일링, 텍스트를 읽을 때 끝 방향
  • CenterX : 수평 중심
  • CenterY : 수직 중심

안전 영역(Safe Area)

안전 영역은 콘텐츠가 상태바, 내비게이션바, 툴바, 탭바를 가리는 것을 방지하는 영역 입니다. 표준 시스템이 제공하는 뷰들은 자동으로 안전 영역 레이아웃 가이드를 준수하게 되어있다. 기존의 상/하단 레이아웃 가이드(Top/Bottom Layout Guide)를 대체하며, 하위 버전에도 호환하여 작동한다.

안전 영역은 iOS 11부터 사용할 수 있으며, iOS 11 미만의 버전에서는 상/하단 레이아웃 가이드를 사용한다.

안전 영역 레이아웃 가이드는 UIView클래스의 var safeAreaLayoutGuide: UILayoutGuide로 접근할 수 있다.

제약(Constraint)

제약은 뷰 스스로 또는 뷰 사이의 관계를 속성을 통하여 정의하며, 제약은 방정식으로 나타낼 수 있다.

  • Item1 : 방정식에 있는 첫 번째 아이템(B View)이며, 첫 번째 아이템은 반드시 뷰 또는 레이아웃 가이드
  • Attribute1 : 첫번째 아이템에 대한 속성이며 이 경우, B View의 리딩
  • Multiplier : 속성 2에 곱해지는 값이며, 이 경우 1.0이다.
  • Item2 : 방정식에 있는 두 번째 아이템(A View)
  • Attribute2 : 두번째 아이템에 대한 속성으로 이 경우, A View의 트레일링
  • Constant : 두번째 아이템의 속성에 더해지는 상수 값

위의 예제 방정식의 제약을 해석하면 ‘B View의 리딩은 A View의 트레일링의 1.0배에 8.0을 더한 위치’ 가 된다.

고유 콘텐츠 크기(Intrinsic Content Size)

뷰의 고유 콘텐츠 크기는 뷰가 갖는 원래의 크기로, 예를 들어 레이블의 고유 콘텐츠 크기는 레이블의 텍스트의 크기고, 이미지의 고유 콘텐츠 크기는 이미지 자체의 크기이다.

제약 우선도(Constraint Priorities)

오토레이아웃은 뷰의 고유 콘텐츠 크기를 각 크기에 대한 한 쌍의 제약을 사용하여 나타낸다.
우선도가 높을수록 다른 제약보다 우선적으로 레이아웃에 적용하며, 같은 속성의 다른 제약과 경합하는 경우, 우선도가 낮은 제약은 무시된다.

  • 콘텐츠 허깅 우선도(Content hugging priority) : 콘텐츠 고유 사이즈보다 뷰가 커지지 않도록 제한.
    • 다른 제약사항보다 우선도가 높으면 뷰가 콘텐츠 사이즈보다 커지지 않음
  • 콘텐츠 축소 방지 우선도(Content compression resistance priority) : 콘텐츠 고유 사이즈보다 뷰가 작아지지 않도록 제한.
    • 다른 제약사항보다 우선도가 높으면 뷰가 콘텐츠 사이즈보다 작아지지 않음

레이아웃 마진

뷰에 콘텐츠 내용을 레이아웃할 때 사용하는 기본 간격(default spacing)

레이아웃 마진 가이드(Layout Margins Guide): 레이아웃 마진에 따라 형성되는 사각의 프레임 영역

앵커(Anchor)

오토레이아웃을 코딩으로 구현하여 제약(Constraint)을 만들기 위해 앵커(Anchor)를 사용

Layout Anchor 사용 예제

중앙에 버튼을 배치하고 버튼의 top anchor를 사용하여 레이블을 버튼의 상단으로부터 10만큼 떨어지도록 배치

1.객체 라이브러리에서 버튼과 레이블을 추가해줍니다. 이제 앵커를 활용하여 제약을 만들어봅시다.

2.@IBOutlet을 활용하여 인터페이스 빌더에서 ViewController.swift 파일로 버튼과 레이블을 연결해줍니다.

3.버튼을 중앙에 배치하기 위해 버튼의 수평과 수직의 중앙 앵커를 뷰 컨트롤러의 뷰의 중앙에 기준을 잡아준다. 생성된 제약을 적용하기 위해선 isActive 프로퍼티의 값을 true로 설정 해주면 됩니다.

translatesAutoresizingMaskIntoConstraints : 오토레이아웃이 도입되기 전 뷰를 유연하게 표현할 수 있도록 오토리사이징 마스크를 사용하였는데, 오토레이아웃을 사용하게 되면 기존의 오토리사징 마스크가 가지고 있던 제약조건이 자동으로 추가되기 때문에 충돌하게 될 가능성이 발생한다. 그래서 translatesAutoresizingMaskIntoConstraints의 값을 false로 지정 한 뒤 오토레이아웃을 적용해준다. 참고로 인터페이스 빌더에서 오토레이아웃을 적용한 경우에는 자동으로 값이 false로 설정됩니다. (참조: translatesAutoresizingMaskIntoConstraints)

4.레이블의 수평 중앙을 버튼의 수평 중앙 앵커를 기준으로 제약을 생성한 후, 레이블의 하단 앵커를 버튼의 상단 앵커로부터 10만큼의 거리를 두도록 한다.(상단 앵커기준으로 위로의 거리는 부호가 - 라는 점을 주목) 생성된 제약을 적용하기 위해 isActive 프로퍼티를 true 로 설정. 그림과 같이 레이블이 버튼의 상단에 자리 잡고 있는 것을 볼 수 있다.

속성에 곱해지는 multiplier를 활용 > 앵커를 활용하여 레이블의 너비가 버튼의 너비의 2배가 되도록 제약을 만들어 본다.

5.위의 코드를 추가하여 레이블의 너비가 버튼의 너비의 2배가 된 것을 확인

Cocoa Touch 프레임워크와 UIKit, Foundation

|

개인공부 후 자료를 남기기 위한 목적임으로 내용 상에 오류가 있을 수 있습니다.


Cocoa Touch 프레임워크란?

iOS 애플리케이션 개발 환경으로, 애플리케이션의 다양한 기능 구현에 필요한 여러 프레임워크를 포함하는 최상위 레벨의 프레임 워크

  • macOS 애플리케이션 제작에 사용하는 프레임워크
  • 핵심 프레임워크인 UIKitFoundation을 포함

UIKit 프레임워크란?

iOS 애플리케이션의 사용자 인터페이스를 구현하고 이벤트를 관리하는 프레임워크

  • 제스처처리, 애니메이션, 그림 그리기, 이미지 처리, 텍스트 처리 등 사용자 이벤트 처리를 위한 클래스를 포함
  • 테이블 뷰, 슬라이더, 버튼, 텍스트필드, 얼럿 창 등 애플리케이션의 화면을 구성하는 요소를 포함
  • UIKit 클래스 중 UIResponder에서 파생된 클래스나 사용자 인터페이스 관련된 클래스는 애플리케이션 메인 스래드에서만 사용
  • UIKit는 iOS와 tvOS플랫폼에서 사용

UIKit 기능별 요소

사용자 인터페이스

  • View and Control: 화면에 콘텐츠 표시
  • View Controller: 사용자 인터페이스 관리
  • Animation and Haptics: 애니메이션과 햅틱을 통한 피드백 제공
  • Window and Screen: 뷰 계층을 위한 윈도우 제공

사용자 액션

  • Touch, Press, Gesture: 제스처 인식기를 통한 이벤트 처리 로직
  • Drag and Drop: 화면 위에서 드래그 앤 드롭 기능
  • Peek and Pop: 3D 터치에 대응한 미리 보기 기능
  • Keyboard and Menu: 키보드 입력을 처리 및 사용자 정의 메뉴 표기

생각해보기 새롭게 ViewController를 생성하면 상단에 ‘import UIKit’이 기본적으로 명시되어있는걸 본적 있다
왜 ViewController와 UIKit는 단짝일까요?

내가 생각한 답
기본적으로 UIKit는 iOS 사용자 인터페이스를 구현하는 프레임워크이다. 사용자 인터페이스를 관리하는 View Controller를 건들기 위해서는 기본적으로 이를 관리하는 프레임워크인 UIKit가 import되어야 한다고 생각한다.

Foundation

원시 데이터타입(String, Int, Double), 컬렉션 타입(Array, Dictionary, Set) 및 운영체제 서비스를 사용해 애플리케이션의 기본적인 기능을 관리하는 프레임워크

  • 데이터타입, 날짜 및 시간 계산, 필터 및 정렬, 네트워킹 등의 기본 기능 제공
  • 프레임워크에서 정의한 클래스, 프로토콜 및 데이터 타입은 iOS뿐 아니라 macOS, watchOS, tvOS등 모든 애플 SDK에서 사용

Foundation에서 제공하는 데이터타입 및 컬렉션 타입의 대부분은 Objective-C 언어의 기능에서 지원하지 않는 것이기 때문에 언어기능을 보완하기 위한 구현이며, Swift에서는 이에 해당하는 데이터 타입과 기능 대부분을 Swift표준 라이브러리에서 제공한다.

Foundation 기능별 요소

기본

  • Number, Data, String: 원시 데이터 타입 사용
  • Collection: Array, Dictionary, Set등과 같은 컬렉션 타입 사용
  • Data and Time: 날짜와 시간을 계산하거나 비교하는 작업
  • Unit and Measurement: 물리적 차원을 숫자로 표현 및 관련 단위 간 변환 기능
  • Data Formmating: 숫자, 날짜, 측정값 등을 문자열로 변환 또는 반대 작업
  • Filter and Sorting: 컬렉션의 요소를 검사하거나 정렬하는 작업

애플리케이션 지원

  • File System: 파일 또는 폴더를 생성하고 읽고 쓰는 기능 관리
  • Archives and Serialization: 속성목록, JSON, 바이너리 파일들을 객체로 변환 또는 반대작업 관리
  • iCloud: 사용자의 iCloud 계정을 이용해 데이터를 동기화하는 작업 관리

네트워킹

  • URL Loading System: 표준 인터넷 프로토콜을 통해 URL과 상호작용하고 서버와 통신하는 작업
  • Bonjour: 로컬 네트워크를 위한 작업

생각해보기. 새롭게 ViewController 파일을 생성하면 상단에 ‘import UIKit’이 기본적으로 명시되어있다. 그렇다면 어떤 파일을 생성하면 ‘import Foundation’이 기본적으로 명시되어있을까요?

내가 생각한 답
원시 데이터 타입 및 컬렉션 타입을 사용하기 위해 기본적인 Swift파일을 생성할때 import Foundation이 된다. UIKit 내부에도 Foundation이 들어있지만, 이를 분리해서 import를 하는 이유는 iOS의 디자인 패턴인 MVC 모델을 생성할 때 사용자 인터페이스와 비즈니스 로직을 분리하기 위해 데이터 타입에서 쓰이는 Foundation을 쓰도록 권장한 것이 아닐까 싶다.

swift UIButton, UISlider, UILabel

|

개인공부 후 자료를 남기기 위한 목적임으로 내용 상에 오류가 있을 수 있습니다.


UIButton, UISlider, UILabel

애플리케이션 화면을 구현할 때 자주 사용하는 UI요소들이다.

UIButton

사용자의 상호작용(터치/탭 등의 이벤트)에 반응해 미리 지정된 코드를 실행하는 컨트롤 요소

버튼 생성의 3단계

  1. 버튼을 생성하고 버튼의 유형을 선택
  2. 버튼을 나타내기 위한 문자(타이틀)을 입력하거나, 이미지를 설정한 뒤 크기를 조정
  3. 버튼에 특정 이벤트가 발생할 때 작동할 하나 이상의 메서드를 연결

버튼과 메서드 연결하는 방법

  1. addTarget(_:action:for:) 메서드 사용
  2. 인터페이스 빌더에서 연결 (@IBAction)

이때 버튼과 연결되는 메서드 형식은 아래와 같다.

func doSomething()
func doSomething(sender: UIButton)
func doSomething(sender: UIButton, forEvent event: UIEvent)

버튼의 상태: default, highlighted, focused, selected, disabled

버튼의 상태는 조합된 상태일 수 있다. 예) [default + highlighted], [selected + disabled] 등등
버튼 생성 시 기본 상태 값은 default이며, 사용자가 버튼과 상호작용을 하면 상태 값이 변하게 된다.

그리고, 프로그래밍 방식 혹은 인터페이스 빌더를 이용해 버튼의 각 상태에 대한 속성을 별도로 지정할 수 있습니다. 만약 별도로 속성을 지정하지 않으면 UIButton 클래스에서 제공하는 기본 동작을 사용하게 된다. 예) disabled 버튼은 일반적으로 흐리게 표시되며 사용자가 탭 해도 highlighted 되지 않는다.

버튼의 프로퍼티 값을 설정하는 방식에는 코드를 이용하는 방법과 스토리보드의 인스팩터를 이용하는 방법이 있다.

enum UIButtonType: 버튼의 유형

버튼의 유형에 따라 버튼의 기본적인 외형과 동작이 달라진다. 처음 버튼을 생성할 때

  1. init(type:) 메서드를 이용 혹은
  2. 인터페이스빌더의 “Attribute Inspector”에서 버튼 유형을 지정할 수 있다

이때 한번 생성된 버튼의 유형은 이후 변경 할 수 없으며, 가장 많이 사용하는 유형은 CustomSystem이지만 필요에 따라 다른 유형(Detail Disclosure, Info Light, Info Dark, Add Contact)를 사용할 수 있다.

  • var titleLabel: UILabel?: 버튼 타이틀 레이블
  • var imageView: UIImageView?: 버튼의 이미지 뷰
  • var tintColor: UIColor!: 버튼 타이틀과 이미지의 틴트 컬러

버튼의 주요 메서드

// 특정 상태의 버튼의 문자열 설정
func setTitle(String?, for: UIControlState)

// 특정 상태의 버튼의 문자열 반환
func title(for: UIControlState) -> String?

// 특정 상태의 버튼 이미지 설정
func setImage(UIImage?, for: UIControlState)

// 특정 상태의 버튼 이미지 반환
func image(for: UIControlState) -> UIImage?

// 특정 상태의 백그라운드 이미지 설정
func setBackgroundImage(UIImage?, for: UIControlState)

// 특정 상태의 백그라운드 이미지 반환
func backgroundImage(for: UIControlState) -> UIImage?

// 특정 상태의 문자열 색상 설정
func setTitleColor(UIColor?, for: UIControlState)

// 특정 상태의 attributed 문자열 설정
func setAttributedTitle(NSAttributedString?, for: UIControlState)

UILabel

한줄 또는 여러줄의 텍스트를 보여주는 뷰로, UIButton등의 컨트롤의 목적을 설명하기 위해 사용하는 경우가 많다.

레이블 생성의 3단계

  1. 레이블을 생성
  2. 레이블이 표시할 문자열을 제공
  3. 레이블의 모양 및 특성을 설정

레이블 주요 프로퍼티

var text: String? // 레이블이 표시할 문자열, 문자열이 모두 동일한 속성(폰트, 색상, 기울임꼴 등)으로 표시됩니다.
// text 프로퍼티에 값을 할당하면 attributedText 프로퍼티에도 똑같은 내용의 문자열이 할당됩니다.

var attributedText: NSAttributedString? :  // 레이블이 표시할 속성 문자열
// NSAttributed 클래스를 사용한 속성 문자열 중 특정 부분의 속성을 변경할 수 있다([예] 일부 글자 색상 변경/일부 글자 폰트 변경)
// attributedText 프로퍼티에 값을 할당하면 text 프로퍼티에도 똑같은 내용의 문자열이 할당

var textColor: UIColor! :  // 문자 색상
var font: UIFont!:  // 문자 폰트

var textAlignment: NSTextAlignment:  // 문자열의 가로 정렬 방식으로 left, right, center, justified, natural 중 하나를 선택

var numberOfLines: Int:  // 문자를 나타내는 최대 라인 수
// 문자열을 모두 표시하는 데 필요한 만큼 행을 사용하려면 0으로 설정, 기본 값은 1
// 설정한 문자열이 최대 라인 수를 초과하면 lineBreakMode 프로퍼티의 값에 따라 적절히 잘라서 표현
adjustsFontSizeToFitWidth  // 프로퍼티를 활용하면 폰트 사이즈를 레이블의 넓이에 따라 자동으로 조절해줌

var baselineAdjustment: UIBaselineAdjustment  // 문자열이 Autoshrink 되었을 때의 수직 정렬 방식

Align Baseline  // 문자가 작아졌을 때 기존 문자열의 기준선에 맞춤
Align Center  // 문자가 작아졌을 때 작아진 문자의 중앙선에 맞춤
None  // 문자가 작아졌을 때 기존 문자열의 위쪽 선에 맞춤

var lineBreakMode: NSLineBreakMode  // 레이블의 경계선을 벗어나는 문자열에 대응하는 방식

Character wrap  // 여러 줄 레이블에 주로 적용되며, 글자 단위로 줄 바꿈을 결정
Word wrap  // 여러 줄 레이블에 주로 적용되며, 단어 단위로 줄 바꿈을 결정

Truncate head  // 한 줄 레이블에 주로 적용되며, 앞쪽 텍스트를 자르고 ...으로 표시
Truncate middle  // 한 줄 레이블에 주로 적용되며, 중간 텍스트를 자르고 ...으로 표시
Truncate tail  // 한 줄 레이블에 주로 적용되며, 끝쪽 텍스트를 자르고 ...으로 표시, 기본 설정 값임

UISlider

연속된 값 중에서 특정 값을 선택하는 데 사용되는 컨트롤

슬라이더 생성의 3단계

  1. 슬라이더를 생성하고, 슬라이더가 나타내는 값의 범위를 지정
  2. 적절한 색상과 이미지를 이용해 슬라이더의 모양을 구성
  3. 하나 이상의 메서드를 슬라이더와 연결

사용자 상호작용에 반응하기
사용자가 슬라이더의 값을 변경하면 슬라이더에 연결된 메서드가 호출되어 원하는 작업이 실행
기본적으로는 사용자가 슬라이더의 Thumb를 이동시키면 연속적으로 이벤트를 호출하지만, isContinous 프로퍼티값을 false로 설정하면 슬라이더의 Thumb에서 손을 떼는 동시에 이벤트를 호출

슬라이더와 메서드 연결하는 방법

  • addTarget(_:action:for:) 메서드 사용
  • 인터페이스 빌더에서 연결 (@IBAction)

슬라이더와 연결하는 메서드 형식

슬라이더의 값을 변경했을 때 필요한 정보에 따라 아래 세 가지 중 한 가지를 선택하여 사용

func doSomething()
func doSomething(sender: UISlider)
func doSomething(sender: UISlider, forEvent event: UIEvent)

슬라이더 주요 프로퍼티

슬라이더의 프로퍼티 값을 설정하는 방식에는 프로그래밍 방식과, 스토리보드의 인스펙터를 이용한 방법이 있다.

  • var minimumValue: Float, var maximumValue: Float: 슬라이더 양끝단의 값
  • var value: Float: 슬라이더의 현재 값
  • var isContinuous: Bool: 슬라이더의 연속적인 값 변화에 따라 이벤트 역시 연속적으로 호출할 것인지의 여부
  • var minimumValueImage: UIImage?, var maximumValueImage: UIImage?: 슬라이더 양끝단의 이미지
  • var thumbTintColor: UIColor?: thumb의 틴트 색상
  • var minimumTrackTintColor: UIColor?, var maximumTrackTintColor: UIColor?: thumb를 기준으로 앞쪽 트랙과 뒤쪽 트랙의 틴트 색상

슬라이더 주요 메서드

//  슬라이더의 현재 값 설정
func setValue(Float, animated: Bool)

//  특정 상태의 minimumTrackImage 반환
func minimumTrackImage(for: UIControlState) -> UIImage?

// 특정 상태의 minimumTrackImage 설정
func setMinimumTrackImage(UIImage?, for: UIControlState)

// 특정 상태의 maximumTrackImage 반환
func maximumTrackImage(for: UIControlState) -> UIImage?

// 특정 상태의 minimumTrackImage 설정
func setMaximumTrackImage(UIImage?, for: UIControlState)

//  특정 상태의 thumbImage 반환
func thumbImage(for: UIControlState) -> UIImage?

//특정 상태의 thumbImage 설정
func setThumbImage(UIImage?, for: UIControlState)

swift 인터페이스 빌더와 객체를 코드와 연결(IBAction)

|

개인공부 후 자료를 남기기 위한 목적임으로 내용 상에 오류가 있을 수 있습니다.


인터페이스 빌더와 객체를 코드와 연결(IBAction)

인터페이스 빌더에서 생성된 객체에서 발생한 액션을 코드와 연결한다. > 사용자 동작에 상호 작용을 할 수 있도록 한다

즉, 실제 앱에서 터치를 통해 일어나는 반응을 확인하는 작업!

컨트롤 이벤트의 종류

컨트롤 이벤트는 UIControl에 Event라는 타입으로 정의되어 있다. 아래는 컨트롤 객체에 발생할 수 있는 이벤트의 종류!

touchDown

컨트롤을 터치했을 때 발생하는 이벤트 > UIControl.Event.touchDown

touchDownRepeat

컨트롤을 연속 터치 할 때 발생하는 이벤트 > UIControl.Event.touchDownRepeat

touchDragInside

컨트롤 범위 내에서 터치한 영역을 드래그 할 때 발생하는 이벤트 > UIControl.Event.touchDragInside

touchDragOutside

터치 영역이 컨트롤의 바깥쪽에서 드래그 할 때 발생하는 이벤트 > UIControl.Event.touchDragOutside

touchDragEnter

터치 영역이 컨트롤의 일정 영역 바깥쪽으로 나갔다가 다시 들어왔을 때 발생하는 이벤트 > UIControl.Event.touchDragEnter

touchDragExit

터치 영역이 컨트롤의 일정 영역 바깥쪽으로 나갔을 때 발생하는 이벤트 > UIControl.Event.touchDragExit

touchUpInside

컨트롤 영역 안쪽에서 터치 후 뗐을때 발생하는 이벤트 > UIControl.Event.touchUpInside

touchUpOutside

컨트롤 영역 안쪽에서 터치 후 컨트롤 밖에서 뗐을때 이벤트 > UIControl.Event.touchUpOutside

touchCancel

터치를 취소하는 이벤트 (touchUp 이벤트가 발생되지 않음) > UIControl.Event.touchCancel

valueChanged

터치를 드래그 및 다른 방법으로 조작하여 값이 변경되었을때 발생하는 이벤트 > UIControl.Event.valueChanged

primaryActionTriggered

버튼이 눌릴때 발생하는 이벤트 (iOS보다는 tvOS에서 사용) > UIControl.Event.primaryActionTriggered

editingDidBegin

UITextField에서 편집이 시작될 때 호출되는 이벤트 > UIControl.Event.editingDidBegin

editingChanged

UITextField에서 값이 바뀔 때마다 호출되는 이벤트 > UIControl.Event.editingChanged

editingDidEnd

UITextField에서 외부객체와의 상호작용으로 인해 편집이 종료되었을 때 발생하는 이벤트 > UIControl.Event.editingDidEnd

editingDidEndOnExit

UITextField의 편집상태에서 키보드의 return 키를 터치했을 때 발생하는 이벤트 > UIControl.Event.editingDidEndOnExit

allTouchEvents

모든 터치 이벤트 > UIControl.Event.allTouchEvents

allEditingEvents

UITextField에서 편집작업의 이벤트 > UIControl.Event.allEditingEvents

applicationReserved

각각의 애플리케이션에서 프로그래머가 임의로 지정할 수 있는 이벤트 값의 범위 > UIControl.Event.applicationReserved

systemReserved

프레임워크 내에서 사용하는 예약된 이벤트 값의 범위 > UIControl.Event.systemReserved

allEvents

시스템 이벤트를 포함한 모든 이벤트 > UIControl.Event.allEvents

swift 인터페이스 빌더와 객체를 코드와 연결(IBOulet)

|

개인공부 후 자료를 남기기 위한 목적임으로 내용 상에 오류가 있을 수 있습니다.


인터페이스 빌더와 객체를 코드와 연결(IBOulet)

생성된 인터페이스 빌더의 객체를 코드(프로퍼티)와 연결하는 작업을 해보자.

  1. 버튼을 control을 누른상태에서 원하는 곳에 드래그 > 객체 이름 설정
  2. view control을 누른 뒤 드래그

프로퍼티의 이름 변경

[Refactor] > [Rename]

이 방법으로 하지 않으면 자동으로 변경된 이름으로 객체를 연결해주지 않는다.