-4

我有两层。底层由隐藏的 UIImageViews 组成,上层由可见的 UIImageViews 组成。他们有标签。当底层 UIImageViews 的所有帧都等于上层 UIImageViews 的帧并且标签也匹配时,您必须在 NSLog 中看到这一点。问题是当所有标签都不匹配时,我仍然得到 NSLog。该方法由 a 调用NSTimer

这是我的代码:

-(void)allPiecesCorrectPos {

        __block BOOL equal = YES;
        [arrayImg enumerateObjectsUsingBlock:^(UIImageView *ImageView1, NSUInteger idx, BOOL *stop) {
            UIImageView *ImageView2 = HiddenFieldView[idx];
            if (CGRectIntersectsRect(ImageView1.frame, ImageView2.frame) && ImageView1.tag != ImageView2.tag) {

                equal = NO;
                *stop = YES;
            }
        }];
        if (equal) {
            NSLog(@"ALL THE FRAMES ARE EQUAL");
            [AllPosCorrectTimer invalidate];

        }
    }

我该如何解决这个问题?

4

2 回答 2

0

像这样尝试,这里每次相等的值都是 YES 因为你的 if 块在块执行完成之前执行,在这种情况下你需要注意块执行。

-(void)allPiecesCorrectPos {

        __block BOOL equal = YES;
        [arrayImg enumerateObjectsUsingBlock:^(UIImageView *ImageView1, NSUInteger idx, BOOL *stop) {
            UIImageView *ImageView2 = HiddenFieldView[idx];
            if (CGRectIntersectsRect(ImageView1.frame, ImageView2.frame) && ImageView1.tag != ImageView2.tag) {

                equal = NO;
                *stop = YES;
            if (equal) {
            NSLog(@"ALL THE FRAMES ARE EQUAL");
            [AllPosCorrectTimer invalidate];

            }
            }
        }];

    }
于 2013-07-22T09:54:25.203 回答
0

您的代码没有按照您在文本中所说的去做。您正在测试 UIImageView 框架的交叉点而不是相等性。试试这个(我冒昧地重命名了一些方法和变量以便于阅读):

-(void)visiblePiecesEquivalentToHiddenPieces
{
    __block BOOL correspondingPiecesEquivalent = YES;
    [imageArray enumerateObjectsUsingBlock:
        ^(UIImageView *imageView1, NSUInteger index, BOOL *stop)
        {
            UIImageView *imageView2 = hiddenFieldView[index];
            if ( !CGRectEqualToRect(imageView1.frame, imageView2.frame)
                 || imageView1.tag != mageView2.tag )
            {    
                correspondingPiecesEquivalent = NO;
                *stop = YES;
            }
        }
    ];
    if (correspondingPiecesEquivalent)
    {
        NSLog(@"Frames and tags are equal for corresponding views.");
        [pieceCorrespondenceTimer invalidate];

    }
}

阅读有关逻辑条件及其组合方式的更多信息。如果这不是您想要的,请澄清您的问题。

我还建议您停止以大写字母开头的变量名。大写开头的名称是最常见的名。以大写开头的变量名对于 Objective-C 来说是一种非常不常见的命名约定,它会使您的代码更难被其他程序员阅读。(但如果您出于某种原因更愿意这样做,请继续。只要保持一致和连贯)。

于 2013-07-22T11:18:52.407 回答