iOSがbuttonクリック範囲を拡大する2つの方法

1700 ワード

UIが与える図は小さい場合や、buttonのクリック領域を拡大する必要がある場合があります.一般的にはbuttonのsizeを変更したり、frameを変更せずにbuttonのクリック領域を個別に拡大したりします.
1つ目の方法:UIButtonを継承し、次の方法を書き換える
-(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent*)event
{
    CGRect bounds = self.bounds;
    // 26, , 。
    CGFloat widthDelta = MAX(26, 0);
    CGFloat heightDelta = MAX(26, 0);
    bounds = CGRectInset(bounds, -0.5 * widthDelta, -0.5 * heightDelta);
    return CGRectContainsPoint(bounds, point);
}

2つ目の方法:次の方法を書き換える
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
    CGRect rectBig = CGRectInset(self.bounds, -(27.0/2), -(27.0/2));
    
    if (CGRectContainsPoint(rectBig, point)) {
        return self;
    }else{
        return nil;
    }
    
    return self;
}

上記の変化クリック領域は矩形ですが、クリック領域を円形範囲に規定する必要がある場合は、次のようにすることができます.
-(UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event{
    [super hitTest:point withEvent:event];
    
    CGPoint center = CGPointMake(self.bounds.size.width/2, self.bounds.size.height/2);
    
    
   // 
    CGFloat raidus = self.frame.size.height >= self.frame.size.width ?self.frame.size.width/2 :self.frame.size.width/2;
    
   //       
    BOOL pointInRound =[self touchPointInsideCircle:center radius:raidus targetPoint:point];
    
    if (pointInRound) {
        return self;
    }else
    {
        return nil;
    }
}

//   
- (BOOL)touchPointInsideCircle:(CGPoint)center radius:(CGFloat)radius targetPoint:(CGPoint)point
{
    CGFloat dist = sqrtf((point.x - center.x) * (point.x - center.x) +
                         (point.y - center.y) * (point.y - center.y));
    return (dist <= radius);
}