0

iPad 用の小さな単語検索ゲームを書いています。私は を持っていて、 ( )UIViewControllerに文字をランダムに並べます。各文字に を使用して、ラベルのタグを 10x10 サイズのマトリックスに設定します。UIViewlettersViewUILabel

UILabelここに私の問題があります: 文字 ( s) の上に描画する方法がわかりません。私は問題を調査しましたが、どの方法を使用するか混乱しています(タッチ、opengl、クォーツ、ヒットテスト)。

  • 最初のポイントから最後のポイントまで直線を引きたいだけです(タッチダウンからタッチアップ)。
  • ユーザーが をタップすると、タップされたlettersView文字を見つける必要があります。UILabel最初にタップされた を取得すると、手紙を見つけることができます。
  • ユーザーが指を動かしている間は線を描画する必要がありますが、ユーザーが移動している間は古い線を削除する必要があります。
  • ユーザーがタッチアップしたとき、どうすれば最後のものを取得できUILabelますか? 最初と最後の uilabel を取得すると、drawable かどうかを確認できます。

(ARC モードで書かれた小さな描画サンプルを見つけましたが、非 ARC に変換できません。)


私はあなたが言ったことをすべてしました。しかし、私にはいくつかの問題があります。drawRect メソッドで線を描画します。2 番目の線を描画すると、古い線が削除されます。コードは次のとおりです。

-(void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    touchStart = [[touches anyObject] locationInView:self];
    float xPos=touchStart.x;
    float yPos=touchStart.y;

    startIndexCol = floor(xPos / letterWidth);
    startIndexRow = floor(yPos / letterHeight);

    xPos = (startIndexCol * letterWidth) + letterWidth/2;
    yPos = (startIndexRow * letterHeight) + letterHeight/2;
    touchStart = CGPointMake(xPos, yPos);
    touchCurrent = touchStart;
    [self setNeedsDisplay];
}

-(void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    touchCurrent = [[touches anyObject] locationInView:self];
    //CGRect frame = CGRectMake(touchStart.x, touchStart.y, touchCurrent.x, touchCurrent.y);
    //[self setNeedsDisplayInRect:frame];
    [self setNeedsDisplay];
}

-(void) touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
    touchCurrent = [[touches anyObject] locationInView:self];
    //[self hitTest:touchCurrent withEvent:event];
    float xPos=touchCurrent.x;
    float yPos=touchCurrent.y;

    endIndexCol = floor(xPos / letterWidth);
    endIndexRow = floor(yPos / letterHeight);

    xPos = (endIndexCol * letterWidth) + letterWidth/2;
    yPos = (endIndexRow * letterHeight) + letterHeight/2;
    touchCurrent = CGPointMake(xPos, yPos);
    //CGRect frame = CGRectMake(touchStart.x, touchStart.y, touchCurrent.x, touchCurrent.y);
    //[self setNeedsDisplayInRect:frame];


    //check if it can be drawn
    if ((startIndexCol == endIndexCol) && (startIndexRow == endIndexRow)) {
        //clear, do nothing
        touchStart = touchCurrent = (CGPoint) { -1, -1 };
        startIndexCol = startIndexRow = endIndexCol = endIndexRow = -1;
    }
    else{
        if (startIndexRow == endIndexRow) {//horizontal
            if (endIndexCol > startIndexCol) {
                [delegate checkWordInHorizontal:startIndexRow start:startIndexCol end:endIndexCol];
            }
            else{
                [delegate checkWordInHorizontalBack:startIndexRow start:startIndexCol end:endIndexCol];
            }
        }
        else if (startIndexCol == endIndexCol){ //vertical
            if (endIndexRow > startIndexRow) {
                [delegate checkWordInVertical:startIndexCol start:startIndexRow end:endIndexRow];
            }
            else{
                [delegate checkWordInVerticalBack:startIndexCol start:startIndexRow end:endIndexRow];
            }
        }
    }


    [self setNeedsDisplay];
}

-(UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event{
    UIView *subview = [super hitTest:point withEvent:event];
    if ([subview isEqual:self]) {
        NSLog(@"point:%f - %f", point.x, point.y);
        return self;
    }
    return nil;

}

-(void)drawLine{
    NSLog(@"draw it");
    drawIt=YES;
    [self setNeedsDisplay];
}


- (void)drawRect:(CGRect)rect
{
    [super drawRect:rect];
    if (drawIt) {
        NSLog(@"drawit");
        CGContextRef ctx = UIGraphicsGetCurrentContext();
        CGContextSetLineWidth(ctx, 20.0);
        CGContextSetRGBStrokeColor(ctx, 1.0, 2.0, 0, 0.5);
        CGContextMoveToPoint(ctx, touchStart.x, touchStart.y);
        CGContextAddLineToPoint(ctx, touchCurrent.x, touchCurrent.y);

        CGContextStrokePath(ctx);
        drawIt=NO;
        touchStart = touchCurrent = (CGPoint) { -1, -1 };
        startIndexCol = startIndexRow = endIndexCol = endIndexRow = -1;
    }

        [[UIColor redColor] setStroke];
        UIBezierPath *path = [UIBezierPath bezierPath];
        [path moveToPoint:touchStart];
        [path addLineToPoint:touchCurrent];
        [path setLineWidth:20.0];
        [path strokeWithBlendMode:kCGBlendModeNormal alpha:0.5];
//        [path stroke];
}
4

1 に答える 1

1

まず、UILabels は良いことよりも多くの問題を引き起こす可能性があります。単純な方眼などは、 で文字を手書きで線を引きながら描いた方がやりやすいdrawRect:と思います。全体の構造は次のようになります。

  • ではtouchesBegan:withEvent:、開始点を ivar に書き留めます。
  • ではtouchesMoved:withEvent:、ivar のエンドポイントを更新して を呼び出します[self setNeedsDisplayInRect:]。2 点で定義された長方形を渡します。
  • ではtouchesEnded:withEvent:、ヒット テストを行い、必要なすべての処理を実行してから、開始点と終了点をクリアして を呼び出します[self setNeedsDisplayInRect:]
    • 「ヒットテストを行う」とは、どの文字がタッチされているかを計算することを意味します。これらをグリッドに配置しているので、これは非常に単純な計算になるはずです。
  • ではdrawRect:、 を使用[NSString drawAtPoint:withFont:]して各文字を描画します。次に、 を使用UIBezierPathして線を描画します ( を使用することもできますがCGPathRef、個人的には UIKit オブジェクトを使用します)。
于 2013-01-03T22:56:08.907 に答える