2

目的: 一連の画像のそれぞれの上で指をドラッグすると、一度に 1 つの画像が光ります。

自分でこれを理解しようとして、タッチされた画像のアルファを 1.00 に更新しようとしましたが、一連の画像の他のすべての画像をアルファ 0.25 に設定し、touchesMoved を介して個々の画像を指でドラッグしますか? ただし、以下の私の方法では、望ましい結果が得られませんでした。

8 つの画像それぞれの Glow オーバーレイのアートワークは、次のパターンを使用して viewDidLoad で作成されます。

-(void)viewDidLoad
{
    Glow *imageOne  = [[Glow alloc] 
                          initWithNibName:@"ImageOne" bundle:[NSBundle mainBundle]];
    self.glowOneView = imageOne;
    [imageOne release];

    [self.glowOneView setTag:101];
    [self.glowOneView setAlpha:0.25];
    [self.glowOneView setCenter:CGPointMake(160,135)];

    [self.view insertSubview:self.glowOneView atIndex:11];
}

(上記のパターンを繰り返して、残りの 8 つのイメージをそれぞれ一意に作成します)。

touchesMoved パターンは次のようになります。

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{    
    NSLog(@"Touches Began");
    UITouch *touch = [touches anyObject];

    if ([touch view] == glowOneView) {


        [glowOneView   setAlpha:1.00];
        [glowTwoView   setAlpha:0.25];
        [glowThreeView setAlpha:0.25];
        [glowFourView  setAlpha:0.25];
        [glowFiveView  setAlpha:0.25];
        [glowSixView   setAlpha:0.25];
        [glowSevenView setAlpha:0.25];
        [glowEightView setAlpha:0.25];

        NSLog(@"Began Button One");
    }

    else if ([touch view] == glowTwoView) {

        [glowOneView   setAlpha:0.25];
        [glowTwoView   setAlpha:1.00];
        [glowThreeView setAlpha:0.25];
        [glowFourView  setAlpha:0.25];
        [glowFiveView  setAlpha:0.25];
        [glowSixView   setAlpha:0.25];
        [glowSevenView setAlpha:0.25];
        [glowEightView setAlpha:0.25];

        NSLog(@"Began Button Two");
    }
...

(上記のパターンを繰り返して、残りの 8 つの画像のそれぞれを一意に処理します)。

上記のコード スニペットは、最初にタッチされた画像を光らせますが、ビュー内をドラッグすると、touchesMoved は、タッチが離されて新しいタッチが開始されるまで、指がドラッグされた後続の画像のアルファを更新しません。

コンソールは、最初にタッチされた画像からの touchesMoved NSLog のみを表示し、指がドラッグされている限り、その後ドラッグしている指の下にある画像に関係なく、最初にタッチされた画像の NSLog を継続的に繰り返します。

一連の画像のそれぞれに指をドラッグすると、一度に 1 つの画像が光るという望ましい結果を生成するために、上記のメソッドを置き換えまたは更新する例と、アドバイスをいただければ幸いです。

ありがとうございました、

4

1 に答える 1

0

私はあなたが説明したものに似たものを実装しました。このコードが Glow ビューを含むビューにあると仮定すると、いくつかのことを行う必要があります: 1) からそれ自体を返すことによってコンテナー ビューにタッチ イベントをインターセプトさせhitTest:withEvent:、2) でtouchesMoved:withEvent:、UIView の実装を呼び出しhitTest:withEvent:てどのビューを把握するかタッチが入っています。

-(UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
    // intercept all touches inside container
    if ([self pointInside:point withEvent:event]) {
        return self;        
    }
    return nil;
}

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
    // figure out which view the touch is in
    UIView *view = [super hitTest:[[touches anyObject] locationInView:self] withEvent:nil];

    // highlight Glow subview under touch
    if ([view isKindOfClass:[Glow class]]) {
        [view setAlpha:1.0];
    }

    // un-highlight all other Glow subviews
    for (UIView *subview in [self subviews]) {
        if (subview != view && [subview isKindOfClass:[Glow class]]) {
            [subview setAlpha:0.25];
        }
    }    
}

touchesBegan:withEvent:おそらく、タッチが動き始める前にビューを強調表示し、すべての強調表示を解除touchesCancelled:withEvent:する実装も必要になるでしょう。touchesEnded:withEvent:

于 2011-12-01T07:41:49.907 に答える