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

时间:2013-05-20 15:32:17

标签: objective-c uiview cashapelayer contentsize

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

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

更新

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

我试过了:

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

但这不起作用。

1 个答案:

答案 0 :(得分:1)

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

首先,您需要添加名为 myView UIView并将其附加到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 已调整为与绘制的形状具有相同的大小。

希望它有所帮助。