IL_System View 와 Control

Tint Color

시각적으로 현재 활성화되어있는 화면상의 요소를 나타냄. 예를 들어 NavigationBar의 아이템의 Refresh 버튼이나 Back 버튼을 누르면 단순히 눌리기만 하는 것이 아니라 눌렀을 때 흰색으로 변했다가 손가락을 떼면 원래의 색으로 돌아오는데 이런 효과를 가능케 하는 것이 TintColor

이미지가 레이블 위에 있는 "버튼" 만들기


이렇게 이미지, 레이블 구성하고 스택뷰로 묶기


뷰로 임베드하기


스택뷰가 뷰영역 전체를 채우도록 제약 추가


버튼을 스택뷰와 동일한 계층에 추가 후 버튼 타이틀 삭제


버튼 역시 뷰영역 전체를 채우도록 제약 추가


뷰의 제약 추가


완성

버튼의 이미지

버튼은 버튼의 이미지와 백그라운드 이미지를 둘다 제공


버튼에서 설정하는 content mode는 버튼 자체의 것이므로 종횡비가 맞지 않는다고 해서 모드를 aspect fit 등으로 변경해도 종횡비가 맞지 않음. 이미지의 컨텐트 모드를 설정하려면 버튼에 포함되어있는 이미지뷰에 접근한 후 이미지뷰의 컨텐트 모드를 설정해야 함.

IndexPath

IndexPath의 인스턴스는 행렬의 형태이며 테이블 뷰에서는 section과 row를, 컬렉션 뷰에서는 section과 item 을 전달한다. 이유는 모르겠지만 이니셜라이저의 파라미터 순서와 행렬의 순서는 반대인 듯 하다.

Intrinsic Content Size

컨텐츠가 가지고 있는 고유의 크기

Intrinsic Content Size를 가지는 것들

Intrinsic Content Size WidthIntrinsic Content Size Height
UIviewXX
UISliderOX
UILabel, UIButton, UISwitch, UITextFieldOO
TextView, ImageViewContent에 따라 변함Content에 따라 변함

Content Hugging & Compression Resistance

Content Hugging: 주어진 크기보다 작아질 수 있다 (= 최대크기 제한)
Compression Resistance: 주어진 크기보다 작아질 수 없다 (최소 크기 제한)

layoutIfNeeded()

https://baked-corn.tistory.com/105

Stack View

스택뷰는 두개의 배열 프로퍼티를 가짐 (arrangedSubviews, subviews)

arrangedSubviews로 스택뷰를 관리함. 따라서 여기에 추가되는 뷰는 스택뷰가 직접 프레임을 관리하지만 subviews에 추가되는 뷰는 스택뷰가 관리하지 않음. 따라서 subviews에 추가되는 뷰는 적절한 프레임을 추가해주어야함.

var subviews: [UIView] {get} //UIView에서 상속한 프로퍼티
var arrangedSubviews: [UIView} {get} //이건 subviews의 하위집합. 따라서 이 배열에 포함되어 있는 뷰는 반드시 subviews 에도 포함됨. 마찬가지로 이 배열에 뷰를 추가하면 subviews에도 자동으로 추가됨. 반대로 subviews에 뷰를 추가하는 경우, arrangedSubviews에는 추가되지 않음. 

루트뷰(UIView의 인스턴스)에 view를 추가하면 subviews에 저장되고 스택뷰에 view를 끌어다 놓으면 subviews가 아니라 arrangedSubviews에 추가됨. 따라서 스택뷰가 가진 subviews에 뷰를 추가하고 싶다면 코드로 추가해야함.

arrangedSubviews에 추가되는 뷰는 스택뷰가 직접 프레임을 관리하지만 서브뷰에 추가되는 뷰는 관리하지 않는다. 따라서 적절한 프레임을 설정해줘야 정상적으로 표시됨.

stackview에 포함된 뷰를 삭제할 때는 removeArrangedSubview(_ view:UIView) 메서드를 사용하면 된다. 만약 잠깐 숨겼다가 다시 보여주려고 한다면 서브뷰의 isHidden 속성을 토글해주기만 해도 된다. 왜냐햐면 삭제했다가 뷰를 다시 생성하는 것은 상대적으로 무거운 작업이기 때문이다.

의문점

arrangedSubviews에 뷰를 추가했다가(addArrangedSubviews 메서드) 지울 때 (removeArrangedSubviews 메서드) 마지막 뷰를 array에서 지워도 화면에서는 지워지지 않는 것 처럼 나온다. 그 후 다시 뷰를 추가하면 뷰가 두개가 되며 추가되는 것이 아니라 해당 뷰가 대체된다. 왜그러지?

Multi Trailing Closure

UIView.animate(withDuration: 0.3) {
            view.isHidden = true
        } completion: { _ in
            self.stackView.removeArrangedSubview(view)
        }

이런식으로 여러개의 클로저 아규먼트를 쓸 수 있음.

Alert Controller

AlertController 인스턴스의 preferredAction메서드

블루투스 키보드 등에서 리턴키를 누르면 선택 없이 자동으로 눌리는 버튼 만들기. 이거 설정안해주면 캔슬 버튼이 글자가 굵은데 이거 해주면 이게 굵음. 버튼의 우선순위도 높아짐. 그런데 이 작업은 순서가 중요함. 15줄 정도 위에 preferredaction 쓴거 보면 저렇게 쓰면 크래시남. preferredaction은 actions 배열에 추가되어 있어야 하는데 그보다 위에 있기 때문에 추가 되어 있지 않기 때문. 그래서 보통 마지막에 present 호출 전에 지정함.

actionsheet는 아이패드에서 팝오버형태로 표시되기 때문에 기준이 되는 프레이나 뷰를 설정해야 함.

좋은 웹페이지 즐겨찾기