iOS-Children-Study / Growth-Study

성장로드맵 체크포인트 기반 스터디 레포입니다.
1 stars 0 forks source link

김수연_0425 #7

Open SuyeonKim1702 opened 1 year ago

SuyeonKim1702 commented 1 year ago

UIKit

SuyeonKim1702 commented 1 year ago

UIView

UIControl

이벤트(User Interaction) 처리 방식에서의 차이

let view = UIView() let tapGestureRecognizer = UITapGestureRecognizer.init(target: self, action: #selector(didTapView)) view.addGestureRecognizer(tapGestureRecognizer)

...

@objc func didTapView() { /// do something }


- UIControl 
   - `func addTarget( _ target: Any?, action: Selector, for controlEvents: UIControl)`
   - `func addAction(_ action: UIAction, for controlEvents: UIControl.Event)` (ios 14부터 지원됨) 
   - [참고](https://twitter.com/twannl/status/1291364665763733506?s=20)

let button = UIButton()

button.addTarget(self, action: #selector(didTapButton), for: .touchUpInside)

button.addAction(UIAction { [weak self] in ... }, for: .touchUpInside)

...

@objc func didTapButton() { /// do something }

SuyeonKim1702 commented 1 year ago

커스텀 뷰 만드는 법

class CustomView: UIView {

    override init(frame: CGRect) {
        super.init(frame: frame)
        setup()
    }

    // 생성자를 override하는 경우 자동으로 추가됨 
    required init?(coder: NSCoder) {
        super.init(coder: coder)
        // fatalError("init(coder:) has not been implemented")
    }

    override func awakeFromNib() {
        super.awakeFromNib()
       // set up stuff
    }

    private func setup() {
        // set up stuff
    }
}
SuyeonKim1702 commented 1 year ago
image image image

회전하게 될 경우, frame과 bounds의 size는 달라진다.

참고

스크롤 뷰의 원리 읽어보면 좋을 글

SuyeonKim1702 commented 1 year ago

layoutSubviews

setNeedsLayout

viewWillLayoutSubViews

viewDidLayoutSubViews

자동으로 layoutSubviews가 호출되는 경우

참고

잘 정리된 글

SuyeonKim1702 commented 1 year ago

User Interaction 이벤트 처리

UIResponder Chain을 관리하는 메서드


// responder chain의 다음 responder 객체를 리턴, 없을 경우 nil 리턴
var next: UIResponder?

// firstResponder 객체 리턴 
var isFirstResponder: Bool 

// 객체가 firstResponder가 될 수 있는지 여부 리턴 
func canBecomeFirstResponder: Bool 

// 객체가 firstResponder 상태를 포기할 수 있는지 여부 리턴 
var canResignFirstResponder: Bool

// 객체를 Window의 firstResponder로 만들도록 UIKit에 요청
// 내부에서 canBecomeFirstResponder 값 참조함. 
func becomeFirstResponder() -> Bool

// 객체가 Window의 firstResponder 상태를 포기하도록 UIKit에 요청
func resignFirstResponder() -> Bool

HitTest

func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
    // 이벤트가 발생한 지점을 포함한 뷰가 아니라면 nil 리턴
    if !point(inside: point, with: event) {
        return nil
    }

    // 투명도, user interaction 여부, hidden 여부 확인 -> alpha == 0 or hidden or userInteraction == false일 때에 제스처 처리가 불가능한 이유
    if alpha < 0.01 || !isUserInteractionEnabled || isHidden {
        return nil
    }

    // 가장 하위의 서브뷰를 찾는 과정
    for subview in subviews.reverse() {
         if let hitView = subview.hitTest(point, with: event) {
            return hitView
        }
    }
    return nil
}

image

기타 이슈

SuyeonKim1702 commented 1 year ago
class MyViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        if self.traitCollection.userInterfaceStyle == .dark {
            // User Interface is Dark
        } else {
            // User Interface is Light
        }

    }

    override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
        // Trait collection has already changed
    }

    override func willTransition(to newCollection: UITraitCollection, with coordinator: UIViewControllerTransitionCoordinator) {
        // Trait collection will change. Use this one so you know what the state is changing to.
    }
}
JooYoung1121 commented 1 year ago

HItTest사용법 공유