2016-01-12 3 views
1

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

Обратите внимание, что пересечение представляет собой массив CGRect s. Кто-нибудь берется за это? Метод ниже не работает, иногда сгенерированный 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) 
    } 
} 
+2

Ваш код не имеет смысла. Первый проход через rect1 будет неинициализирован. Откуда начинается исходное значение rect1? –

ответ

6

Вы могли бы использовать CGRectIntersectsRect:

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

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

let doesIntersect = arrayOfRects.contains { CGRectIntersectsRect($0, testRect) } 
+4

Использование contains() вместо функции reduce() может быть более эффективным, так как оно останавливает итерацию после обнаружения пересечения. –

+0

Хм ... это было бы явно более эффективным и более читаемым. Спасибо за предложение. – Cristik

+0

Я не знаю, почему, но почти всегда «уменьшайся» сначала в голову; возможно, у меня есть слишком много редукторов/преобразователей: P – Cristik

1

Swift 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 
    } 
} 

Happy Coding ...!

Смежные вопросы