2016-05-27 2 views
1

предположим, что у нас есть UITableViewCell с внутренним большим пользовательским UIImageView, как на изображении ниже: Я добавил UILongPressGestureRecOgnizer в UITableViewCell, поэтому после того, как пользователь longPress может переместить это большое изображение. но я хочу, чтобы это движение было в пределах UITableViewCell. enter image description hereОграничить перетаскиваемый UIView до границ SuperView

Что я сделал прямо сейчас:

UIView *view = sender.view; 
CGPoint point = [sender locationInView:view.superview]; 
if (sender.state == UIGestureRecognizerStateChanged) 
{ 
    CGPoint oldCenter = view.center; 
    CGPoint newCenter = oldCenter; 
    CGFloat deltaX = point.x - _priorPoint.x; 
    CGFloat deltaY = point.y - _priorPoint.y; 
    newCenter.x += deltaX; 
    newCenter.y += deltaY; 
    CGRect oldFrame = view.frame; 
    CGRect newFrame = CGRectMake(oldFrame.origin.x + deltaX, oldFrame.origin.y+deltaY, view.width, view.height); 

    if (CGRectContainsRect(newFrame, self.bounds)) { 
     self.customImageView.center = newCenter; 
    } 
    else 
    { 
     CGFloat newX = newFrame.origin.x; 
     CGFloat newY = newFrame.origin.y; 
     if (newX<view.x) { 
      newX = oldFrame.origin.x; 
     } 
     else if ((newFrame.origin.x + newFrame.size.width)>view.right) 
     { 
      newX = oldFrame.origin.x; 
     } 

     if (newY<view.y) { 
      newY = oldFrame.origin.y; 
     } 
     else if ((newY + newFrame.size.height)>view.bottom) 
     { 
      newY = view.y; 
     } 
     NSLog(@"newX:%f, newY:%f", newX, newY); 
     newFrame = CGRectMake(newX, newY, view.width, view.height); 
     self.customImageView.frame = newFrame; 
    } 
_priorPoint = point; 

проблема, когда я пошевелить пальцем по диагонали, движение изображение немного рывками. при перемещении по диагонали, например, когда X выходит за пределы, если Y действительно, Y пункт должен быть обновлен. что здесь не так? у тебя есть идеи?

+1

Почему вы не используете прокрутку с содержимым изображения? Вы можете включать и отключать прокрутку с помощью долгого распознавателя. Вы также должны разрешать одновременное распознавание жестов. – fabe

ответ

2

Что я могу сделать для этого немного трудно следовать, но здесь идет ...

я сенсорное взаимодействие внутри зрения, что двигается. В touchesBegan

drawingFrame = self.frame; 
initialViewOrigin = self.frame.origin; 
startingTouch = [[touches anyObject] locationInView:[self superview]]; 

Это все переменные класса. Тогда в touchesMoved:

lastTouchPoint = [[touches anyObject] locationInView:[self superview]]; 
float newLocationX = initialViewOrigin.x + (p.x - startingTouch.x); 
float newLocationY = initialViewOrigin.y + (p.y - startingTouch.y); 

//Do some location checks for sending it too far off the screen or whatnot 

drawingFrame.origin = [self scrollLimit:newLocationX y:newLocationY]; 

CGRect frame = self.frame; 
frame.origin.x = drawingFrame.origin.x; 
frame.origin.y = drawingFrame.origin.y; 
self.frame = frame; 

Все самое интересное вещество происходит в scrollLimit функции:

-(CGPoint)scrollLimit:(float)x1 y:(float)y1 
{ 
    //My app always requires landscape, so make sure the parent's sizes are taken accordingly 
    int parentHeight = MIN(self.superview.frame.size.width,self.superview.frame.size.height); 
    int parentWidth = MAX(self.superview.frame.size.width,self.superview.frame.size.height); 

    if(self.frame.size.width < parentWidth) 
    { 
     if(x1 < 1) 
     { 
      x1 = 1; 
     } 
     else if(x1 >= parentWidth - self.frame.size.width) 
     { 
      x1 = parentWidth - self.frame.size.width; 
     } 
    } 
    else{ 
     x1 = initialViewOrigin.x; 
    } 


    if(self.frame.size.height < parentHeight) 
    { 
     if(y1 < 1) 
     { 
      y1 = 1; 
     } 
     else if(y1 > parentHeight - self.frame.size.height) 
     { 
      y1 = parentHeight - self.frame.size.height; 
     } 
    } 
    else{ 
     y1 = initialViewOrigin.y; 
    } 

    return CGPointMake(x1,y1); 

} 

Все это гарантирует, что вид находится внутри границ, которые вы установили (в моем случае только SuperView), а также делает процесс перетаскивания гладким и реалистичным. Некоторые другие методы, которые я видел, могут привести к тому, что ваш палец сойдет с элемента, который вы прокручиваете, и никогда не синхронизируйте резервную копию. Я уверен, что мой код не будет работать для вас, как есть, но он должен помочь вам в правильном направлении.

В моих методах я также моделировал инерцию для просмотра «метания», сохраняя при этом ограничивающий блок наблюдения. Поскольку это выходит за рамки вашего вопроса, и потребовалось очень много времени, чтобы добиться совершенства, я оставлю это как упражнение для читателя ...

+0

это работает, если 'UIImageView' имеет меньший размер, чем superView. в моем случае imageView больше, чем superView. –

+1

Вы можете установить границы перетаскивания на любые измерения, которые вы хотите. Я просто использую супервизор, потому что это те рамки, которые я хотел для своих нужд. Просто создайте CGRect в функции scrollLimit для любого размера и положения, в котором вы нуждаетесь, и ограничите движение этими границами. Он не должен быть ограниченным ... – Putz1103

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