我的目标是使用一个句柄-其子视图来调整UIView的大小。我使我的项目完美地完成了这一任务:手柄具有PanGestureRecognizer,并且其处理程序方法使用以下方法调整视图(父级)的大小:

-(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;
  }
}

请注意,我使用中心边界属性,因为当将变换应用于我的视图时,框架是而不是可靠。

但是,我的要求实际上是在任何方向上调整视图的大小-不仅像代码一样按比例缩放。问题是我没有找到正确的方法或方法来处理此手柄如何调整其 super 视图的边界(宽度或高度)的大小,因此当手指在周围拖动时,它始终会粘在角落。

如果更容易理解我的意思,这是我的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);
}

最佳答案

您在对CGRectScale的调用中设置了相同的scale参数(initialBounds,scale,scale);试试这个:

case UIGestureRecognizerStateChanged: {
            CGFloat scaleX = abs(center.x-touchLocation.x)/initialDistance;
            CGFloat scaleY = abs(center.y-touchLocation.y)/initialDistance;
            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;

您也可以考虑存储initialDistanceX和initialDistanceY。

10-05 20:26
查看更多