2013-04-08 3 views
39

Я рассмотрел дюжину вопросов SO по этой теме, и ни один из ответов не работал для меня. Возможно, это поможет вернуть меня на правильный путь.Использование convertPoint для получения относительной позиции внутри родительского UIView

Представьте себе такую ​​установку:

enter image description here

Я хочу, чтобы получить center координаты UIButton относительно UIView.

Другими словами, центр UIButton может быть 215, 80 в UITableViewCell, но относительно UIView они должны быть больше похожими на 260, 165. Как мне преобразовать между этими двумя?

Вот что я пробовал:

[[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 

я мог сделать это трудный путь, обернув через все superviews от кнопки и сложения х и у координат, но я подозреваю, что это слишком много. Мне просто нужно найти правильную комбинацию настроек covertPoint. Правильно?

+0

Это поможет, если добавить следующее к вашему вопросу: Кадры всех 4-х видов в изображении, выходе вы получаете от методов, которые вы пробовали, и значение, которое вы действительно хочет. – rmaddy

ответ

86

button.center является центром задается в системе координат ее надтаблицы, поэтому я предположить, что следующие работы:

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

Или вы вычисляете центр баттона в свою собственную систему координат и использовать это:

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]; 

Свифта 3

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

Бинго! Ваша первая попытка - это то, что я искал. Центр, привязанный к системе координат надзора, - это то, что мне не хватало. Спасибо! – Axeva

+0

Спасибо @Martin R. Это было полезно –

+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 = кнопка.convertPoint (buttonCenter, to: self.view) ' –

10

Ответ Martin правильный. Для разработчиков, использующих Swift, вы можете получить позицию объекта (кнопка, вид, ...) по отношению к экрану с помощью:

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 есть также' convertRect' для более точного вычисления [здесь] (http://stackoverflow.com/a/33879565/1634890) –

1

в быстрой 2,2 работал для меня:

var OrignTxtNomeCliente:CGPoint! 

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

Вот Swift 3 обновление ответа @ Pablo, которое с курса отлично поработало в моем случае.

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

Swift 4

Вам необходимо позвонить convert от кнопки, а не SuperView. В моем случае мне нужны данные ширины, поэтому я преобразовал границы, а не только центральную точку. Приведенный ниже код работает для меня:

let buttonAbsoluteFrame = button.convert(button.bounds, to: self.view) 
Смежные вопросы