我在UIView
的子类中的drawRect函数中画了一个圆圈- (void)drawRect:(CGRect)rect
{
CGContextRef contextRef = UIGraphicsGetCurrentContext();
CGContextSetLineWidth(contextRef, 2.0);
CGContextSetRGBFillColor(contextRef, 0, 0, 1.0, 1.0);
CGContextSetRGBStrokeColor(contextRef, 0, 0, 1.0, 1.0);
CGRect circlePoint = (CGRectMake(self.bounds.size.width/3, self.bounds.size.height/2, 200.0, 200.0));
CGContextFillEllipseInRect(contextRef, circlePoint);
}
我想在圆圈中添加手势识别器以使其可以播放
UITapGestureRecognizer *singleFingerTap =
[[UITapGestureRecognizer alloc] initWithTarget:self
action:@selector(handleSingleTap:)];
[self.view addGestureRecognizer:singleFingerTap];
我想过将UIGestureRecognizer拖到大圆圈所在位置的视图(在故事板中),但圆圈比UIGestureRecognizer小部件大得多。
如何组合代码或将UIGestureRecognizer分配给视图中与圆圈的大小和位置完全相同的区域?
答案 0 :(得分:2)
简短的回答是你无法做到。手势识别器附加到视图,而不是形状或层。您必须为每个形状创建自定义视图对象。你当然可以这样做。
我建议你做的是创建一个管理你所有形状的UIView的自定义子类。 (我称之为ShapesView)让自定义ShapesView管理一组自定义形状对象。将手势识别器附加到ShapesView。在响应手势的代码中,让它进行自定义命中测试以确定敲击哪个形状,并移动形状。
UIBezierPath包含一个containsPoint方法,如果您为每个形状维护一个bezier路径,则允许您进行命中测试。
答案 1 :(得分:1)
我不确定如何使用drawRect以你的方式做到这一点,但我已经使用UIBezierPath做了类似的事情。我将UIView子类化,并将此视图作为我的控制器的主视图。这是该视图中的代码,
- (id)initWithCoder:(NSCoder *)aDecoder {
if (self = [super initWithCoder:aDecoder]) {
self.shape = [UIBezierPath bezierPathWithOvalInRect:(CGRectMake(self.bounds.size.width/3, self.bounds.size.height/3, 200.0, 200.0))];
}
return self;
}
-(void)drawRect:(CGRect)rect {
[[UIColor blueColor] setFill];
[self.shape fill];
}
shape是.h文件中声明的属性。在视图控制器.m文件中,我添加了手势识别器,并检查触摸是否在形状内,
@interface ViewController ()
@property (strong,nonatomic) RDView *mainView;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.mainView = (RDView *)self.view;
UITapGestureRecognizer *singleFingerTap =
[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTap:)];
[self.view addGestureRecognizer:singleFingerTap];
}
-(void)handleSingleTap:(UITapGestureRecognizer *) tapper {
if ([self.mainView.shape containsPoint:[tapper locationInView:self.mainView]]) {
NSLog(@"tapped");
}
}