Я хочу получить начало scrollView в системе координат окна. Например, в настоящее время начало scollView (0,51). Но в системе координат окна она должна быть 51 + 44 (высота навигационной панели) +20 (высота строки состояния) = 115. В системе координат окна scrollView.frame.origin должен быть (0,115). Я пробовал с convertPoint: методы, но иногда получал (0,51) или (0,0). Пожалуйста, предоставьте это решение. Благодаря
Преобразуйте исходную точку UIView в ее систему координат окна
Ответ 1
Я пробовал с решением TechZen, но безрезультатно. Вместо того, чтобы преобразовывать начало scrollView, я упомянул ссылку на класс apple docs UIWindow и обратил конечный центр клавиатуры к моей системе координат вида, используя этот код [self.view convertPoint:endCentre fromView:[UIApplication sharedApplication].keyWindow]
. Эта часть кода работала и, следовательно, решила мою проблему. Тем не менее, остается вопрос, почему он не дает правильную координату scrollView.origin.So, в основном я получил обходной путь путем преобразования endcenter клавиатуры вместо scrollView.origin. О, и я делал все это, чтобы вычислить мою новую высоту scrollView, когда на экране появляется клавиатура. Итак, если у кого-то есть решение этой проблемы или какое-либо лучшее решение, пожалуйста, сообщите нам всем.
Ответ 2
Похоже, что вы не конвертируете между соответствующими представлениями. Кадр представления устанавливается в координаты его супервизора, а не его собственные внутренние координаты, поэтому, если вы пытаетесь преобразовать начало координат в окно, вам нужно будет использовать супервизор:
[[self superview] convertPoint:self.frame.origin toView:theWindow];
Тем не менее, еще проще преобразовать нулевую точку из самого представления в окно. Две части кода эквивалентны, поэтому нет необходимости использовать начало координат.
[self convertPoint:CGPointZero toView:theWindow];
Ответ 3
Обратите внимание, что эти функции будут работать только после того, как контроллер представления закончит укладку подпунктов. Поэтому, если вы хотите, чтобы при просмотре нагрузки вы могли использовать viewDidLayoutSubviews/viewDidAppear, но не в viewDidLoad/viewWillAppear и т.д....
Этот код работал у меня:
- (void)viewDidLayoutSubviews
{
[super viewDidLayoutSubviews];
CGPoint originInSuperview = [self.view.superview convertPoint:CGPointZero fromView:self.scrollView];
}
Ответ 4
Swift:
В 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)")