Closed joho2022 closed 6 months ago
하위 클래스를 통해 여러 제스처를 인식할 수 있다.
override func viewDidLoad() { super.viewDidLoad() let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(viewTapped(_:))) view.addGestureRecognizer(tapGestureRecognizer) setupView() } @objc func viewTapped(_ sender: UITapGestureRecognizer) { let location = sender.location(in: view) let selectedPoint = Point(x: location.x, y: location.y) }
func contains(_ point: Point) -> Bool { let horizontalRange = point.x..<(point.x + size.width) let verticalRange = point.y..<(point.y + size.height) return horizontalRange.contains(point.x) && verticalRange.contains(point.y) }
사각형의 point가 포함되어 있는지를 판단하는 것인데, 계속 true값만 반환함
→ 매개변수의 point로 비교했음, self를 붙여서 해결한다.
[ 회색배경은 버그를 잘 나타내기 위해 임의로 설정함 ]분명 사각형이 생성되는데 색이 보이질 않음
→ rgb값을 255로 나눠주지 않아서 발생한 버그
→ iOS에서 UIColor를 사용하여 색상을 지정할 때, 색상의 각 RGB 컴포넌트는 0.0에서 1.0 사이의 값을 사용한다.
UIColor
DrawingViewController에서 구현할려고 하였으나, main뷰컨트롤러에서 Setting뷰컨트롤러 너비를 뺀 너비안에서 생성하는 것이 더 적합하다고 판단하였다. DrawingViewController 삭제함.
메인뷰컨트롤러에서 클로저를 통해 사각형 배경색과 투명도를 변경하는 이벤트를 전달한다
세팅뷰컨트롤러의 인스턴스에 접근하여 클로저를 설정하면 된다.
private func setupOpacityAction() { settingsPanelViewController.onOpacityChangeRequested = { [weak self] newOpacity in guard let self = self, let selectedRectangleView = self.selectedRectangleView else { self?.logger.error("선택된 사각형이 없습니다.") return } let rectangleModel = plane.rectangles.first { $0.uniqueID.hashValue == selectedRectangleView.tag } rectangleModel?.setOpacity(newOpacity) selectedRectangleView.alpha = CGFloat(newOpacity.rawValue) / 10.0 logger.info("변경된 투명도는 \(Double(newOpacity.rawValue) / 10.0)") } }
클로저는 자신이 캡처(capture)한 모든 것에 대한 강한(strong) 참조를 기본으로 가진다. 그래서 [weak self] 구문을 사용하여 클로저가 self를 약하게 참조한다.
[weak self]
이로써, MainViewController와 SettingsPanelViewController 사이에 순환 참조가 발생하는 것을 방지한다.
MainViewController
SettingsPanelViewController
Plane은 struct가 적당하였는가?
사각형을 관리하는 역할이기 때문에 클래스에 비해 변경하는 행위로부터 사각형 데이터를 보호하는 측면에서 더 적합하다고 생각한다.
내가 생각하는 클래스는 접근과 수정이 많이 요구될 때 사용하는 것이기 때문이다.
뷰 요소를 let으로 변수 선언부에 선언하는 것과 init에서 생성하는 것과 어떤 차이가 있을까?
let으로 변수 선언부에 선언하면 접근성과 재사용이 쉽고, 가독성이 좋다고 생각하고,
init으로 생성하면 인스턴스를 생성하는 순간 구성요소가 설정된 상태로 만들어지기 때문에 개발하는 사람은 추가적인 설정없이 바로 사용할 수 있는 장점이 있다고 생각한다.
🎯주요 작업
📚학습 키워드
탭 제스처 인식기
UIGestureRecognizer 하위클래스
하위 클래스를 통해 여러 제스처를 인식할 수 있다.
예시 코드
iOS의 표준 제스처
💻고민과 해결
사각형의 point가 포함되어 있는지를 판단하는 것인데, 계속 true값만 반환함
→ 매개변수의 point로 비교했음, self를 붙여서 해결한다.
[ 회색배경은 버그를 잘 나타내기 위해 임의로 설정함 ]분명 사각형이 생성되는데 색이 보이질 않음
→ rgb값을 255로 나눠주지 않아서 발생한 버그
→ iOS에서
UIColor
를 사용하여 색상을 지정할 때, 색상의 각 RGB 컴포넌트는 0.0에서 1.0 사이의 값을 사용한다.탭제스처로 location으로 좌표를 반환하여 Plane과 비교하는 고민
DrawingViewController에서 구현할려고 하였으나, main뷰컨트롤러에서 Setting뷰컨트롤러 너비를 뺀 너비안에서 생성하는 것이 더 적합하다고 판단하였다. DrawingViewController 삭제함.
터치가 될 때 사각형 테두리에 선을 표시해서 인지하도록 구현하기
버튼은 세팅뷰컨트롤러에 있고, 사각형 정보는 메인뷰컨트롤러에 있는데 뷰 컨트롤러간에 정보를 공유하는 방법
메인뷰컨트롤러에서 클로저를 통해 사각형 배경색과 투명도를 변경하는 이벤트를 전달한다
세팅뷰컨트롤러의 인스턴스에 접근하여 클로저를 설정하면 된다.
클로저는 자신이 캡처(capture)한 모든 것에 대한 강한(strong) 참조를 기본으로 가진다. 그래서
[weak self]
구문을 사용하여 클로저가 self를 약하게 참조한다.이로써,
MainViewController
와SettingsPanelViewController
사이에 순환 참조가 발생하는 것을 방지한다.🤔결과
📚추가학습
Plane은 struct가 적당하였는가?
사각형을 관리하는 역할이기 때문에 클래스에 비해 변경하는 행위로부터 사각형 데이터를 보호하는 측면에서 더 적합하다고 생각한다.
내가 생각하는 클래스는 접근과 수정이 많이 요구될 때 사용하는 것이기 때문이다.
뷰 요소를 let으로 변수 선언부에 선언하는 것과 init에서 생성하는 것과 어떤 차이가 있을까?
let으로 변수 선언부에 선언하면 접근성과 재사용이 쉽고, 가독성이 좋다고 생각하고,
init으로 생성하면 인스턴스를 생성하는 순간 구성요소가 설정된 상태로 만들어지기 때문에 개발하는 사람은 추가적인 설정없이 바로 사용할 수 있는 장점이 있다고 생각한다.