Почему CGRectContainsPoint вызывает ошибку при определении перекрытия между двумя представлениями?

Хорошо. Я новичок в target-c, и я пытаюсь обнаружить два перекрывающихся представления. Первоначально я использовал CGRectContainsRect (который работал отлично), но заметил, что это вызывает true, даже если представления едва перекрываются. Однако, поскольку представления небольшие, я хочу, чтобы условие было истинным только в том случае, если они сильно перекрываются. Итак, я пытаюсь использовать вместо этого CGRectContainsPoint, где точка, которую я проверяю, является центром второго вида.

Внесение этого изменения вызывает у меня некоторые проблемы. Вот весь мой оператор if (хотя я изолировал проблему в части CGRectContainsPoint:

NSDictionary *dictInQ = masterDict[n];
UIView *overlapV = dictInQ[@"view"];
NSNumber *overlapB = dictInQ[@"hiddenBool"];
//if it's not itself and they intersect and they are in the same column and both views are not hidden
if (overlapV != colorV && CGRectContainsPoint([overlapV frame], CGPointMake(colorV.center.x, colorV.center.y)) && startLocation == overlapV.frame.origin.x && [colorB intValue]!=1 && [overlapB intValue]!=1)

Первоначально, когда я использовал CGRectContainsRect, я использовал [overlapV frame] и [colorV frame]. Теперь я пытаюсь использовать представление overlapV и проверить, содержит ли оно центр представления colorV. Я пытался заменить CGPointMake(colorV.center.x, colorV.center.y) на colorV.center безрезультатно, и я прочитал документацию по CGRectContainsPoint и CGPointMake и рассматривал подобные вопросы.

Что меня действительно озадачивает, так это то, что в этой строке оператора if нет ошибки. Он компилируется нормально, и когда CGRectContainsPoint должен оценивать true из симулятора, ошибка Xcode указывает на первую строку, выполняемую в операторе if (хотя эта строка также не вызывает проблем; я попытался закомментировать ее, и она просто вызывает вместо этого ошибка на следующей строке). Любые мысли о том, что может быть причиной этого?

Обновление: вот скриншот представлений, когда они перекрываются достаточно, чтобы CGRectContainsPoint правильно оценивал значение true (проблема в том, что это также вызывает ошибку в следующей строке).

Обновление: вот скриншот представлений, когда они перекрываются достаточно, чтобы CGRectContainsPoint правильно оценивал значение true (проблема в том, что  это также вызывает ошибку в следующей строке).

Обновление: Чтобы уточнить, точка останова всегда возникает в любой строке, вызываемой сразу после прохождения CGRectContainsPoint (независимо от того, что я изменяю в строке). Например, в моем последнем тесте точка останова выделила строку NSLog(@"start"); и сказала Thread 1: breakpoint 2.1,, но вывод не выводился на консоль, как обычное сообщение об ошибке.

Большое обновление: теперь, к моему удивлению, изменение CGRectContainsPoint обратно на исходное, работающее, CGRectContainsRece([overlapV frame], [colorV frame]) теперь не работает. Однако разница в том, что программа не прерывается, когда она должна вычисляться как True; он просто продолжает работать, как будто оператор if никогда не должен был вызываться.


person zch    schedule 26.07.2013    source источник
comment
Что вы имеете в виду под проблемой, что это также вызывает ошибку в следующей строке?   -  person lnafziger    schedule 26.07.2013
comment
Вы рисуете круги? Или это образы?   -  person uchuugaka    schedule 26.07.2013
comment
покажи свои точки останова   -  person Kreiri    schedule 26.07.2013
comment
@lnafziger Xcode показывает, что точкой останова является любая строка target-c, которая появляется сразу после того, как проверка CGRectContainsPoint возвращает значение true. На снимке экрана в моем ответе точка останова указывает на ```NSLog(@start);`` (в чем нет ничего плохого).   -  person zch    schedule 26.07.2013
comment
@uchuugaka круги рисуются из представлений. Я использую view.layer.cornerRadius = 20.0; для каждого представления. И я обновил свой ответ, включив в него точки останова.   -  person zch    schedule 26.07.2013


Ответы (1)


РЕДАКТИРОВАТЬ
Я думаю, что ранее я упустил основную мысль вашего вопроса. Точка останова — это не ошибка, а просто способ приостановить выполнение программы, чтобы вы могли посмотреть на память и пройти программу построчно. Чтобы избавиться от него, просто щелкните символ точки останова слева от строки кода, в которой он есть:

введите здесь описание изображения

Или вы можете нажать кнопку «Продолжить выполнение программы» внизу:

введите здесь описание изображения

ИСХОДНЫЙ ОТВЕТ:
Чтобы упростить отладку, я бы предложил переписать оператор if следующим образом:

if (overlapV != colorV)
{
    // CGPointMake is not required here because a view's center is already a CGPoint.
    // Note that it won't cause a problem, it just isn't needed.
    if (CGRectContainsPoint([overlapV frame], colorV.center))
    {
        if (startLocation == overlapV.frame.origin.x)
        {
            if ([colorB intValue] != 1)
            {
                if ([overlapB intValue] != 1)
                {
                    // All are true
                }
            }
        }
    }
}

Теперь вы можете пройти по одной строке за раз и точно увидеть, какая строка является проблемой. Хотя CGRectContainsPoint выглядит правильно. Если окажется, что это действительно проблема, опубликуйте изображение того, как выглядят представления, когда это должно возвращать значение true.

person lnafziger    schedule 26.07.2013
comment
Спасибо за ответ. Я расширил оператор if, как вы продемонстрировали, и точка останова снова указывала на любую строку, следующую за проверкой CGRectCointainsPoint (я изменил эту строку на просто NSLog(@"start");, и она по-прежнему была точкой останова). Однако эта проверка явно работает; когда виды не перекрываются достаточно для того, чтобы один центр пересекал другой вид, проблем нет, и sim продолжает работать, как и ожидалось. Я обновил свой пост, добавив фотографию пересекающихся представлений, когда утверждение правильно оценивается как истинное, но вызывает ошибку. - person zch; 26.07.2013
comment
Спасибо за обновление. Это, действительно, сработало! Теперь я не понимаю, почему CGRectContainsRect больше не работает, но если J не сможет найти решение своими силами, я открою новый вопрос. - person zch; 27.07.2013