2

目标:当手指在一系列图像中的每一个上拖动时,一次使一个图像发光。

为了自己解决这个问题,我尝试将触摸图像的 Alpha 更新为 1.00,同时将图像系列中的所有其他图像设置为 alpha 0.25,因为手指通过 touchesMoved? 但是我下面的方法没有产生预期的结果。

在 viewDidLoad 中使用以下模式为八个图像中的每一个创建 Glow 叠加图:

-(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];
}

(重复上述模式以独特地创建其余八张图像中的每一张)。

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");
    }
...

(重复上述模式以唯一处理其余八张图像中的每一张)。

上面的代码片段将点亮第一个触摸的图像,但是当您在视图中拖动时,touchesMoved 不会更新手指拖动过的任何后续图像的 alpha,直到释放触摸并启动新的触摸。

控制台仅显示从第一个触摸的图像开始的 touchesMoved NSLog,只要手指被拖动,无论随后哪个图像在拖动的手指下,都会不断重复第一个触摸的图像的 NSLog。

我非常感谢您的建议以及任何替换或更新上述方法的示例,以产生每次获得一个图像发光的预期结果,因为手指在一系列图像中的每一个上拖动。

谢谢,

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 回答