UIStackView Setting
let stackView = UIStackView()
stackView.axis = .horizontal
stackView.alignment = .trailing
stackView.distribution = .fillEqually
stackView.spacing = 15
stackView.heightAnchor.constraint(equalToConstant: 65).isActive = true
axis
스택뷰의 정렬 방향을 결정한다
- horizontal (수평)
- vertical (수직)
alignment
스택뷰 내부 서브뷰를 어떻게 정렬할 지 결정한다
- leading (스택뷰의 시작 부분)
- top (스택뷰의 상단)
- center (스택뷰의 가운데)
- trailing (스택뷰의 끝 부분)
- bottom (스택뷰의 하단)
- firstbaseline (첫번째 서브뷰의 기준선에 따라 정렬)
- lastbaseline (마지막 서브뷰의 기준선에 따라 정렬)
distribution
스택뷰 내부 서브뷰를 어떻게 분배할 지 결정한다
- fill (균등)
- fillEqually (동일 크기 균등)
- fillproportionally (비율 균등)
- EquealSpacing (동일 간격 균등)
- EquealCentering (중앙 정렬 균등)
Stack View 서브뷰 추가하기
addArrangedSubview
https://developer.apple.com/documentation/uikit/uistackview/1616227-addarrangedsubview
일반적으로는 addSubview를 사용하긴 하지만, StackView의 경우에는 addArrangedSubview를 써주어야 한다
addArrangedSubview를 사용하면
- UIStackView가 자동으로 서브뷰를 업데이트 및 관리
- 서브뷰 추가가 간단하고 명료하게 진행
- UIStackView의 특정 속성을 사용할 수 있음
이런 장점이 있다.
스택뷰가 아니라면 그냥 addSubview를 사용해도 된다.
UILabel font
priceLabel.font = UIFont.boldSystemFont(ofSize: 16)
priceLabel.font = UIFont.systemFont(ofSize: 20.0)
이렇게 작성하면 상단 코드가 하단 코드에 덮어씌워지기 때문에 안된다.
priceLabel.font = UIFont.boldSystemFont(ofSize: 16).withSize(20.0)
UIFont 의 여러 속성을 사용하려면 체인 형태로 사용할 수 있다.
button addTarget
let cancelBtn: ColorButton = {
let button = ColorButton(title: "취소하기", color: UIColor.systemGray4)
button.setTitleColor(.black, for: .normal)
button.addTarget(self, action: #selector(cancelButtonTapped), for: .touchUpInside)
return button
}()
private func cancelButtonTapped() {
print("취소 버튼이 클릭되었습니다.")
}
#selector 부분에서 하단 에러가 발생했다.
Argument of '#selector' refers to instance method 'cancelButtonTapped()' that is not exposed to Objective-C
Swift 코드에서 #selector를 사용할 때 @objc가 없는 메서드를 참조하고 있어서 발생한다.
@objc
@objc 어노테이션은 Swift에서 작성된 메서드를 Objective-C 코드에서 호출할 수 있도록 만들어주는 역할이다.
Swift로 작성된 코드가. Objective-C 코드에서 사용될 수 있게 해야하기 때문에 어노테이션을 붙여서 Objective-C가 사용할 수 있게 해준다.
이것을 Objective-C 와 상호 운용성을 가진다고 말한다.
Objective-C 는 selector를 통해 메서드를 호출하는 특징을 가지고 있다.
@objc private func cancelButtonTapped() {
print("취소 버튼이 클릭되었습니다.")
}
어노테이션을 붙여주면 정상적으로 사용 가능하다.
'iOS > Swift' 카테고리의 다른 글
[Swift] 네트워크 통신(1) - URL과 REST API (1) | 2024.01.04 |
---|---|
[Swift] Delegate Pattern에서 AnyObject를 사용하는 이유는? (0) | 2024.01.02 |
[Swift] tableview가 변경되었을 때 처리하는 방법, beginUpdates() endUpdates() (1) | 2023.12.19 |
[Swift] TableViewCell 내부 UIButton Action 처리하기 (tag) (0) | 2023.12.15 |
[Swift] UITableView, reloadData(), deleteData() / Swipe Delete (0) | 2023.12.14 |