调整 UIView 的大小以适应 CGPath

Posted

技术标签:

【中文标题】调整 UIView 的大小以适应 CGPath【英文标题】:Resize UIView to fit a CGPath 【发布时间】:2011-03-15 20:06:17 【问题描述】:

我有一个 UIView 子类,用户可以在其上添加随机 CGPath。 CGPath 是通过处理 UIPanGestures 添加的。

我想将 UIView 调整为包含 CGPath 的最小矩形。在我的 UIView 子类中,我重写了 sizeThatFits 以返回最小尺寸:

- (CGSize) sizeThatFits:(CGSize)size 
    CGRect box = CGPathGetBoundingBox(sigPath);
    return box.size;

这可以按预期工作,并且 UIView 的大小会调整为返回的值,但 CGPath 也会按比例“调整大小”,从而导致与用户最初绘制的路径不同。例如,这是用户绘制路径的视图:

这是调整大小后的路径视图:

如何调整 UIView 的大小而不是“调整”路径?

【问题讨论】:

这里有些问题。你找到解决办法了吗?谢谢! 【参考方案1】:

使用 CGPathGetBoundingBox。来自 Apple 文档:

返回包含图形路径中所有点的边界框。这 边界框是完全包围所有点的最小矩形 在路径中,包括贝塞尔曲线和二次曲线的控制点。

这里有一个小型的概念验证 drawRect 方法。希望对你有帮助!

- (void)drawRect:(CGRect)rect 

    //Get the CGContext from this view
    CGContextRef context = UIGraphicsGetCurrentContext();

    //Clear context rect
    CGContextClearRect(context, rect);

    //Set the stroke (pen) color
    CGContextSetStrokeColorWithColor(context, [UIColor blackColor].CGColor);

    //Set the width of the pen mark
    CGContextSetLineWidth(context, 1.0);

    CGPoint startPoint = CGPointMake(50, 50);
    CGPoint arrowPoint = CGPointMake(60, 110);

    //Start at this point
    CGContextMoveToPoint(context, startPoint.x, startPoint.y);
    CGContextAddLineToPoint(context, startPoint.x+100, startPoint.y);
    CGContextAddLineToPoint(context, startPoint.x+100, startPoint.y+90);
    CGContextAddLineToPoint(context, startPoint.x+50, startPoint.y+90);
    CGContextAddLineToPoint(context, arrowPoint.x, arrowPoint.y);
    CGContextAddLineToPoint(context, startPoint.x+40, startPoint.y+90);
    CGContextAddLineToPoint(context, startPoint.x, startPoint.y+90);
    CGContextAddLineToPoint(context, startPoint.x, startPoint.y);

    //Draw it
    //CGContextStrokePath(context);

    CGPathRef aPathRef = CGContextCopyPath(context);

    // Close the path
    CGContextClosePath(context);

    CGRect boundingBox = CGPathGetBoundingBox(aPathRef);
    NSLog(@"your minimal enclosing rect: %.2f %.2f %.2f %.2f", boundingBox.origin.x, boundingBox.origin.y, boundingBox.size.width, boundingBox.size.height);
 

【讨论】:

不考虑线宽

以上是关于调整 UIView 的大小以适应 CGPath的主要内容,如果未能解决你的问题,请参考以下文章

调整 UIView 的大小以适应 uiScrollView 中的所有内容

在不调整大小或重绘的情况下扩展 UIView

iPhone UIView - 调整框架以适应子视图

尝试调整我的 UIView 容器以适应较小的 iPhone 屏幕尺寸

缩放 CGPath 以适应 UIVIew

无法让 UIImageView 调整大小以适应屏幕