번호 : 009, 작성일자: 2025-03-10

2025.03.03 ~ 2025.03.09

👉 UIButton의 터치이벤트 수신이 안 되는 경우 고려해야할 사항


부모 뷰가 존재하고 자식 뷰에 버튼이 있는 경우, 버튼이 터치 이벤트를 수신하지 않는 원인은 여러 가지가 있습니다. 그런 경우, 다음 항목들을 순서대로 점검해봐야 합니다.

  1. 버튼 비활성화 여부 확인
    • 버튼이 비활성화된 경우 터치 이벤트가 전달되지 않습니다.
    button.isEnabled = true
    
  2. 버튼의 뷰 zIndex 확인
    • 버튼이 다른 뷰 뒤에 숨어있으면 터치가 전달되지 않을 수 있습니다.
    • bringSubviewToFront 또는 layer.zPosition으로 버튼의 위치를 조정합니다.
    // 버튼을 최상단으로 올리기
    view.bringSubviewToFront(button)
    
    // 버튼의 zIndex를 올리기
    button.layer.zPosition = 10
    
  3. hitTest(_:with:) 메서드 확인
    • 파라미터로 제공되는 point는 뷰의 좌표계로 전달되며, 포함된 가장 앞단(최하위 뷰)를 반환합니다.
    • 오버라이드된 hitTest가 잘못 동작하고 있는지 확인합니다.
    override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
        let view = super.hitTest(point, with: event)
        print(view ?? "nil")
        return view
    }
    
  4. 상위뷰들의 Interaction 활성화 확인
    • 상위 뷰나 버튼 자체가 isUserInteractionEnabled = false이면 터치 이벤트가 전달되지 않습니다.
    button.isUserInteractionEnabled = true
    superview.isUserInteractionEnabled = true
    
  5. 터치 영역 확인
    // alpha 값이 0.01보다 작으면 터치 이벤트 전달 안 됨
    button.alpha = 1.0
    
    // 부모 뷰의 clipsToBounds = true 인 경우 터치가 잘릴 수 있음
    superview.clipsToBounds = false
    
  6. 제스처 충돌 확인
    // 다른 뷰의 제스처가 터치를 가로채는 경우
    let gesture = UITapGestureRecognizer(target: self, action: #selector(handleTap))
    gesture.cancelsTouchesInView = false
    view.addGestureRecognizer(gesture)
    
  7. 오토레이아웃 확인
    • 오토레이아웃 문제로 인해 터치 영역이 의도한 위치와 다를 수 있습니다.
  8. 중복 터치 확인 exclusiveTouch 확인
    • 다른 뷰와 터치 충돌이 발생할 수 있습니다.
    button.isExclusiveTouch = true
    

🌈 Variable Font (가변 폰트)


가변 폰트는 Adobe, Apple, Google, Microsoft 가 협력하여 폰트의 너비, 두께, 스타일마다 별도의 다른 파일을 사용하는 기존 폰트 대신 다양한 유형의 폰트를 단일 파일에 통합할 수 있는 OpenType 폰트 사양을 발전시킨 것입니다.

가변 폰트는 width(너비), weight(두께), slant(기울기) 등 폰트 별로 다양한 축을 가지고 있으며 이 축을 수치로 조정하여 원하는 스타일을 지정하고 조합할 수 있습니다.

기존 Static Font에 비해 수치로 조정하기 때문에 단일 파일만 존재해도 스타일 지정이 더 다양합니다.

폰트 확장자 .otf, .ttf

간단히 .ttf는 2차원 베지어 방식으로 곡선을 그리고 .otf는 3차원 베지어 방식으로 곡선을 그리기 때문에 .otf가 좀 더 곡선이 부드럽지만 해상도가 낮은 모니터나 일부 프로그램에서 폰트가 깨져보일 수 있습니다.

🗺️ iOS에서 Fake GPS 사용하기


안드로이드에서는 기기 위치를 자유자재로 변경하기위해 플레이스토어에 다양한 FakeGPS앱이 존재합니다. 반면 iOS에서는 기기 위치를 시뮬레이터의 설정외에 실기기에서 변경할 수 있는 앱이 존재하지 않습니다.

하지만, 오픈소스로 제공되는 LocationSimulator라는 macOS 앱을 사용하면 iOS 17 이전 버전 기기에서 위치를 변경할 수 있습니다. 일단, iOS 17 이전 버전 기기가 존재하지 않아 시뮬레이터로 테스트한 결과 시뮬레이터보다 조금 더 위치 변경이 편리했습니다.

iOS 버전 다운그레이드

IPSW에서 Signed 인증된 iOS 버전은 다운그레이드가 굉장히 간단하지만 다른 방법은 복잡하고 기기가 먹통될 위험이 있습니다.

🙋🏻‍♂️ 기타 사항


  1. 이번 주 개발블로그의 표지사이드프로젝트의 앱 스타일을 간단히 변경해봤습니다.
  2. 네이버지도 SDK를 사용하는 경우 로고를 비활성화하면 안됩니다. NMapsMap iOS Docs 문서를 확인해보면 로고 위치를 조정하기 위해 logAlign, logoMargin 속성을 이용하면 되지만 contentInset 속성도 함께 고려해야 합니다.
  3. GA와 관련된 용어를 알아보다 GTM이라고 비개발자도 손쉽게 이벤트를 제공하는 서비스가 있습니다. 웹에서 자주 사용되는 것 같은데 iOS도 제공하는 것 같아서 추후 확인해봐야겠습니다.
  4. iOS 앱에서 HTML의 a태그, 웹뷰 링크이동시 내부 정의된 딥링크 스킴값을 넣어주면 내부에서 원하는 화면으로 전환할 수 있고, 원링크를 넣어주면 앱 외부로 이동하였다가 원하는 화면으로 전환이 가능합니다.
  5. 앱스토어에 피처링이라는 기능을 이용하면 앱을 홍보하는 데 도움이 됩니다.