Подтвердить что ты не робот

Использование 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. Правильно?

4b9b3361

Ответ 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)
}