2013-05-20 88 views
0

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

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

UPDATE

我期待到使用CAShapeLayer作为一个可能的解决方案。有谁知道如何将UIBezierPath转换为CAShapeLayer,然后设置CAShapeLayer的位置?

我曾尝试:

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

但这不起作用。

+0

我想你要找的是[贴在这里](http://stackoverflow.com/questions/13153223/how-to-crop-the-image-using-uibezierpath)检查它,它可能会有所帮助,祝你好运 –

回答

1

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

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

定义这个全局值进行演示:

#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]; 
} 

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

希望它有帮助。

+0

哇!有效。我一直在努力想象这个我们好几天!非常感谢你! – tentmaking

+0

你不知道UIBezierPath在哪里被绘制的情况呢?当图层显示时它不可见。 – tentmaking

+0

这只是一个获取你的路径和你的观点的位置和大小的问题。我不完全知道你的问题的上下文,但是你要么有'UIBezierPath'实例,要么'UIView'来获取路径(如* resize *方法中的第一行)。在这两种情况下,你都有所需的数据来完成你所要求的。 –

相关问题