在 iOS 中,如果您想在 UIView
中进行任何数量的自定义绘制,您必须创建一个子类并重写方法如 drawRect:
或 layoutSubviews:
。如果您正在进行大量绘制,这并不是一个问题。然而,对于更简单的情况,这会变得有些繁琐。《LDDrawingView》通过使用两个可从对象外部设置的代码块:《drawRectBlock》和《layoutSubviewsBlock》来克服这一点。在示例中,我提供了一个更复杂的例子,包括 AutoLayout 等,但这并不是最佳用法。我建议在您只需要一个简单的标志或绘制物时使用此类,但不想创建 UIView
的子类。
如果您想简单地编写此代码,请查看 LDDrawingView.m。它不是很复杂,但它是 UIView
的一个好补充。
下面是视图控制器中示例代码:
- (void)loadView {
[super loadView];
LDDrawingView *drawingView = [[LDDrawingView alloc] init];
drawingView.translatesAutoresizingMaskIntoConstraints = NO;
drawingView.backgroundColor = [UIColor clearColor];
[drawingView setDrawRectBlock:^(CGContextRef context, CGRect rect){
CGContextSetFillColorWithColor(context, [UIColor darkGrayColor].CGColor);
CGContextAddEllipseInRect(context, rect);
CGContextFillPath(context);
}];
[drawingView setLayoutBlock:^(LDDrawingView *view){
LDDrawingView *subview = [[LDDrawingView alloc] init];
subview.backgroundColor = [UIColor clearColor];
subview.translatesAutoresizingMaskIntoConstraints = NO;
[subview setDrawRectBlock:^(CGContextRef context, CGRect rect){
CGContextSetFillColorWithColor(context, [UIColor lightGrayColor].CGColor);
UIRectFill(rect);
}];
[view addSubview:subview];
[view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-(100)-[subview]-(100)-|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(subview)]];
[view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-(100)-[subview]-(100)-|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(subview)]];
}];
[self.view addSubview:drawingView];
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-[drawingView]-|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(drawingView)]];
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[drawingView]-|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(drawingView)]];
}