Обнаружение, пересекает ли UIView другие UIViews - PullRequest
4 голосов
/ 09 сентября 2011

У меня есть куча UIViews на экране.Я хотел бы знать, как лучше всего проверить, является ли конкретный вид (на который я имею в виду) пересечением ЛЮБЫХ других видов.Я делаю это прямо сейчас, перебирая все подпредставления и проверяя одно за другим, есть ли пересечение между кадрами.

Это не очень эффективно.Есть ли лучший способ сделать это?

Ответы [ 4 ]

35 голосов
/ 10 сентября 2011

Существует функция с именем CGRectIntersectsRect, которая получает два CGRect в качестве аргументов и возвращает, если два заданных участка действительно пересекаются.И UIView имеет свойство subviews, которое является NSArray объектов UIView.Таким образом, вы можете написать метод с возвращаемым значением BOOL, который будет перебирать этот массив и проверять, пересекаются ли два прямоугольника, например:

- (BOOL)viewIntersectsWithAnotherView:(UIView*)selectedView {

    NSArray *subViewsInView = [self.view subviews];// I assume self is a subclass
                                       // of UIViewController but the view can be
                                       //any UIView that'd act as a container 
                                       //for all other views.

     for(UIView *theView in subViewsInView) {

       if (![selectedView isEqual:theView])
           if(CGRectIntersectsRect(selectedView.frame, theView.frame))  
              return YES;
    }

  return NO;
}
3 голосов
/ 04 января 2016

Для достижения того же самого в быстром соответствии с принятым ответом, вот функция. Готовый код. Просто скопируйте и используйте его в соответствии с шагами. Кстати, я использую Xcode 7.2 с Swift 2.1.1.

func checkViewIsInterSecting(viewToCheck: UIView) -> Bool{
    let allSubViews = self.view!.subviews //Creating an array of all the subviews present in the superview.
    for viewS in allSubViews{ //Running the loop through the subviews array
        if (!(viewToCheck .isEqual(viewS))){ //Checking the view is equal to view to check or not
            if(CGRectIntersectsRect(viewToCheck.frame, viewS.frame)){ //Checking the view is intersecting with other or not
                return true //If intersected then return true
            }
        }  
    }
    return false //If not intersected then return false
}

Теперь вызовите эту функцию согласно следующему -

let viewInterSected = self.checkViewIsInterSecting(newTwoPersonTable) //It will give the bool value as true/false. Now use this as per your need

Спасибо.

Надеюсь, это помогло.

0 голосов
/ 06 сентября 2018

В моем случае представления были вложенными, поэтому я сделал это (работает как с вложенными, так и без):

extension UIView {
    func overlaps(other view: UIView, in viewController: UIViewController) -> Bool {
        let frame = self.convert(self.bounds, to: viewController.view)
        let otherFrame = view.convert(view.bounds, to: viewController.view)
        return frame.intersects(otherFrame)
    }
}

Надеюсь, это поможет.

0 голосов
/ 09 сентября 2011

Сначала создайте некоторый массив, в котором будут храниться кадры всех ваших UIViews и связанные с ними ссылки.

Затем, потенциально в фоновом потоке, вы можете запустить некоторое тестирование столкновений, используя содержимое массива.Для некоторого простого тестирования столкновения только для прямоугольников, проверьте этот вопрос SO: Простой алгоритм столкновения для прямоугольников

Надеюсь, что помогает!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...