我有两层。底层由隐藏的UIImageViews组成,上层由可见的UIImageViews组成。他们有标签。当底层UIImageViews的所有帧都等于上层UIImageViews的帧并且标签也匹配时,你必须在NSLog中看到它。问题是当所有标签都不匹配时,我仍然得到NSLog。该方法由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];
}
}
我该如何解决这个问题?
答案 0 :(得分: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];
}
}
}];
}
答案 1 :(得分: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];
}
}
详细了解逻辑条件及其组合方式。如果这不是您想要的,请澄清您的问题。
我还建议您停止使用大写字母启动变量名称。大写起始名称通常是 class 名称。对于Objective-C,大写起始变量名称是一种非常罕见的命名约定,它可能使您的代码更难以为其他程序员阅读。 (但如果您因任何原因愿意这样做,请继续。只要保持一致和连贯)。