2015-08-19 2 views
4

Мне удалось остановить мой UIView, выходящий за пределы контейнера, с помощью жесты панорамы, но я изо всех сил пытаюсь остановить его по краям. В настоящее время он подходит к последнему краю пикселя, а не к краю перемещаемого вида.Остановка контейнера UIView с UIPanGesture?

Я попытался изменить значение фрейма, которое, как я думаю, подходит, но не может привести к правильным результатам. Не знаете, насколько близко у меня есть или есть более простой способ?

Как бы я остановил его по краям подвижного вида вместо последнего пикселя? enter image description here

//Container is self.sliderContainer 
//Green Block is sender.view which has a UIGesture applied 

    var location = sender.locationInView(self.view) 

    var newFrame = CGRectMake(0, 0, self.sliderContainer.frame.width, self.sliderContainer.frame.height) 

    let obstacleViewFrame = self.view.convertRect(self.sliderContainer.frame, fromView: self.sliderContainer.superview) 

     // Check if the touch is inside the obstacle view 
     if CGRectContainsPoint(obstacleViewFrame, location) { 

      sender.view!.center.x = sender.view!.center.x + translation.x 

      sender.setTranslation(CGPointZero, inView: self.view) 
     } 
+0

Не могли бы вы добавить лучшее изображение? Что именно движется и где вы хотите его остановить? Какова ваша иерархия взглядов? – Sulthan

+0

Gif и больше кода помогут – Esqarrouth

+0

@Sulthan Я обновил pic для вас – Allreadyhome

ответ

2

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

let movingView = sender.view! 
let minCenterX = movingView.frame.size.width/2 
let maxCenterX = self.sliderContainer.frame.width - movingView.frame.size.width/2 

let newCenterX = movingView.center.x + translation.x 
movingView.center.x = min(maxCenterX, max(minCenterX, newCenterX)) 
+0

Спасибо Султан. Ваше решение также работает. Я немного изменил его, добавив 'sender.setTranslation (CGPointZero, inView: self.view)', поэтому он не двигался слишком быстро. – Allreadyhome

1

Похоже, что вы основываете движение зрения отправителя в слайде на основе координат ощупь и не фрейм sender.view.

let senderViewFrame = self.view.convertRect(sender.view!.frame, fromView: sender.view!.superview) 
let insetSenderViewFrame = CGRectInset(senderViewFrame, 0.0, 10.0 /*or whatever's needed*/) 
let obstacleViewFrame = self.view.convertRect(self.sliderContainer.frame, fromView: self.sliderContainer.superview) 

// Check if the sender view is inside the obstacle view 
if CGRectContainsRect(obstacleViewFrame, insetSenderViewFrame) { 
    sender.view!.center.x = sender.view!.center.x + translation.x 
    sender.setTranslation(CGPointZero, inView: self.view) 
} 
+0

Привет, Джеффри. Это вызывает ошибку 'Невозможно вызывать 'CGRectContainsPoint' со списком аргументов типа '(CGRect, CGRect)', поскольку вторая переменная должна быть CGPoint – Allreadyhome

+0

@Allreadyhome Извините, я сделал это с моей головы. Замените 'CGRectContainsPoint' на' CGRectContainsRect'. Я обновил свой ответ. –

+0

К сожалению, это не позволяет мне перетащить Green UIView после использования этого кода. – Allreadyhome

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