Моя цель - изменить размер UIView с помощью дескриптора. Я получил мой проект прекрасно работает для достижения этой цели: ручка имеет PanGestureRecognizer и способ его обработчик изменяет представление (родительский), используя следующий метод:Как изменить размер UIView с Subview
-(IBAction)handleResizeGesture:(UIPanGestureRecognizer *)recognizer {
CGPoint touchLocation = [recognizer locationInView:container.superview];
CGPoint center = container.center;
switch (recognizer.state) {
case UIGestureRecognizerStateBegan: {
deltaAngle = atan2f(touchLocation.y - center.y, touchLocation.x - center.x) -
CGAffineTransformGetAngle(container.transform);
initialBounds = container.bounds;
initialDistance = CGPointGetDistance(center, touchLocation);
break;
}
case UIGestureRecognizerStateChanged: {
CGFloat scale = CGPointGetDistance(center, touchLocation)/initialDistance;
CGFloat minimumScale = self.minimumSize/MIN(initialBounds.size.width,
initialBounds.size.height);
scale = MAX(scale, minimumScale);
CGRect scaledBounds = CGRectScale(initialBounds, scale, scale);
container.bounds = scaledBounds;
[container setNeedsDisplay];
break;
}
case UIGestureRecognizerStateEnded:
break;
default:
break;
}
}
Пожалуйста, обратите внимание, что я использую центр и границы свойства потому что кадр NOT надежный, когда преобразование применяется к моему представлению.
Однако мое требование действительно заключается в изменении размера представления в ЛЮБОМ направлении - не только пропорционально, как это делает код. Проблема в том, что я не нахожу правильные методы или подходы к тому, как этот дескриптор может изменять размеры своих границ (ширину или высоту) супервизора, поэтому он всегда придерживается угла, в то время как палец тащит его.
Вот мой project, если легче понять, что я имею в виду.
Обновлено решение как предложено ответ ниже работает очень хорошо, но как только преобразование применяется (например, в viewDidLoad у меня есть container.transform = CGAffineTransformMakeRotation(90);
) он не делает:
case UIGestureRecognizerStateBegan: {
initialBounds = container.bounds;
initialDistance = CGPointGetDistance(center, touchLocation);
initialDistanceX = CGPointGetDistanceX(center, touchLocation);
initialDistanceY = CGPointGetDistanceY(center, touchLocation);
break;
}
case UIGestureRecognizerStateChanged: {
CGFloat scaleX = abs(center.x-touchLocation.x)/initialDistanceX;
CGFloat scaleY = abs(center.y-touchLocation.y)/initialDistanceY;
CGFloat minimumScale = self.minimumSize/MIN(initialBounds.size.width, initialBounds.size.height);
scaleX = MAX(scaleX, minimumScale);
scaleY = MAX(scaleY, minimumScale);
CGRect scaledBounds = CGRectScale(initialBounds, scaleX, scaleY);
container.bounds = scaledBounds;
[container setNeedsDisplay];
break;
}
где
CG_INLINE CGFloat CGPointGetDistanceX(CGPoint point1, CGPoint point2) {
return (point2.x - point1.x);
}
CG_INLINE CGFloat CGPointGetDistanceY(CGPoint point1, CGPoint point2) {
return (point2.y - point1.y);
}
Зачем изменять размер с подвью? Было бы намного сложнее, если бы вы включили представление цели и обработчика в представление. Я бы изменил проект, который вы отправили, если вы в порядке с этим решением. – Geri
Почему вы имеете дело с любой тригонометрией здесь? – Geri
Как еще рассчитать точки расстояния? – Vad