【问题标题】:How do you check if a UIImageView in an NSMutableDictionary Intersects with another UIImageView in same NSMutableDictionary?如何检查 NSMutableDictionary 中的 UIImageView 是否与同一 NSMutableDictionary 中的另一个 UIImageView 相交?
【发布时间】:2011-09-09 23:56:19
【问题描述】:

对于存储在 NSMutableDictionary 中的每个字母表,我有 5 个 UIImageView。 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

即使字典中没有任何 UIImageView 相交,也会发生此输出。它实际上发生在平移然后放下第一个字母拼贴之后,甚至在拾取第二个拼贴以使其与放下时相交。我不知道为什么。我的锅:代码如下。

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);

            }
        }

        }
    }

}

谢谢!

【问题讨论】:

    标签: ios ipad drag-and-drop uiimageview nsmutabledictionary


    【解决方案1】:

    您将每个字母添加 5 个UIImageViews 到您的NSDictionary。字母的所有视图在同一位置具有相同的尺寸。 IE。所有A 视图在同一位置的大小相同。因此,当您循环检查交叉点的字典时,您会看到比预期更多的交叉点是有道理的。

    也许对您来说更有意义的是将问题陈述从 查看其中一个字母是否与同一字典中的另一个字母相交查看移动的字母是否与另一个相交活动字母。

    您可以通过在它们第一次移动时将它们添加到NSArray 来跟踪它们。也许您还想将每个字母的顶视图指定为 active 视图。然后,当您检查交叉路口时,您只检查您的 活动 字母。

    【讨论】:

    • 谢谢!这很有意义。阅读您的答案时绝对是一个“duh”时刻。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-16
    • 1970-01-01
    • 2016-04-03
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多