Я пытаюсь понять функциональность этих методов. Не могли бы вы дать мне простой пример использования, чтобы понять их семантику?
Из документации, например, метод convertPoint: fromView: описывается следующим образом:
Преобразует точку из системы координат данного вида в систему координат приемника.
Что означает система координат ? А как насчет ресивера ?
Например, имеет ли смысл использовать convertPoint: fromView: как показано ниже?
CGPoint p = [view1 convertPoint:view1.center fromView:view1];
Используя утилиту NSLog, я убедился, что значение p совпадает с центром view1.
Заранее спасибо.
РЕДАКТИРОВАТЬ: для тех, кто заинтересован, я создал простой фрагмент кода, чтобы понять эти методы.
UIView* view1 = [[UIView alloc] initWithFrame:CGRectMake(100, 100, 150, 200)];
view1.backgroundColor = [UIColor redColor];
NSLog(@"view1 frame: %@", NSStringFromCGRect(view1.frame));
NSLog(@"view1 center: %@", NSStringFromCGPoint(view1.center));
CGPoint originInWindowCoordinates = [self.window convertPoint:view1.bounds.origin fromView:view1];
NSLog(@"convertPoint:fromView: %@", NSStringFromCGPoint(originInWindowCoordinates));
CGPoint originInView1Coordinates = [self.window convertPoint:view1.frame.origin toView:view1];
NSLog(@"convertPoint:toView: %@", NSStringFromCGPoint(originInView1Coordinates));
В обоих случаях получателем является self.window. Но есть разница. В первом случае параметр convertPoint выражается в координатах view1. Результат следующий:
convertPoint: fromView: {100, 100}
Во втором случае convertPoint выражается в координатах superview (self.window). Результат следующий:
convertPoint: toView: {0, 0}
convertPoint
иconvertRect
различаются типом возвращаемого значения.CGPoint
илиCGRect
. А как насчетfrom
иto
? Есть ли какое-то практическое правило, которое я мог бы использовать? Спасибо.Меня это всегда сбивает с толку, поэтому я создал игровую площадку, где вы можете визуально изучить, что
convert
делает функция. Это сделано в Swift 3 и Xcode 8.1b:Не забудьте показать помощник редактора ( ⎇⌘⏎) для просмотра представлений, он должен выглядеть так:
Не стесняйтесь предлагать больше примеров здесь или в этой сути .
источник
self.view
они избыточны, просты в использовании,view
если ониself
не нужны.self
Вот объяснение на простом английском.
Если вы хотите преобразовать прямоугольник подпредставления (
aView
является подвидом[aView superview]
) в координатное пространство другого представления (self
).источник
Каждое представление в iOS имеет систему координат. Система координат подобна графику, у которого есть ось x (горизонтальная линия) и ось y (вертикальная линия). Точка пересечения линий называется началом координат. Точка обозначается (x, y). Например, (2, 1) означает, что точка находится на 2 пикселя влево и на 1 пиксель вниз.
Вы можете узнать больше о системах координат здесь - http://en.wikipedia.org/wiki/Coordinate_system
Но вам нужно знать, что в iOS каждое представление имеет СОБСТВЕННУЮ систему координат, где левый верхний угол является началом координат. Ось X продолжает увеличиваться вправо, а ось Y продолжает увеличиваться вниз.
Что касается вопроса о конвертации баллов, возьмите этот пример.
Существует представление, называемое V1, которое имеет ширину 100 пикселей и высоту 100 пикселей. Теперь внутри него есть еще одно представление, называемое V2, в (10, 10, 50, 50), что означает, что (10, 10) - это точка в системе координат V1, где должен находиться верхний левый угол V2, и ( 50, 50) - ширина и высота V2. Теперь возьмем точку ВНУТРИ системы координат V2, скажем (20, 20). Итак, что это за точка внутри системы координат V1? Для этого предназначены методы (конечно, вы можете рассчитать сами, но они сэкономят вам дополнительную работу). Для записи точка в V1 будет (30, 30).
Надеюсь это поможет.
источник
Спасибо всем за то, что разместили вопрос и ваши ответы: это помогло мне разобраться.
Мой контроллер просмотра имеет нормальный вид.
Внутри этого представления есть несколько группирующих представлений, которые делают немного больше, чем дают своим дочерним представлениям чистое взаимодействие с ограничениями автоматического макета.
Внутри одного из этих групповых представлений у меня есть кнопка «Добавить», которая представляет собой всплывающий контроллер представления, в который пользователь вводит некоторую информацию.
Во время вращения устройства контроллер представления получает предупреждение через вызов UIPopoverViewControllerDelegate popoverController: willRepositionPopoverToRect: inView:
Существенная часть, которая исходит из объяснения, данного в первых двух ответах выше, заключалась в том, что прямоугольник, из которого мне нужно было преобразовать, был границей кнопки добавления, а не ее фреймом.
Я не пробовал это с более сложной иерархией представлений, но подозреваю, что, используя представление, предоставленное в вызове метода (inView :), мы обходим сложности, связанные с уродливыми видами многоуровневого представления листьев.
источник
Я использовал этот пост, чтобы подать заявку в моем случае. Надеюсь, это поможет другому читателю в будущем.
Представление может видеть только свои непосредственные дочерние и родительские представления. Он не может видеть взгляды своих великих родителей или внуков.
Так, в моем случае, у меня есть грандиозный вид родительский под названием
self.view
, в этомself.view
я добавил подвиды называемыхself.child1OfView
,self.child2OfView
. Вself.child1OfView
, я добавил подвидов называемыеself.child1OfView1
,self.child2OfView1
.Теперь , если я физически переместить
self.child1OfView1
в область за пределами границыself.child1OfView
в пыльниках места наself.view
, затем в калькуляторе новой позиции дляself.child1OfView1
внутриself.view:
источник
Вы можете увидеть код ниже, чтобы понять, как это работает.
источник
Я прочитал ответ и понял механику, но считаю, что последний пример неверен. Согласно документу API, свойство center представления содержит известную центральную точку представления в системе координат супервизора.
Если это так, то я думаю, что не имеет смысла пытаться попросить супервизор преобразовать центр субпредставления ИЗ системы координат субпредставления, потому что значение не находится в системе координат субпредставления. Что имело бы смысл, так это сделать противоположное, то есть преобразовать систему координат супервизора в систему субпредставления ...
Вы можете сделать это двумя способами (оба должны давать одно и то же значение):
или
Я не понимаю, как это должно работать?
источник
Еще один важный момент об использовании этих API. Убедитесь, что родительская цепочка представлений завершена между прямоугольником, который вы конвертируете, и представлением в / из. Например - aView, bView и cView -
Если мы попытаемся выполнить метод до того, как bView будет добавлен в качестве подпредставления cView, мы получим ответ спама. К сожалению, для этого случая в методы не встроена защита. Это может показаться очевидным, но об этом следует помнить в тех случаях, когда преобразование проходит через длинную цепочку родителей.
источник