ios - 如何使用 subview 调整 UIView 的大小

标签 ios iphone objective-c uigesturerecognizer

我的目标是使用句柄调整 UIView 的大小 - 它的 subview 。我让我的项目完美地实现了这一点:句柄有一个 PanGestureRecognizer 并且它的处理程序方法使用以下方法调整 View (父)的大小:

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

请注意,我使用了 centerbounds 属性,因为当转换应用于我的 View 时,框架可靠。

但是,我的要求实际上是在任何方向上调整 View 的大小——而不仅仅是像代码那样按比例调整。问题是我没有找到正确的方法或方法来调整此句柄如何调整其 super View 的边界(宽度或高度),因此当手指拖动它时它总是粘在角落里。

这是我的 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(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。

关于ios - 如何使用 subview 调整 UIView 的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21032648/

相关文章:

iphone - 如何在核心数据中保存字符串

ios - iTunes Connect Localization(将英文单词添加到其他国家)

ios - 如何制作线轨动画 CALayer?

iphone - IOS:使用 UISearchbar 自动完成搜索

ios - 标签栏 Controller 中子标签之间的数据传输

ios - 防止滑动 UIPageViewController 时出现的白色间隙

iphone - 当用户禁用推送时,iOS 应用程序应该做什么?

iphone - 如何创建类似 Instagram 的应用内弹出警报

objective-c - 如何在 Objective-C 中形成 CGPoint 数组?

ios - 无法用 timeIntervalSince1970 初始化 NSTimeInterval