2013-04-08 8 views
39

Sprawdziłem kilkanaście pytań SO na ten temat i żadna z odpowiedzi nie zadziałała. Może to pomoże mi powrócić na właściwą drogę.Używanie convertPoint do uzyskania względnej pozycji wewnątrz rodzica UIView

Wyobraź tej konfiguracji:

enter image description here

chcę uzyskać współrzędne center względnej UIButton do UIView.

Innymi słowy, centrum Uibutton może być 215, 80 w ramach UITableViewCell, ale w stosunku do UIView powinny być bardziej podobne do 260, 165. Jak mogę przekonwertować między tymi dwoma?

Oto co próbowałem:

[[self.view superview] convertPoint:button.center fromView:button]; // fail 
[button convertPoint:button.center toView:self.view]; // fail 
[button convertPoint:button.center toView:nil]; // fail 
[button convertPoint:button.center toView:[[UIApplication sharedApplication] keyWindow]]; // fail 

mógłbym zrobić to w przykry sposób poprzez zapętlenie poprzez wszystkie superviews przycisk i sumowaniu współrzędne x i y, ale podejrzewam, że to przesada. Muszę znaleźć odpowiednią kombinację ustawień covertPoint. Dobrze?

+0

Pomoże to, jeśli dodasz następujące pytanie do pytania: Ramki wszystkich 4 widoków na obrazie, wynik uzyskany z wypróbowanych metod i wartość właściwie chcę. – rmaddy

Odpowiedz

86

button.center jest ośrodkiem określone w układzie współrzędnych jej SuperView, więc zakładam, że następujące utwory:

CGPoint p = [button.superview convertPoint:button.center toView:self.view] 

Albo obliczyć wyśrodkować przycisku w jego własnym układzie współrzędnych i używać:

CGPoint buttonCenter = CGPointMake(button.bounds.origin.x + button.bounds.size.width/2, 
            button.bounds.origin.y + button.bounds.size.height/2); 
CGPoint p = [button convertPoint:buttonCenter toView:self.view]; 

Swift 3

var p = button.convertPoint(button.center, to: self.view) 
+2

Bingo! Twoja pierwsza próba była tym, czego szukałem. Centrum, które jest powiązane z układem współrzędnych superwizji, jest tym, czego mi brakowało. Dziękuję Ci! – Axeva

+0

Dzięki @Martin R. To było pomocne –

+1

** Swift 3: ** 'var buttonCenter = CGPoint (x: button.bounds.origin.x + button.bounds.size.width/2, y: button.bounds.origin.y + button.bounds .size.height/2) var p = button.convertPoint (buttonCenter, to: self.view) ' –

10

Odpowiedź Martin jest prawidłowa. Dla programistów korzystających Swift, można uzyskać położenie obiektu (przycisk, widok, ...) w stosunku do ekranu za pomocą:

var p = obj.convertPoint(obj.center, toView: self.view) 

println(p.x) // this prints the x coordinate of 'obj' relative to the screen 
println(p.y) // this prints the y coordinate of 'obj' relative to the screen 
+0

@Axeva istnieje również' convertRect' dla dokładniejszych obliczeń [tutaj] (http://stackoverflow.com/a/33879565/1634890) –

1

w szybkim 2,2 pracował dla mnie:

var OrignTxtNomeCliente:CGPoint! 

if let orign = TXT_NomeCliente.superview, let win = UIApplication.sharedApplication().keyWindow { 
     OrignTxtNomeCliente = orign.convertPoint(TXT_NomeCliente.frame.origin, toView: win) 
    } 
2

Oto Swift 3 aktualizację odpowiedzi @ Pablo, która przydała się doskonale w moim przypadku.

if let window = UIApplication.shared.keyWindow { 
    parent.convert(child.frame.origin, to: window) 
} 
0

Swift 4

Trzeba zadzwonić convert z przycisku, a nie Superview. W moim przypadku potrzebowałem danych o szerokości, więc przekonwertowałem granice zamiast tylko punktu środkowego. Poniższy kod działa dla mnie:

let buttonAbsoluteFrame = button.convert(button.bounds, to: self.view) 
Powiązane problemy