iOS: цель, как получить одно изображение за раз, когда палец перетаскивается на каждую серию изображений - PullRequest
2 голосов
/ 29 ноября 2011

Цель: получить по одному изображению за раз, когда палец перетаскивается по каждой серии изображений.

Пытаясь выяснить это самостоятельно, я попытался обновить Альфа изображения, к которому прикоснулись, до 1,00, в то время как для всех остальных в серии изображений было установлено значение альфа 0,25, когда палец перемещался по каждому отдельному изображению с помощью функции touchsMoved? Однако приведенные ниже методы не дали желаемого результата.

Рисунок для наложения 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];
}

(повторение вышеуказанного шаблона для уникального создания каждого из оставшихся восьми изображений).

штрихиMoved шаблон выглядит так:

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

(повторение вышеуказанного шаблона для уникальной обработки каждого из оставшихся восьми изображений).

Приведенные выше фрагменты кода будут светиться при первом прикосновении к изображению, но при перетаскивании касаний вида «Перетаскивание» не будет обновлять альфа для любого последующего изображения, на которое перетаскивается палец, до тех пор, пока касание не будет снято и не будет инициировано новое касание.

Консоль отображает NSLog touchesMoved из первого касанного изображения и непрерывно повторяет NSLog для первого касанного изображения до тех пор, пока палец перетаскивается, независимо от того, какое изображение впоследствии находится под перетаскиваемым пальцем.

Буду очень признателен за ваш совет и за любой пример, который заменяет или обновляет вышеупомянутые методы, чтобы получить желаемый результат получения одного изображения за раз, когда палец перетаскивается по каждой из серий изображений.

Спасибо,

1 Ответ

0 голосов
/ 01 декабря 2011

Я реализовал нечто похожее на то, что вы описываете. Предполагая, что этот код находится в представлении, содержащем ваши представления 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:, чтобы отменить выделение всех.

...