2012-05-16 2 views
4

У меня есть несколько UIImageView's в пределах UIView. Эти UIImageViews были преобразованы.Проверка на перекрывающиеся виды после преобразования

Когда жест применяется к любому из UIImageView's, перекрывающиеся изображения должны перемещаться таким образом, чтобы перемещение за рамкой UIImageView's и мы получили полное представление об изображении (все это будет сделано в анимационный способ).

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

Сейчас я пользуюсь CGRectIntersectsRect, но это не дает мне желаемого эффекта.

ответ

3

После многого, наконец, я добился желаемого результата с помощью этого алгоритма.

  • Я вычислил список перекрывающихся UIImageView's и сохранил его в массиве. Я использую для этого CGRectIntersectsRect.

    Примечание. Это также будет включать в себя UIImageView, на котором был применен жест (например, целевой ImageView).

  • Для каждого из этих перекрывающей UIImageView, я выполнить следующие шаги:

    1) Вычислить угол между перекрытием ImageView и целевыми ImageView. Это даст мне направление для перемещения Overlapping ImageView.

    2) Теперь сдвиньте перекрывающийся ImageView на некоторое постоянное расстояние (например, len), чтобы он поддерживал тот же угол. Направление должно быть таким, чтобы оно удалялось от целевого ImageView.

    3) Вы можете рассчитать новые координаты x, y, используя функции Sin/Cos.

    x = начальный_x + len * cos (угол);
    y = start_y + len * sin (угол);

    ПРИМЕЧАНИЕ. Для ImageViews, центр которого меньше целевого центра ImageView, вам нужно будет вычесть значение.

    4) Теперь переместите перекрывающийся ImageView в новый расчетный центр.

    5) Продолжайте перемещать его, пока точки не пересекаются.

  • Я прикрепляю код. Я надеюсь, что это помогает.

    - (Недействительными) moveImage: (UIImageView *) viewToMove fromView: (UIImageView *) imageToSendBack
    {

     CGFloat angle = angleBetweenLines(viewToMove.center, imageToSendBack.center); 
    
         CGFloat extraSpace = 50; 
    
         CGRect oldBounds = viewToMove.bounds; 
         CGPoint oldCenter = viewToMove.center; 
    
         CGPoint shiftedCenter; 
    
         while(CGRectIntersectsRect(viewToMove.frame,imageToSendBack.frame)) 
         { 
          CGPoint startPoint = viewToMove.center; 
    
          shiftedCenter.x = startPoint.x - (extraSpace * cos(angle)); 
    
          if(imageToSendBack.center.y < viewToMove.center.y) 
           shiftedCenter.y = startPoint.y + extraSpace * sin(angle); 
          else 
           shiftedCenter.y = startPoint.y - extraSpace * sin(angle); 
    
    
          viewToMove.center = shiftedCenter; 
    
         } 
         viewToMove.bounds = oldBounds; 
         viewToMove.center = oldCenter; 
    
         [self moveImageAnimationBegin:viewToMove toNewCenter:shiftedCenter]; 
        } 
    
0

Я не пробовал это, но я хотел бы сделать это следующим образом:

После получения BOOL из CGRectIntersectsRect, умножьте это перекрытие UIImageView х и у по ширине и высоте его.

И поскольку вы не можете использовать свойство кадра после изменения преобразования, вам нужно будет умножить ширину и высоту на 1,5 для максимального количества вращения.

Предупреждения: Если преобразование свойство не является преобразованием личности, значение этого свойства не определенно и, следовательно, должно быть проигнорировано.

Это может привести к тому, что какой-либо отец будет отодвинут, чем другие, но вы убедитесь, что все виды будут перемещены за рамку UIImageView.

Если вы попробуете, и это не сработает, отправьте код, и я помогу вам с ним.

РЕДАКТИРОВАТЬ: Для представлений, что их x, y меньше, чем у вашего UIImageView x, y, вам нужно будет вычесть смещение.

+0

Благодаря @iBasel. Я не пытаюсь это сделать, но даже это должно работать, кажется. Я достиг результата, используя другой алгоритм. Отправьте его ниже, а также код. –

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