2013-04-13 3 views
0

У меня 6 изображений, скажем img1 - img6. когда я касаюсь и перетаскиваю img1, он перемещается. но поскольку я перетаскиваю img1, и когда он приближается к другим просмотрам uiimageview, img1 перестает двигаться, а img, который приближается к нему, начинает двигаться. это происходит, когда я перетаскиваю изображение очень быстро, а не когда я медленно перемещаю изображение. А также перетаскивание не так гладко ...... :(Отключить другие UIImageViews, когда один UIImageView коснулся

Вот что я сделал до сих пор ...

- (void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{ 
UITouch *touch = [[event allTouches] anyObject]; 
if (CGRectContainsPoint([self.firstImg frame], [touch locationInView:nil])) 
{ 
    [self.view bringSubviewToFront:self.firstImg]; 
    self.firstImg.center = [touch locationInView:nil]; 
} 
else if (CGRectContainsPoint([self.secondImg frame], [touch locationInView:nil])) 
{ 
    [self.view bringSubviewToFront:self.secondImg]; 
    self.secondImg.center = [touch locationInView:nil]; 
} 
else if (CGRectContainsPoint([self.thirdImg frame], [touch locationInView:nil])) 
{ 
    [self.view bringSubviewToFront:self.thirdImg]; 
    self.thirdImg.center = [touch locationInView:nil]; 
} 
else if (CGRectContainsPoint([self.fourthImg frame], [touch locationInView:nil])) 
{ 
    [self.view bringSubviewToFront:self.fourthImg]; 
    self.fourthImg.center = [touch locationInView:nil]; 
} 
else if (CGRectContainsPoint([self.fifthImg frame], [touch locationInView:nil])) 
{   
    [self.view bringSubviewToFront:self.fifthImg]; 
    self.fifthImg.center = [touch locationInView:nil]; 
} 
else if (CGRectContainsPoint([self.sixthImg frame], [touch locationInView:nil])) 
{   
    [self.view bringSubviewToFront:self.sixthImg]; 
    self.sixthImg.center = [touch locationInView:nil]; 
} 
} 
+0

Попробуйте установить другой режим просмотра изображения в 'userInteractionEnabled: NO', когда вы тянете imageView1. – Zen

+0

Я пытался .... но не повезло ... :( – AKB

+1

Кстати, если я правильно понял, вы пытаетесь реализовать панорамирование. Вы должны использовать 'UIPanGestureRecognizer', если это так. – Zen

ответ

2

Есть целый ряд проблем с реализацией:

  • вы проходя nil как вид на locationInView:, что означает, что при перемещении вращения SuperView или поддержки интерфейса, вы получите неправильные координаты.

  • Вы устанавливаете центр изображения в положение касания. Из-за этого, когда пользователь сначала касается вида, если прикосновение не точно сосредоточено в представлении, точка обзора будет центрироваться в точке касания. Это не то, чего ожидают пользователи.

  • Вы всегда проверяете представления в фиксированном порядке, вместо того, чтобы проверять виды спереди назад. Вот почему «когда он приближается к другим обзорам uiimageview, img1 перестает двигаться, а img, который приближается к нему, начинает двигаться». Ваш код всегда будет перемещаться firstImg, если касание превышает firstImg, даже если пользователь перетаскивал secondImg, потому что вы всегда проверяете firstImg перед проверкой secondImg.

  • Вы много повторяетесь. Если вам нужно написать одно и то же дважды, вы должны подумать о том, чтобы разложить его на отдельную функцию или метод. Если вам нужно написать одно и то же три раза (или более), вы должны почти наверняка его опровергнуть.

Самый простой ответ на все эти проблемы, чтобы прекратить использование touchesMoved:withEvent: и связанных методов. Вместо этого добавьте UIPanGestureRecognizer на каждый вид изображения:

- (void)makeImageViewDraggable:(UIImageView *)imageView { 
    imageView.userInteractionEnabled = YES; 
    UIPanGestureRecognizer *panner = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(imageViewPannerDidFire:)]; 
    [imageView addGestureRecognizer:panner]; 
} 

- (void)imageViewPannerDidFire:(UIPanGestureRecognizer *)panner { 
    UIView *view = panner.view; 
    [view.superview bringSubviewToFront:view]; 

    CGPoint translation = [panner locationInView:view]; 
    CGPoint center = view.center; 
    center.x += translation.x; 
    center.y += translation.y; 
    view.center = center; 

    [panner setTranslation:CGPointZero inView:view]; 
} 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    [self makeImageViewDraggable:self.firstImg]; 
    [self makeImageViewDraggable:self.secondImg]; 
    [self makeImageViewDraggable:self.thirdImg]; 
    [self makeImageViewDraggable:self.fourthImg]; 
    [self makeImageViewDraggable:self.fifthImg]; 
    [self makeImageViewDraggable:self.sixthImg]; 
} 
+0

yaaa .... он отлично работает .... спасибо @rob, но ... вы сказали: «Существует множество проблем с вашей реализацией». Если вы не возражаете, можете ли вы сказать, в чем проблемы ... так что я и любой, кто прочитает эту проблему, не будут их делать ... :) – AKB

+0

И зачем использовать UIPanGestureRecognizer, а не touchsMoved: withEvent: ???? – AKB

+0

Я обновил свой ответ. –

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