관리 메뉴

김종권의 iOS 앱 개발 알아가기

[iOS - swift] 특정 CGRect 포함, 특정 뷰 포함 확인 방법, 화면에 특정 뷰가 보이는지 확인 방법, intersects(_:), contains(_:) 본문

iOS 응용 (swift)

[iOS - swift] 특정 CGRect 포함, 특정 뷰 포함 확인 방법, 화면에 특정 뷰가 보이는지 확인 방법, intersects(_:), contains(_:)

jake-kim 2023. 10. 18. 01:27

특정 rect 영역이 포함되는지 확인 방법

  • 진한 회색뷰이 얕은 회색뷰에 완전히 포함되는지 확인하는 방법?
  • 오렌지색 뷰가 회색뷰에 걸쳐있는지 확인하는 방법?

  • contains(_:) 완전히 포함되었는지 확인이 가능
extension CGRect {
    public func contains(_ rect2: CGRect) -> Bool
}

https://developer.apple.com/documentation/coregraphics/1454186-cgrectcontainsrect

  • 두 개가 걸쳐져 있는지 확인 가능
extension CGRect {
    public func intersects(_ rect2: CGRect) -> Bool
}

https://developer.apple.com/documentation/coregraphics/1454747-cgrectintersectsrect

  • 아래처럼 사용
containerView.frame.intersects(orangeView.frame) // true
containerView.frame.contains(orangeView.frame) // false
containerView.frame.contains(contentView.frame) // true

응용) 화면에 특정 뷰가 보이는지 확인 방법

  • intersects를 활용하면 화면에 특정 뷰가 조금이라도 보이는지 확인이 가능
  • contains를 활용하면 화면에 특정 뷰가 모두 보이는지 확인이 가능
  • *convert(_:to:) 함수를 이용하여 특정 뷰를 window기준으로 잡은 rect값을 intersects나 contains 함수를 사용하여 비교가 가능
  • 아래처럼 extension으로 사용이 가능
extension UIView {
    var visible: Bool {
        guard window != nil else { return false }
        let viewFrame = convert(bounds, to: nil)
        let screenBounds = UIScreen.main.bounds
        return viewFrame.intersects(screenBounds)
    }
    
    var fullyVisible: Bool {
        guard window != nil else { return false }
        let viewFrame = convert(bounds, to: nil)
        let screenBounds = UIScreen.main.bounds
        return screenBounds.contains(viewFrame)
    }
}

* 전체 코드: https://github.com/JK0369/ExVisible

* 참고

- https://developer.apple.com/documentation/coregraphics/1454747-cgrectintersectsrect

- https://developer.apple.com/documentation/coregraphics/1454186-cgrectcontainsrect

Comments