Использование convertPoint для получения относительной позиции внутри родительского UIView
Я рассмотрел дюжину вопросов SO по этой теме, и ни один из ответов не сработал у меня. Возможно, это поможет мне вернуться на правильный путь.
Представьте себе эту настройку:
![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
Я мог бы сделать это сложным путем, перейдя через все надстройки кнопок и скомпонуя координаты x и y, но я подозреваю, что это перебор. Мне просто нужно найти правильную комбинацию настроек covertPoint. Правильно?
Ответы
Ответ 1
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];
Swift 3
var p = button.convertPoint(button.center, to: self.view)
Ответ 2
Ответ Мартина правильный. Для разработчиков, использующих 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
Ответ 3
в swift 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)
}
Ответ 4
Ниже приведено Swift 3 обновление ответа @Pablo, которое, конечно же, отлично работало в моем случае.
if let window = UIApplication.shared.keyWindow {
parent.convert(child.frame.origin, to: window)
}