Как проверить, пересекается ли UIImageView в NSMutableDictionary с другим UIImageView в том же NSMutableDictionary? - PullRequest
0 голосов
/ 10 сентября 2011

У меня есть 5 UIImageViews для каждой буквы алфавита, хранящейся в NSMutableDictionary. 5 вместо 1, на случай, если слово, которое они хотят записать, требует больше одной и той же буквы.

Я создаю буквы вот так ... http://pastie.org/2510574

for (int i = 1; i <= 5; i++)
    {
        char a = 'a';
        NSString *key = [NSString stringWithFormat:@"%c%d", a, i];
        alphabetVowelA = [[UIImageView alloc] initWithFrame:CGRectMake(39, 104, 70, 70)];
        [alphabetVowelA setImage:[UIImage imageNamed:@"a.png"]];
        alphabetVowelA.tag = i;
        [alphabetVowelA setUserInteractionEnabled:YES];
        [self addGestureRecognizersToPiece:alphabetVowelA];
        [letterDictionary setObject:alphabetVowelA forKey:key];
        [self.view addSubview:alphabetVowelA];
        [alphabetVowelA release];
    }

    for (int i = 1; i <= 5; i++)
    {
        char b = 'b';
        NSString *key = [NSString stringWithFormat:@"%c%d", b, i];
        alphabetB = [[UIImageView alloc] initWithFrame:CGRectMake(112, 104, 70, 70)];
        [alphabetB setImage:[UIImage imageNamed:@"b.png"]];
        alphabetB.tag = i;
        [alphabetB setUserInteractionEnabled:YES];
        [self addGestureRecognizersToPiece:alphabetB];
        [letterDictionary setObject:alphabetB forKey:key];
        [self.view addSubview:alphabetB];
        [alphabetB release];
    }

С помощью приведенного ниже кода я пытаюсь проверить, пересекается ли одна из букв с другой из того же словаря. Однако, с моим кодом, когда я перемещаю / перетаскиваю одну из буквенных плиток, а затем опускаю ее, он печатает сообщение NSLog для каждого ключа в словаре. Вот пример его вывода.

http://pastie.org/2511092

Этот вывод происходит, даже если ни один из UIImageViews в словаре не пересекался. Это на самом деле происходит после панорамирования, а затем сбрасывания первой буквы, прежде чем даже взять вторую, чтобы она пересекалась при падении. Я не могу понять, почему. Моя кастрюля: код ниже.

http://pastie.org/2511054

- (void)panPiece:(UIPanGestureRecognizer *)gestureRecognizer
{
    UIView *piece = [gestureRecognizer view];
    [self.view bringSubviewToFront:piece];


    if ([gestureRecognizer state] == UIGestureRecognizerStateBegan || [gestureRecognizer state] == UIGestureRecognizerStateChanged) {

        CGPoint translation = [gestureRecognizer translationInView:[piece superview]];

        CGRect startingPointFrame = CGRectMake(245, 428, 31, 20);
        [startingPoint setFrame:startingPointFrame];

        [piece setCenter:CGPointMake([piece center].x + translation.x, [piece center].y + translation.y)];
        [gestureRecognizer setTranslation:CGPointZero inView:[piece superview]];
    }


    if ([gestureRecognizer state] == UIGestureRecognizerStateEnded)
    {

        NSArray *keys = [letterDictionary allKeys];

        int nKey = [keys count]; 
        for(int k1 = 0; k1 < nKey; ++ k1) { for(int k2 = k1 + 1; k2 < nKey; ++ k2)  { 
            if ( CGRectIntersectsRect( ((UIImageView*) [letterDictionary objectForKey:[keys objectAtIndex:k1]]).frame,  ((UIImageView*) [letterDictionary objectForKey:[keys objectAtIndex:k2]]).frame ) ) { 

                NSLog(@"k1: %i k2: %i",k1,k2);

            }
        }

        }
    }

}

Спасибо!

1 Ответ

1 голос
/ 17 сентября 2011

Вы добавляете 5 UIImageViews за письмо к вашему NSDictionary.Все виды письма имеют одинаковое измерение в одном месте.то есть.все A представления имеют одинаковый размер в одном и том же месте.Поэтому, когда вы зацикливаете словарь, проверяя наличие пересечений, имеет смысл, что вы увидите намного больше пересечений, чем ожидаете.

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

Вы можете отслеживать активные буквы, добавляя их вNSArray при первом перемещении.Возможно, вы также захотите назначить вид сверху для каждой буквы активный вид.Затем, когда вы проверяете пересечения, вы проверяете только свои активные буквы.

...