iPhone - Nhận vị trí của UIView trong toàn bộ UIWindow


206

Vị trí của một UIViewrõ ràng có thể được xác định bởi view.centerhoặc view.framevv nhưng điều này chỉ trả về vị trí của UIViewliên quan đến giám sát ngay lập tức của nó.

Tôi cần xác định vị trí của UIViewtoàn bộ hệ thống phối hợp 320x480. Ví dụ, nếu UIViewđang ở trong một UITableViewCellvị trí của nó trong cửa sổ có thể thay đổi đáng kể bất kể của SuperView.

Bất kỳ ý tưởng nếu và làm thế nào điều này là có thể?

Chúc mừng :)

Câu trả lời:


339

Đó là một điều dễ dàng:

[aView convertPoint:localPosition toView:nil];

... chuyển đổi một điểm trong không gian tọa độ cục bộ thành tọa độ cửa sổ. Bạn có thể sử dụng phương pháp này để tính toán nguồn gốc của chế độ xem trong không gian cửa sổ như thế này:

[aView.superview convertPoint:aView.frame.origin toView:nil];

Chỉnh sửa 2014: Nhìn vào mức độ phổ biến của bình luận của Matt__C, có vẻ hợp lý khi chỉ ra rằng tọa độ ...

  1. không thay đổi khi xoay thiết bị.
  2. luôn có nguồn gốc ở góc trên cùng bên trái của màn hình không được bảo vệ.
  3. tọa độ cửa sổ : Hệ tọa độ ist được xác định bởi giới hạn của cửa sổ. Hệ thống tọa độ của màn hình và thiết bị là khác nhau và không nên trộn lẫn với tọa độ cửa sổ.

tuyệt vời :) Tôi nghĩ nó sẽ đơn giản, nhưng tôi có cảm giác táo sẽ không dễ dàng như vậy ... họ đã làm. cảm ơn
Lior Frenkel

41
Xin lưu ý rằng việc chỉ định số không trong tham số toView cung cấp cho bạn tọa độ thiết bị, đây sẽ không phải là điều bạn muốn nếu bạn không ở hướng dọc. Xem giá trị convertpointtoview-in-cảnh-chế độ-cho-sai-giá trị
Matt__C

2
Phương pháp này tiếp tục trả lại aView.frame.origincho tôi. Tôi phải mất một thời gian để nhận ra giám sát của quan điểm của mình không có giám sát.
Dan Abramov

3
Nếu superView của bạn không có superView thì bạn hoàn toàn không nên nhìn thấy
user4951 19/03/13

17
Thích ứng giải pháp liên kết @Matt__C với trường hợp của bạn, nó sẽ trở thành:[view.superview convertPoint:view.frame.origin toView:[UIApplication sharedApplication].keyWindow.rootViewController.view]
Ghigo

49

Swift 5, Swift 4 :

let globalPoint = aView.superview?.convert(aView.frame.origin, to: nil)

33

Swift 3, có phần mở rộng:

extension UIView{
    var globalPoint :CGPoint? {
        return self.superview?.convert(self.frame.origin, to: nil)
    }

    var globalFrame :CGRect? {
        return self.superview?.convert(self.frame, to: nil)
    }
}

30

Trong Swift:

let globalPoint = aView.superview?.convertPoint(aView.frame.origin, toView: nil)

9

Dưới đây là sự kết hợp giữa câu trả lời của @Mohsenasm và nhận xét từ @Chigo được thông qua cho Swift

extension UIView {
    var globalFrame: CGRect? {
        let rootView = UIApplication.shared.keyWindow?.rootViewController?.view
        return self.superview?.convert(self.frame, to: rootView)
    }
}

đơn giản và tốt đẹp
Nastassia
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.