根据内容大小设置 UIView 的大小

Posted

技术标签:

【中文标题】根据内容大小设置 UIView 的大小【英文标题】:Set size of UIView based on content size 【发布时间】:2013-05-20 15:32:16 【问题描述】:

是否可以在UIView 上绘制一些东西,然后在绘制完成后,将视图调整为与之前绘制的东西相同的大小?

例如,如果我在 UIView 上绘制一个圆圈,我想将 UIView 裁剪为我刚刚在视图上绘制的圆圈的尺寸。

更新

我正在考虑使用 CAShapeLayer 作为可能的解决方案。有谁知道如何将 UIBezierPath 转换为 CAShapeLayer 然后设置 CAShapeLayer 的位置?

我试过了:

shapeLayer.path = bezierPath.CGPath;
shapeLayer.position = CGPointMake(0, 0);

但这不起作用。

【问题讨论】:

我猜你要找的是posted here检查它,它可能会有所帮助,祝你好运 【参考方案1】:

是的,您可以这样做。看看这个可以回答你两个问题的例子。

首先,您需要添加一个名为 myViewUIView 并将其附加到 IBOutlet ivar。

为演示目的定义此全局值:

#define POSITION    CGPointMake(50.0,50.0)
#define SIZE        CGSizeMake(100.0,100.0)

声明两种方法,一种将在 myView 中绘制形状,另一种将调整视图大小以使其适应绘制的形状:

-(void) circle

    CAShapeLayer *layerData = [CAShapeLayer layer];
    layerData.fillColor = [UIColor greenColor].CGColor;

    UIBezierPath * dataPath = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(0.0, 0.0, SIZE.width, SIZE.height)];

    layerData.path = dataPath.CGPath;
    layerData.position = CGPointMake(POSITION.x, POSITION.y);

    [myView.layer addSublayer:layerData];


-(void) resize

    ((CAShapeLayer *)[myView.layer.sublayers objectAtIndex:0]).position = CGPointMake(0.0, 0.0);
    myView.frame = CGRectMake(POSITION.x + myView.frame.origin.x , POSITION.y + myView.frame.origin.y, SIZE.width, SIZE.height);

最后,在viewWillAppear: 中调用这两个方法:

- (void)viewWillAppear:(BOOL)animated

    [super viewWillAppear:animated];

    [self circle];
    [self resize];

您可以运行相同的代码,只调用 circle 并调用这两种方法。在这两种情况下,绘制的圆圈将位于相同的确切位置,但在第二种情况下,myView 已调整大小以与绘制的形状具有相同的大小。

希望对你有帮助。

【讨论】:

哇!有效。几天来,我一直试图弄清楚这一点!非常感谢! 不知道 UIBezierPath 绘制在哪里的情况怎么办?显示图层时不可见。 这只是获取路径和视图的位置和大小的问题。我不确切知道您的问题的上下文,但您要么有一个 UIBezierPath 实例,要么有一个 UIView 来获取路径(如 resize 方法中的第一行)。在这两种情况下,您都拥有执行所需的所有数据。

以上是关于根据内容大小设置 UIView 的大小的主要内容,如果未能解决你的问题,请参考以下文章

如何根据superView设置UIView大小

根据设备方向在 alloc/init 上设置正确的 UIView 帧大小

UIView - 调整大小以适应内容

使用自动布局调整 UIView 大小并更新内容

是否可以在截取uiview的屏幕截图时设置图像大小?

如何在父 uiview 内设置 uiview 大小?