Я хочу изменить anchorPoint
, но оставить вид на том же месте. Я пробовал NSLog
-ing, self.layer.position
и self.center
оба они остаются неизменными независимо от изменений в anchorPoint. И все же мой взгляд движется!
Любые советы о том, как это сделать?
self.layer.anchorPoint = CGPointMake(0.5, 0.5);
NSLog(@"center point: %f %f", self.layer.position.x, self.layer.position.y);
self.layer.anchorPoint = CGPointMake(1, 1);
NSLog(@"center point: %f %f", self.layer.position.x, self.layer.position.y);
Выход:
2009-12-27 20:43:24.161 Type[11289:207] center point: 272.500000 242.500000
2009-12-27 20:43:24.162 Type[11289:207] center point: 272.500000 242.500000
источник
anchorPoint
иposition
связаны друг с другом?У меня такая же проблема. Решение Брэда Ларсона отлично работало даже при повороте обзора. Вот его решение, переведенное в код.
И быстрый эквивалент:
источник
Ключом к решению этой проблемы было использование свойства frame, которое, как ни странно, единственное, что меняется.
Swift 2
Свифт 3
Затем я изменяю размер, где он масштабируется от точки привязки. Затем мне нужно восстановить старую точку привязки;
Swift 2
Свифт 3
РЕДАКТИРОВАТЬ: это исчезает, если представление повернуто, поскольку свойство кадра не определено, если был применен CGAffineTransform.
источник
Для меня понимание
position
иanchorPoint
было самым легким, когда я начал сравнивать это с моим пониманием frame.origin в UIView. UIView с frame.origin = (20,30) означает, что UIView находится на 20 точек слева и 30 точек сверху от родительского представления. Это расстояние рассчитывается от какой точки UIView? Он рассчитывается из верхнего левого угла UIView.В слое
anchorPoint
отмечает точку (в нормализованной форме, т.е. от 0 до 1), откуда рассчитывается это расстояние, например, layer.position = (20, 30) означает, что слойanchorPoint
находится на 20 точек слева и 30 точек сверху от родительского слоя. По умолчанию точка привязки слоя равна (0,5, 0,5), поэтому точка расчета расстояния находится прямо в центре слоя. Следующий рисунок поможет прояснить мою точку зрения:anchorPoint
также оказывается точкой, вокруг которой будет происходить вращение, если вы примените преобразование к слою.источник
Есть такое простое решение. Это основано на ответе Кенни. Но вместо того, чтобы применять старую рамку, используйте ее исходную точку и новую для расчета перевода, а затем примените этот перевод к центру. Он также работает с повернутым обзором! Вот код, намного проще, чем другие решения:
источник
Для тех, кому это нужно, вот решение Магнуса на Swift:
источник
view.setTranslatesAutoresizingMaskIntoConstraints(true)
. спасибо человекview.setTranslatesAutoresizingMaskIntoConstraints(true)
необходимо при использовании ограничений автоматической компоновки.translatesAutoresizingMaskIntoConstraints
как раз то, чего мне не хватало, я уже мог узнатьВот ответ user945711, скорректированный для NSView в OS X. Помимо NSView, не имеющего
.center
свойства, рамка NSView не изменяется (вероятно, потому, что NSViews не имеют CALayer по умолчанию), но происхождение кадра CALayer изменяется при изменении точки привязки.источник
Если вы измените точку привязки, ее положение также изменится, ЕСЛИ ваше начало не является нулевой точкой
CGPointZero
.источник
Редактируйте и просматривайте точку привязки UIView прямо на раскадровке (Swift 3)
Это альтернативное решение, которое позволяет вам изменять точку привязки с помощью инспектора атрибутов и имеет другое свойство для просмотра точки привязки для подтверждения.
Создайте новый файл для включения в ваш проект
Добавить представление в раскадровку и установить настраиваемый класс
Теперь установите новую точку привязки для UIView.
При включении Показать точку привязки будет отображаться красная точка, чтобы вы могли лучше видеть, где будет визуально точка привязки. Вы всегда можете выключить его позже.
Это действительно помогло мне при планировании преобразований в UIViews.
источник
Для Swift 3:
источник
Развивая отличный и исчерпывающий ответ Магнуса, я создал версию, которая работает с подслоями:
источник