4

drawRectでUIBezierPathsを描画するUIViewサブクラスがいくつかあります。これらのビューを追加するviewControllerで、ヒットテストを実行して、ベジェパス内でタップが発生したかどうかを確認する必要があります。ビューサブクラスにUIBezierPath変数を作成し、それに対してテストしてみました。しかしもちろん、オフセットは完全に間違っていました。形状の上ではなく、画面の上隅でヒットが発生しました。

誰かがこれを行うための最良の方法を提案できますか?これは理にかなっていますか、それともコードを追加する必要がありますか?

ありがとう、ジェームズ

4

1 に答える 1

2

これは私が持っているカスタムの三角形のビューです。ベジェパスよりもはるかに単純ですが、ほぼ同じように機能するはずです。また、アルファレイヤーを使用するUIImageに使用する、ピクセルごとのアルファレベルに基づいてヒットテストを行うカテゴリもあります。(この投稿では、UIImageのピクセルアルファ値を取得しています

- (void)drawRect:(CGRect)rect
{    
    CGContextRef context = UIGraphicsGetCurrentContext();

    CGContextMoveToPoint(context, 0.0, 0.0);
    CGContextAddLineToPoint(context, rect.size.width, 0.0);
    CGContextAddLineToPoint(context, 0.0, rect.size.height);
    CGContextClosePath(context);

    CGContextSetFillColorWithColor(context, triangleColor.CGColor);
    CGContextFillPath(context);

    CGContextSaveGState(context);

    [self.layer setShouldRasterize:YES];
    [self.layer setRasterizationScale:[UIScreen mainScreen].scale];

}

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
    CGMutablePathRef trianglePath = CGPathCreateMutable();
    CGPathMoveToPoint(trianglePath, NULL, 0.0, 0.0);
    CGPathAddLineToPoint(trianglePath, NULL, self.frame.size.width, 0.0);
    CGPathAddLineToPoint(trianglePath, NULL, 0.0, self.frame.size.height);
    CGPathCloseSubpath(trianglePath);


    if (CGPathContainsPoint(trianglePath, nil, point, YES)) {
        CGPathRelease(trianglePath);
        return self;
    } else {
        CGPathRelease(trianglePath);
        return nil;
    }
}
于 2012-08-17T15:27:10.783 に答える