부모 뷰가 존재하고 자식 뷰에 버튼이 있는 경우, 버튼이 터치 이벤트를 수신하지 않는 원인은 여러 가지가 있습니다. 그런 경우, 다음 항목들을 순서대로 점검해봐야 합니다.
button.isEnabled = true
bringSubviewToFront
또는 layer.zPosition
으로 버튼의 위치를 조정합니다.// 버튼을 최상단으로 올리기
view.bringSubviewToFront(button)
// 버튼의 zIndex를 올리기
button.layer.zPosition = 10
point
는 뷰의 좌표계로 전달되며, 포함된 가장 앞단(최하위 뷰)를 반환합니다.hitTest
가 잘못 동작하고 있는지 확인합니다.override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
let view = super.hitTest(point, with: event)
print(view ?? "nil")
return view
}
isUserInteractionEnabled = false
이면 터치 이벤트가 전달되지 않습니다.button.isUserInteractionEnabled = true
superview.isUserInteractionEnabled = true
// alpha 값이 0.01보다 작으면 터치 이벤트 전달 안 됨
button.alpha = 1.0
// 부모 뷰의 clipsToBounds = true 인 경우 터치가 잘릴 수 있음
superview.clipsToBounds = false
// 다른 뷰의 제스처가 터치를 가로채는 경우
let gesture = UITapGestureRecognizer(target: self, action: #selector(handleTap))
gesture.cancelsTouchesInView = false
view.addGestureRecognizer(gesture)
button.isExclusiveTouch = true
가변 폰트는 Adobe, Apple, Google, Microsoft 가 협력하여 폰트의 너비, 두께, 스타일마다 별도의 다른 파일을 사용하는 기존 폰트 대신 다양한 유형의 폰트를 단일 파일에 통합할 수 있는 OpenType 폰트 사양을 발전시킨 것입니다.
가변 폰트는 width(너비), weight(두께), slant(기울기) 등 폰트 별로 다양한 축을 가지고 있으며 이 축을 수치로 조정하여 원하는 스타일을 지정하고 조합할 수 있습니다.
기존 Static Font에 비해 수치로 조정하기 때문에 단일 파일만 존재해도 스타일 지정이 더 다양합니다.
폰트 확장자 .otf, .ttf
간단히 .ttf는 2차원 베지어 방식으로 곡선을 그리고 .otf는 3차원 베지어 방식으로 곡선을 그리기 때문에 .otf가 좀 더 곡선이 부드럽지만 해상도가 낮은 모니터나 일부 프로그램에서 폰트가 깨져보일 수 있습니다.
안드로이드에서는 기기 위치를 자유자재로 변경하기위해 플레이스토어에 다양한 FakeGPS앱이 존재합니다. 반면 iOS에서는 기기 위치를 시뮬레이터의 설정외에 실기기에서 변경할 수 있는 앱이 존재하지 않습니다.
하지만, 오픈소스로 제공되는 LocationSimulator라는 macOS 앱을 사용하면 iOS 17 이전 버전 기기에서 위치를 변경할 수 있습니다. 일단, iOS 17 이전 버전 기기가 존재하지 않아 시뮬레이터로 테스트한 결과 시뮬레이터보다 조금 더 위치 변경이 편리했습니다.
iOS 버전 다운그레이드
IPSW에서 Signed 인증된 iOS 버전은 다운그레이드가 굉장히 간단하지만 다른 방법은 복잡하고 기기가 먹통될 위험이 있습니다.