iOS: Задача Как получить одно изображение за раз, чтобы светиться, когда палец перетаскивается по каждому из серии изображений

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

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

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

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

Паттерн 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 не будет обновлять альфа-канал для любого последующего изображения, по которому перетаскивается палец, до тех пор, пока касание не будет отпущено и не будет инициировано новое касание.

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

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

Спасибо,


person Dylan Late    schedule 29.11.2011    source источник
comment
Не по теме, вам следует рассмотреть возможность размещения ваших представлений в массиве и повторения/установки значений свойств в индексах. Это облегчит доступ к ним.   -  person quantumpotato    schedule 17.12.2011


Ответы (1)


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

person Christopher Pickslay    schedule 01.12.2011