裁剪 UIImageView 和手势识别器
Crop UIImageView and gesture recognizer
我有 ImageView,我将其裁剪成圆圈:
self.contentMode = UIViewContentModeScaleAspectFill;
self.layer.cornerRadius = self.bounds.size.height / 2.0;
self.layer.masksToBounds = YES;
然后我给它添加了手势识别器,但它在裁剪区域触发。
如何避免在裁剪区域开火?
- 设置你的class符合
UIGestureRecognizerDelegate
- 将你的手势委托设置为自己
然后使用这个委托来决定是否要触发它
-(BOOL) gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
示例代码
-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch{
CGPoint touchPoint = [touch locationInView:self.imageview];
if (CGRectContainsPoint(self.imageview.bounds, touchPoint)) {
CGFloat centerX = CGRectGetMidX(self.imageview.bounds);
CGFloat centerY = CGRectGetMidY(self.imageview.bounds);
CGFloat radius2 = pow((touchPoint.x -centerX),2)+ pow((touchPoint.y - centerY), 2);
if (radius2 < pow(CGRectGetWidth(self.imageview.frame)/2, 2)) {
return YES;
}
}
return NO;}
一种更通用、更灵活的屏蔽图像的方法是使用 CAShapeLayer。您可以创建任何形状(包括圆形)用作遮罩。通过使用这种方法而不是使用 cornerRadius
来裁剪图像视图,您可以检查触摸点是否在层的路径内 (a UIBezierPath
)。在 UIImageView
子类中添加以下代码以创建遮罩,并在 .h 文件中创建一个 属性、形状。
self.shape = [UIBezierPath bezierPathWithOvalInRect:self.bounds];
CAShapeLayer *shapeLayer = [CAShapeLayer layer];
shapeLayer.path = self.shape.CGPath;
self.layer.mask = shapeLayer;
在控制器中,添加点击手势识别器,并在其操作方法中使用此代码,
-(void)handleTap:(UITapGestureRecognizer *) tapper {
CGPoint touchPoint = [tapper locationInView:tapper.view];
if ([self.imageView.shape containsPoint:touchPoint]) {
NSLog(@"touched");
// do what you want with the touch here
}
}
我有 ImageView,我将其裁剪成圆圈:
self.contentMode = UIViewContentModeScaleAspectFill;
self.layer.cornerRadius = self.bounds.size.height / 2.0;
self.layer.masksToBounds = YES;
然后我给它添加了手势识别器,但它在裁剪区域触发。
如何避免在裁剪区域开火?
- 设置你的class符合
UIGestureRecognizerDelegate
- 将你的手势委托设置为自己
然后使用这个委托来决定是否要触发它
-(BOOL) gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
示例代码
-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch{
CGPoint touchPoint = [touch locationInView:self.imageview];
if (CGRectContainsPoint(self.imageview.bounds, touchPoint)) {
CGFloat centerX = CGRectGetMidX(self.imageview.bounds);
CGFloat centerY = CGRectGetMidY(self.imageview.bounds);
CGFloat radius2 = pow((touchPoint.x -centerX),2)+ pow((touchPoint.y - centerY), 2);
if (radius2 < pow(CGRectGetWidth(self.imageview.frame)/2, 2)) {
return YES;
}
}
return NO;}
一种更通用、更灵活的屏蔽图像的方法是使用 CAShapeLayer。您可以创建任何形状(包括圆形)用作遮罩。通过使用这种方法而不是使用 cornerRadius
来裁剪图像视图,您可以检查触摸点是否在层的路径内 (a UIBezierPath
)。在 UIImageView
子类中添加以下代码以创建遮罩,并在 .h 文件中创建一个 属性、形状。
self.shape = [UIBezierPath bezierPathWithOvalInRect:self.bounds];
CAShapeLayer *shapeLayer = [CAShapeLayer layer];
shapeLayer.path = self.shape.CGPath;
self.layer.mask = shapeLayer;
在控制器中,添加点击手势识别器,并在其操作方法中使用此代码,
-(void)handleTap:(UITapGestureRecognizer *) tapper {
CGPoint touchPoint = [tapper locationInView:tapper.view];
if ([self.imageView.shape containsPoint:touchPoint]) {
NSLog(@"touched");
// do what you want with the touch here
}
}