Хорошо. Я новичок в 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
(независимо от того, что я изменяю в строке). Например, в моем последнем тесте точка останова выделила строку NSLog(@"start");
и сказала Thread 1: breakpoint 2.1,
, но вывод не выводился на консоль, как обычное сообщение об ошибке.
Большое обновление: теперь, к моему удивлению, изменение CGRectContainsPoint обратно на исходное, работающее, CGRectContainsRece([overlapV frame], [colorV frame])
теперь не работает. Однако разница в том, что программа не прерывается, когда она должна вычисляться как True
; он просто продолжает работать, как будто оператор if никогда не должен был вызываться.
CGRectContainsPoint
возвращает значение true. На снимке экрана в моем ответе точка останова указывает на ```NSLog(@start);`` (в чем нет ничего плохого). - person zch   schedule 26.07.2013view.layer.cornerRadius = 20.0;
для каждого представления. И я обновил свой ответ, включив в него точки останова. - person zch   schedule 26.07.2013