2012-01-06 24 views
0

我正在嘗試製作使用徑向撥號的應用程序。作爲一個例子,徑向撥號功能如availabel在此應用程序Xcode中的徑向撥號

http://itunes.apple.com/us/app/kitchen-dial/id448558628?mt=8&ign-mpt=uo%3D4

我想問的是,我應該用什麼方法做到這一點?夥計們,我不是要求你爲我寫代碼,而是問我在概念上是如何完成的?我的意思是當用戶在屏幕上向左/向右滑動時,它如何知道哪個徑向撥盤要移動以及朝哪個方向移動。我確定有多個按鈕,這裏有一些圖像轉換。我需要了解制造這種事情的概念。如果有人知道或做過類似的事情,請分享您的想法。蘋果是否有這樣的示例代碼?謝謝。

回答

2

中央概念是:

  • 能夠圍繞中心點旋轉圖像。

  • 能夠計算相對於給定x,y座標的中心點的角度。

因此,移動輪:

  • 在觸摸開始:
    • 計算起始角度基於X,Y
  • 在觸摸感動:
    • 根據x,y計算新角度並減去開始角度。這是角度三角洲(或多少旋轉圖像)。

      • 在抽頭:

    爲了在車輪上註冊按鈕抽頭

    • 計算角度根據X,Y,通過各段的角度大小添加現有的旋轉,分得到一個索引。

你問的概念,一個高層次的解釋 - 這幾乎是它。

+0

非常好。謝謝史蒂夫。有誰知道那裏是否有示例教程? – 2012-01-06 20:45:54

1

這是一個複雜的問題。簡單的答案是:使用一個平移手勢識別器,以:

- (void)panBegan:(UIPanGestureRecognizer *)pan { 
    CGRect frame = [self frame]; 
    _central = CGPointMake(frame.origin.x+frame.size.width/2, frame.origin.y+frame.size.height/2); 
    CGPoint p = [pan locationInView:[self superview]]; 
    p.x -= _central.x; 
    p.y -= _central.y; 

    _angle = atan2(p.x, p.y); 
} 

- (void)panMoved:(UIPanGestureRecognizer *)pan { 
    CGPoint p = [pan locationInView:[self superview]]]; 
    p.x -= _central.x; 
    p.y -= _central.y; 
    CGFloat deltaAngle = _angle - atan2(p.x, p.y); 
    self.transform = CGAffineTransformMakeRotation(deltaAngle + _finalAngle); 
} 

其中_angle是盤的初始觸摸的角度,和_finalAngle在先前的盤的端保存的角度。

但是:UIPanGestureRecognizer具有velocity屬性,您應該在平底鍋上使用它來繼續旋轉,就好像錶盤具有慣性一樣。而且,如果撥號盤有一個固定的整數合法停止位置集合,那麼您必須調整減速曲線,使其停在合法的停止位置。而且,如果您製作減速動畫,並且用戶在前一個完成之前開始新的平移,則必須根據感知位置而不是存儲位置調整_finalAngle。