第一种:一个view的子控件部分在view的范围外,要点击响应范围外的这部分要用到:
/**
close按钮是添加在view里面,但是有一部分超出了绿色view的范围。默认情况下点击view区域外的按钮部分,close按钮是不会有任何响应的。接下来我通过重写- (nullable UIView *)hitTest:(CGPoint)point withEvent:(nullable UIEvent *)event方法来让点击close按钮任何一个地方都能响应
*/
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
if (self.userInteractionEnabled == NO || self.isHidden || self.alpha <= 0.01) {
//这三种情况不能响应事件
return nil;
}
//往前遍历子控件
for (NSInteger i = self.subviews.count - 1; i >= 0; i--) {
UIView *subView = self.subviews[i];
//把点的坐标转换成子控件的坐标
CGPoint newPoint = [self convertPoint:point toView:subView];
if ([subView hitTest:newPoint withEvent:event]) {
//找到最合适的view
return subView;
}
}
return [super hitTest:point withEvent:event];
}
第二种:一个view点击的时候要响应自己还是哪个子控件的时候,要用到:
//判断一个点是否在某个范围内
-(BOOL)point:(CGPoint)point IsInFrame:(CGRect)frame{
CGMutablePathRef pathRef=CGPathCreateMutable();
CGPathMoveToPoint(pathRef, NULL, frame.origin.x, frame.origin.y);
CGPathAddLineToPoint(pathRef, NULL, frame.origin.x, frame.origin.y + frame.size.height);
CGPathAddLineToPoint(pathRef, NULL, frame.origin.x + frame.size.width, frame.origin.y + frame.size.height);
CGPathAddLineToPoint(pathRef, NULL, frame.origin.x + frame.size.width, frame.origin.y);
CGPathAddLineToPoint(pathRef, NULL, frame.origin.x, frame.origin.y);
CGPathCloseSubpath(pathRef);
if (CGPathContainsPoint(pathRef, NULL, point, NO))
{
DLog(@"point in path!");
return YES;
}
DLog(@"outPoint out path!");
return NO;
}
/**
让点击响应那个按钮
*/
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
BOOL isLikePoint = [self point:point IsInFrame:self.like.frame];
if (isLikePoint) {
return self.like;
}
BOOL isAvtorPoint = [self point:point IsInFrame:self.avatorView.frame];
if (isAvtorPoint) {
return self.avatorView;
}
BOOL isCommentPoint = [self point:point IsInFrame:self.comment.frame];
if (isCommentPoint) {
return self.comment;
}
return [super hitTest:point withEvent:event];
}
网友评论