Проверьте, пересекается ли CGRect с массивом CGRect.

Я пытаюсь увидеть, пересекается ли CGRects с любыми другими CGRects в массиве перед инициализацией CGRect, но я еще не нашел надежного метода, который работает.

Обратите внимание, что пересечение — это массив CGRects. Любые идеи о том, как это сделать? Метод ниже не работает, иногда сгенерированный CGRect пересекается с одним в массиве. Я не уверен, что мне не хватает.

for element in intersection {
  while CGRectIntersectsRect(rect1, element) {
    xTemp = CGFloat(arc4random_uniform(UInt32(screenSize.width - buttonWidth1)))
    yTemp = CGFloat(arc4random_uniform(UInt32(screenSize.height - buttonWidth1)))
    rect1 = CGRect(x: xTemp, y: yTemp, width: buttonWidth, height: buttonWidth)
   }
 }

person MJJLAM    schedule 12.01.2016    source источник
comment
Ваш код не имеет смысла. При первом проходе rect1 будет неинициализирован. Откуда берется начальное значение rect1?   -  person Duncan C    schedule 13.01.2016


Ответы (2)


Вы можете использовать CGRectIntersectsRect:

let doesIntersect = arrayOfRects.reduce(false) {
    return $0 || CGRectIntersectsRect($1, testRect)
}

Или (спасибо Martin R за его предложение) вы можете использовать метод contains вместо reduce:

let doesIntersect = arrayOfRects.contains { CGRectIntersectsRect($0, testRect) }
person Cristik    schedule 12.01.2016
comment
Использование contains() вместо reduce() может быть более эффективным, поскольку оно останавливает итерацию при обнаружении пересечения. - person Martin R; 13.01.2016
comment
Хм... это было бы явно эффективнее и читабельнее. Спасибо за предложение. - person Cristik; 13.01.2016
comment
Не знаю почему, но почти всегда reduce приходит мне на ум первым; может быть, у меня слишком много редукторов/преобразователей :P - person Cristik; 13.01.2016

Свифт 3.0:

let rectToCompare: CGRect! // Assign your rect here
for index in 0..<self. arrayOfRects.count {
  let rect = self. arrayOfRects[index]
  if rect.intersects(rectToCompare) {
     // Write your logic here
  }
}

Удачного кодирования...!

person Manivel Nagarajan    schedule 27.10.2016