Когда мой UIView
поворачивается с помощью свойства transform (CGAffineTransformMakeRotation
), мне нужно перетащить один из его углов, скажем, вправо, чтобы изменить его размер. Во время этого процесса, когда пользователь перетаскивает угол, угол обзора должен следовать за пальцем пользователя и изменять размер окна, увеличивая 2 стороны (правый и нижний размер для перетаскивания нижнего правого угла).
Не так сложно изменить размер UIView
, когда вы можете использовать фреймы и контакты, когда поле не преобразуется. Например, я бы вспомнил начальный кадр и коснулся в UIPanGestureRecognizer
handler
, прикрепленный к этому изменяемому размеру представлению StateBegan, и в StateChanged я бы вычислил разницу касания X, Y от начального касания и добавила эти значения к начальной ширине кадра и высота.
Однако, когда преобразование применяется, кадр является надежным для повернутого UIView
. Таким образом, я могу полагаться только на bounds
и center
. Я создал этот код, но он почти работает: я могу увеличить изображение пропорционально во всех 4 направлениях, а не в одном.
- (void)handleResizeGesture:(UIPanGestureRecognizer *)recognizer {
CGPoint touchLocation = [recognizer locationInView:self.superview];
CGPoint center = self.center;
switch (recognizer.state) {
case UIGestureRecognizerStateBegan: {
deltaAngle = atan2f(touchLocation.y - center.y, touchLocation.x - center.x) - CGAffineTransformGetAngle(self.transform);
initialBounds = self.bounds;
initialDistance = CGPointGetDistance(center, touchLocation);
initialLocation = touchLocation;
if ([self.delegate respondsToSelector:@selector(stickerViewDidBeginRotating:)]) {
[self.delegate stickerViewDidBeginRotating:self];
}
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);
self.bounds = scaledBounds;
[self setNeedsDisplay];
if ([self.delegate respondsToSelector:@selector(stickerViewDidChangeRotating:)]) {
[self.delegate stickerViewDidChangeRotating:self];
}
break;
}
case UIGestureRecognizerStateEnded:
if ([self.delegate respondsToSelector:@selector(stickerViewDidEndRotating:)]) {
[self.delegate stickerViewDidEndRotating:self];
}
break;
default:
break;
}
}
На рисунке ниже показано повернутое представление с известными значениями (расстояние A, B, x, y, N, M, N-M):