iPhone - รับตำแหน่ง UIView ภายใน UIWindow ทั้งหมด


206

UIViewเห็นได้ชัดว่าตำแหน่งของ a สามารถถูกกำหนดได้โดยview.centerหรือview.frameอื่น ๆ แต่สิ่งนี้จะคืนค่าตำแหน่งของตำแหน่งที่UIViewสัมพันธ์กับมันเท่านั้น

ฉันจำเป็นต้องกำหนดตำแหน่งของUIViewในระบบพิกัด 320x480 ทั้งหมด ตัวอย่างเช่นถ้าUIViewอยู่ในUITableViewCellตำแหน่งของมันภายในหน้าต่างอาจไม่คำนึงถึงการเปลี่ยนแปลงอย่างรวดเร็วของ SuperView

ความคิดใด ๆ ถ้าและวิธีนี้เป็นไปได้?

ไชโย :)

คำตอบ:


340

นั่นเป็นเรื่องง่าย:

[aView convertPoint:localPosition toView:nil];

... แปลงจุดในพื้นที่ประสานงานท้องถิ่นเป็นพิกัดหน้าต่าง คุณสามารถใช้วิธีนี้เพื่อคำนวณต้นกำเนิดของมุมมองในพื้นที่หน้าต่างดังนี้:

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

2014 แก้ไข:ดูที่ความนิยมของความคิดเห็นของ Matt__C ดูเหมือนว่าสมเหตุสมผลที่จะชี้ให้เห็นว่าพิกัด ...

  1. ไม่เปลี่ยนแปลงเมื่อหมุนอุปกรณ์
  2. มีต้นกำเนิดอยู่ที่มุมซ้ายบนของหน้าจอที่ไม่ได้ทำการหมุนเสมอ
  3. คือพิกัดหน้าต่าง : ระบบพิกัดถูกกำหนดโดยขอบเขตของหน้าต่าง ระบบพิกัดหน้าจอและอุปกรณ์แตกต่างกันและไม่ควรนำมาปะปนกับพิกัดหน้าต่าง

ยอดเยี่ยม :) ฉันคิดว่ามันควรจะง่าย แต่ฉันมีความรู้สึกว่าแอปเปิ้ลจะไม่ให้มันง่ายมาก ... พวกเขาทำได้ดี ขอบคุณ
Lior Frenkel

41
โปรดทราบว่าการระบุศูนย์ในพารามิเตอร์ toView จะช่วยให้อุปกรณ์ของคุณทำงานร่วมกันซึ่งจะไม่เป็นสิ่งที่คุณต้องการหากคุณไม่ได้อยู่ในแนวตั้ง ดูตัวแปลงค่ามุมมองในแนวนอนให้ค่าผิด
Matt__C

2
วิธีนี้ยังคงกลับมาaView.frame.originสำหรับฉัน ฉันรู้สึกว่าการรับรู้มุมมองของฉันไม่มีผู้กำกับเอง
Dan Abramov

3
หาก superView ของคุณไม่มี superView มุมมองของคุณไม่ควรมองเห็นเลย
user4951

17
การปรับ @Matt__C เชื่อมโยงโซลูชันกับกรณีของคุณมันจะกลายเป็น:[view.superview convertPoint:view.frame.origin toView:[UIApplication sharedApplication].keyWindow.rootViewController.view]
Ghigo


33

Swift 3 พร้อมส่วนขยาย:

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)
    }
}


9

นี่คือการรวมกันของคำตอบโดย @Mohsenasm และความคิดเห็นจาก @Chigo ที่นำมาใช้กับ Swift

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

ง่ายและดี!
nastassia
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.