2013-04-13 41 views
0

我6周的UIImageViews,說IMG1 - img6。當我觸摸並拖動img1時,它會移動。但我拖動IMG1,當它來到附近其他的UIImageViews的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:,這意味着如果你移動上海華盈或支持界面旋轉,你會得到不正確的座標。

  • 您正在將圖像視圖的中心設置爲觸摸位置。因此,當用戶第一次觸摸視圖時,如果觸摸沒有完全居中在視圖中,視圖將跳轉到以觸摸位置爲中心。這不是用戶期望的行爲。

  • 你總是檢查而不是檢查從前向後的意見以固定順序的看法。這就是爲什麼「當它來到附近其他的UIImageViews的IMG1停止移動並且來到附近它的IMG,開始移動。」你的代碼將會移動firstImg如果觸摸超過firstImg,即使用戶拖着secondImg,因爲您在檢查secondImg之前總是檢查firstImg

  • 你重複自己很多。如果你必須兩次寫同樣的東西,你應該考慮把它分解成一個單獨的函數或方法。如果你必須三次(或更多)寫同樣的東西,那麼你幾乎可以肯定地將它分解出來。

對所有這些問題最簡單的答案是停止使用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 ....它工作正常,但......你說:「有許多與你的執行問題」。如果你不介意你能告訴有什麼問題......那麼,我和任何讀這個問題的人都不會這麼做...... :) – AKB

+0

爲什麼用UIPanGestureRecognizer代替touchesMoved:withEvent:???? – AKB

+0

我已經更新了我的答案。 –