Я хочу получить начало scrollView в системе координат окна. Например, в настоящее время происхождение scollView равно (0,51). Но в системе координат окна это должно быть 51 + 44 (высота панели навигации) + 20 (высота строки состояния) = 115. Значит, в системе координат окна scrollView.frame.origin должно быть (0,115). Я пытался использовать convertPoint: методы, но иногда получал (0,51) или (0,0). Пожалуйста, предоставьте решение этой проблемы. Спасибо
Преобразование исходной точки UIView в систему координат окна.
Ответы (4)
Похоже, вы не конвертируете между правильными представлениями. Кадр представления устанавливается в координаты его супервизора, а не его собственные внутренние координаты, поэтому, если вы пытаетесь преобразовать источник представления в координаты окна, вам нужно будет использовать супервизор:
[[self superview] convertPoint:self.frame.origin toView:theWindow];
Однако еще проще преобразовать нулевую точку из самого вида в окно. Два фрагмента кода эквивалентны, поэтому вообще нет необходимости использовать источник.
[self convertPoint:CGPointZero toView:theWindow];
Я пробовал использовать решение TechZen, но безрезультатно. Вместо преобразования источника scrollView я сослался на справочник класса UIWindow в документах Apple и преобразовал endCenter клавиатуры в систему координат моего представления, используя этот код [self.view convertPoint:endCentre fromView:[UIApplication sharedApplication].keyWindow]
. Этот фрагмент кода работал и, следовательно, решил мою проблему. Однако все еще остается вопрос, почему он не дает правильную координату scrollView.origin. Итак, в основном я нашел обходной путь, преобразовав endcenter клавиатуры вместо scrollView.origin. О, и я делал все это, чтобы вычислить новую высоту моего scrollView, когда клавиатура появляется на экране. Итак, если у кого-то есть решение этой проблемы или любое лучшее решение, пожалуйста, сообщите нам всем.
Обратите внимание, что эти функции будут работать только после того, как контроллер представления завершит размещение подвидов. Поэтому, если вы хотите, чтобы при загрузке просмотра вы могли использовать viewDidLayoutSubviews/viewDidAppear, но не в viewDidLoad/viewWillAppear и т. д.
Этот код работал для меня:
- (void)viewDidLayoutSubviews
{
[super viewDidLayoutSubviews];
CGPoint originInSuperview = [self.view.superview convertPoint:CGPointZero fromView:self.scrollView];
}
Свифт:
В viewDidAppear (иначе элементы еще не разделены) вашего ViewController:
var yourFrame = yourScrollView.convertRect(yourScrollView.frame, to: self.view)
//PRINT THE WHOLE RECT
print(yourFrame)
//PRINT A DETAILED VERSION OF THE FRAME, ALSO CAN PERFORM CALCULATION BETWEEN THE RECT PARAMETERS TO GET , FOR EXAMPLE, WIDTH POINT IN THE SUPERVIEW:
print("X: \(yourFrame.origin.x) Y: \(yourFrame.origin.y) WIDTH: \(yourFrame.width) HEIGHT: \(yourFrame.height)")