Выполняет ли почти одно и то же действие (для разных изображений) для «сенсорного» события? - PullRequest
1 голос
/ 03 апреля 2012

Я надеюсь, что есть лучший способ сделать следующее. Я создаю приложение типа Jigsaw, и это текущий код, который я использую:

-(void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
UITouch *touch = [touches anyObject];
//location of current touch
CGPoint location = [touch locationInView:self.view];
if ([touch view] == img1) {
    [self animateFirstTouch:img1 withLocation:location];
} else if ([touch view] == img2) {
    [self animateFirstTouch:img2 withLocation:location];
} else if ([touch view] == img3) {
    [self animateFirstTouch:img3 withLocation:location];
} else if ([touch view] == img4) {
    [self animateFirstTouch:img4 withLocation:location];
} else if {
......
......
} else if ([touch view] == img40) {
    [self animateFirstTouch:img40 withLocation:location];
    return;
}
}

Я надеюсь, что есть лучший, более эффективный способ сделать это, вместо того, чтобы называть каждое изображение. Я думаю, что-то вроде, если сенсорный вид равен UIImageView, а затем выполнить некоторую задачу. То же самое для прикосновений закруглено:

-(void) touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
UITouch *touch = [touches anyObject];
//location of current touch
CGPoint location = [touch locationInView:self.view];
if ([touch view] == image1) {
    [self animateReleaseTouch:image1 withLocation:location];
} else if ([touch view] == image2) {
    [self animateReleaseTouch:image2 withLocation:location];
} else if ([touch view] == image3) {
    [self animateReleaseTouch:image3 withLocation:location];
} else if ([touch view] == image4) {
    [self animateReleaseTouch:image4 withLocation:location];
} else if{
......
......
} else if ([touch view] == image40) {
    [self animateReleaseTouch:image40 withLocation:location];
}
    return;
}

Любая помощь, пожалуйста?

Ответы [ 5 ]

6 голосов
/ 03 апреля 2012

Подождите, пока вы тестируете, чтобы узнать, равен ли [touch view] конкретному представлению, так что вы можете передать это конкретное представление этому другому методу?Если так, то не имеет значения, какой он был, и имеет значение только тот, к которому он прикоснулся.

Так что вместо этого:

if ([touch view] == image1) {
    [self animateReleaseTouch:image1 withLocation:location];
} else if ([touch view] == image2) {
    [self animateReleaseTouch:image2 withLocation:location];
} else if ([touch view] == image3) {
    [self animateReleaseTouch:image3 withLocation:location];
}

Вам нужно только это:

[self animateReleaseTouch:[touch view] withLocation:location];

Или, если вы хотите убедиться, что вы можете делать это только с вашими изображениями для ваших кусочков, вставьте их в массив и убедитесь, что это представление включено в этот массив.

// do this during setup somewhere
NSArray *imageViews = [NSArray arrayWithObjects:image1, image2, ..., nil];

// do this on touch
UIView *touchedView = [touch view];
if ([imageViews indexOfObject:touchedView] != NSNotFound) {
    // not not found means found!
    [self animateReleaseTouch:touchedView withLocation:location];
}

99,99% процентов времени, когда у вас есть тонна последовательно именованных переменных, вы делаете это неправильно.Вместо этого вы действительно хотите массив.

1 голос
/ 03 апреля 2012

Если вы хотите убедиться, что анимированы только UIImageViews (следовательно, почему вы не просто используете [touch view])

Тогда сделайте это:

-(void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event;
{
    UITouch *touch = [touches anyObject];
    //location of current touch
    CGPoint location = [touch locationInView:self.view];
    if ([[touch view] isKindOfClass:[UIImageView class]]) {
        [self animateFirstTouch:[touch view] withLocation:location];
    }
}

Так что, если касаемое представление не является UIImageView, оно не будет анимировано.

Обратите внимание, что isKindOfClass вернет yes, если получатель (т.е. [touch view]) является подклассом UIImageView.

Если вы хотите, чтобы это утверждение было истинным, только когда оно является именно UIImageView, и поэтому возвращаете false, если это подкласс UIImageView, используйте isMemberOfClass: вместо isKindOfClass:

Также стоит указать, что если у вас есть другой UIImageView в родительском представлении, кроме img1 ... img40, то это не тот ответ, который вы ищете. Это ответ, если вы хотите, чтобы animateFirstTouch:withLocation: вызывался для любого UIImageView в родительском представлении.

1 голос
/ 03 апреля 2012

Я немного озадачен тем, чего вы пытаетесь достичь

-(void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event;
{
    UITouch *touch = [touches anyObject];
    //location of current touch
    CGPoint location = [touch locationInView:self.view];
    if ([touch view] == img1) {
        [self animateFirstTouch:img1 withLocation:location];
    } else if ([touch view] == img2) {
        [self animateFirstTouch:img2 withLocation:location];
    } else if ([touch view] == img3) {
        [self animateFirstTouch:img3 withLocation:location];
    } else if ([touch view] == img4) {
        [self animateFirstTouch:img4 withLocation:location];
    } else if {
        ......
        ......
    } else if ([touch view] == img40) {
        [self animateFirstTouch:img40 withLocation:location];
        return;
    }
}

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

-(void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event;
{
    UITouch *touch = [touches anyObject];
    //location of current touch
    CGPoint location = [touch locationInView:self.view];

    [self animateFirstTouch:[touch view] withLocation:location];
}
0 голосов
/ 03 апреля 2012

Я бы попробовал ответить на вышеперечисленные вопросы:

if ([touch view] == image1) {
    [self animateReleaseTouch:image1 withLocation:location];
} else if ([touch view] == image2) {
    [self animateReleaseTouch:image2 withLocation:location];
} else if ([touch view] == image3) {
    [self animateReleaseTouch:image3 withLocation:location];
} else if ([touch view] == image4) {
    [self animateReleaseTouch:image4 withLocation:location];
} else if{
......
......

Это просто длинная версия:

[self animateReleaseTouch:[touch view] withLocation:location];

Однако я бы пошел дальше этого и предположил, что вы, возможно, избегаете очевидного вывода о том, что то, что вы приняли, не является достаточно объектно-ориентированным проектом. Вероятно, вы захотите передать ответственность за эти анимации самим представлениям и заставить их реализовывать соответствующие захваты для touchesBegan: и т. Д. Тогда вступят в силу встроенные механизмы распространения событий.

Прецедентом могут быть такие вещи, как UIButton, UISlider и т. Д. Все они реагируют на прикосновения напрямую и внутренне, обновляя свой дисплей соответствующим образом. Скорее всего, вы хотите создать собственный подкласс UIView.

0 голосов
/ 03 апреля 2012

Подождите, если вы всегда анимируете представление, для которого предназначено касание, то почему бы просто не сделать это?

[self animateFirstTouch:[touch view] withLocation:location];
... 
[self animateReleaseTouch:[touch view] withLocation:location];
...