将自定义视图的帧适合drawRect中绘制的图像

时间:2015-01-29 15:22:48

标签: ios objective-c drawrect uibezierpath

我在自定义UIView子类的drawRect中绘制自定义形状(五边形):

- (void)drawRect:(CGRect)rect {
    UIBezierPath *aPath = [UIBezierPath bezierPath];

    // Set the starting point of the shape.
    [aPath moveToPoint:CGPointMake(100.0, 0.0)];

    // Draw the lines.
    [aPath addLineToPoint:CGPointMake(200.0, 40.0)];
    [aPath addLineToPoint:CGPointMake(160, 140)];
    [aPath addLineToPoint:CGPointMake(40.0, 140)];
    [aPath addLineToPoint:CGPointMake(0.0, 40.0)];
    [aPath closePath];

    [[UIColor blackColor] setStroke];
    [[UIColor redColor] setFill];

    [aPath fill];
    [aPath stroke];
}

当我将自定义绘图添加到我的viewcontroller时:

- (void)viewDidLoad {
    [super viewDidLoad];
    PentagonView *pentagonView = [[PentagonView alloc] initWithFrame:CGRectMake(0, 0, 300, 300)];
    [self.view addSubview:pentagonView];
}

最终看起来像:

enter image description here

显然我知道我将我的框架设置为300宽度/高度,但有没有办法做一个大小适合"内容被绘制后,视图框架上的内容?

2 个答案:

答案 0 :(得分:1)

如果您保留对UIBezierPath的引用,则可以在其上调用bounds以获取边界矩形。覆盖sizeToFit以使用它:

- (void)sizeThatFits:(CGSize)size {
  CGSize newSize = CGSizeZero;
  newSize.width = MIN(size.width, CGRectGetMaxX(self.path.bounds));
  newSize.height = MIN(size.height, CGRectGetMaxY(self.path.bounds));
  return newSize;
}

答案 1 :(得分:1)

你有点倒退。 drawRect:方法应绘制其内容以填充其当前边界。换句话说,不要对drawRect:中的任何特定坐标进行硬编码。根据当前界限正确计算它们。

如果您希望自定义视图具有特定大小,请覆盖自定义视图的sizeToFit:方法并返回相应的大小。

这样,当客户端代码调用自定义视图的sizeToFit方法时,视图的大小将根据sizeToFit:的结果进行调整。然后将调用drawRect:方法,它将绘制以填充该大小。