Вращение вокруг anchorPoint делает прыжок
У меня есть TagView, который является подклассом UIView. Я вращая его вокруг точки привязки, как так:
double rads = DEGREES_TO_RADIANS(self.angle);
[self setAnchorPoint:self.anchor forView:self];
CGAffineTransform transform = CGAffineTransformRotate(CGAffineTransformIdentity, rads);
self.transform = transform;
Я устанавливаю опорную точку, используя метод, предложенный здесь:
- (void)setAnchorPoint:(CGPoint)anchorPoint forView:(UIView *)view {
CGPoint newPoint = CGPointMake(view.bounds.size.width * anchorPoint.x,
view.bounds.size.height * anchorPoint.y);
CGPoint oldPoint = CGPointMake(view.bounds.size.width * view.layer.anchorPoint.x,
view.bounds.size.height * view.layer.anchorPoint.y);
newPoint = CGPointApplyAffineTransform(newPoint, view.transform);
oldPoint = CGPointApplyAffineTransform(oldPoint, view.transform);
CGPoint position = view.layer.position;
position.x -= oldPoint.x;
position.x += newPoint.x;
position.y -= oldPoint.y;
position.y += newPoint.y;
view.layer.position = position;
view.layer.anchorPoint = anchorPoint;
}
У меня была проблема с автоматической компоновкой, которую я исправил, поместив свой вид в контейнер UIView и установив его в центр. Но когда я изменяю содержимое метки, которая находится внутри моего просмотра, это делает прыжок.
1 ответ
Я нашел решение своей проблемы. Я устанавливал синий вид в центр фиксированного размера UIView с ограничениями Autolayout. В моем методе drawRect я применил вышеупомянутый метод setAnchorPoint. Проблема состояла в том, что, когда я установил новую опорную точку, мои ограничения не были применены немедленно. Они были применены после того, как содержимое было изменено, и переместили синие позиции Views в центр розового UIView, как вы можете видеть на изображении ниже.
Решением было заставить суперпредставление макета его подпредставлений.