2009-05-24 75 views
18

當您按住D-Pad上的右鍵時,您知道Mario是如何繼續向右跑的嗎?以同樣的方式,我希望我的UIButton在持續時間內持續開啓它的行動。這是可能的UIButton?如果沒有,是否可以通過以某種方式重寫觸摸處理方法來處理UIImageView?其實,在試圖用UIButton完成這個工作之前,我有一些UIImageViews(安排用作D-Pad),它們通過觸摸處理方法進行檢查,但事情開始變得混亂,所以我認爲這可以通過UIButton更容易完成,因此切換。任何人都知道如何得到持續的,靜止的(未移動的)觸覺的認可,請分享。在按住狀態期間讓UIButton不斷燃燒的方法?

回答

32

不要使用按鈕,使用多點觸控的NSTimer:

做一個視圖本地的NSTimer對象的接口裏面,然後用它來啓動/取消計時器

-(void)movePlayer:(id)sender { 
    <Code to move player> 
} 

-(void)touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event { 
    timer = [NSTimer scheduledTimerWithTimeInterval:0.3 target:self selector:@selector(movePlayer:) userInfo:nil repeats:YES]; 
} 

-(void)touchesEnded:(NSSet*)touches withEvent:(UIEvent*)event { 
    if (timer != nil) 
     [timer invalidate]; 
     timer = nil; 
} 

-(void)touchesMoved:(NSSet*)touches withEvent:(UIEvent*)event { 
    if (timer != nil) { 
     [timer invalidate]; 
     timer = nil; 
    } 
} 

這方式,您可以以預定義的時間間隔重複該事件,而不必依賴按鈕,並獲得您要查找的重複行爲。 注意touchesMoved觸發器 - 如果他們移動手指,則取消計時器,並且播放器停止移動。

+0

你有2 touchesBegan,我相信第2應該touchesMoved。 – freespace 2009-05-24 05:21:28

+0

偉大的,但你能糾正重複touchesBegan觸發到你打算觸摸移動,所以沒有人會感到困惑。 – RexOnRoids 2009-05-24 05:38:02

40

你也可以做與上一個答案中顯示的類似的東西,但仍然使用UIButton。

只需在「Touch Down」上啓動計時器,並讓計時器在「Touch Up Inside」或「Touch Up Outside」中停止。

個人而言,我喜歡使用UIButtons,因爲它們提供了一些內置的視覺增強功能,您不必自行編寫代碼。

2

對我來說,以下工作:

  1. 創建一個按鈕。
  2. 在視圖控制器或子類中創建2種方法(停止觸摸並開始觸摸)。
  3. 加控制事件。 TouchUp Inside and Touch Drag Exit他們兩人都停止觸摸方法和Touch Down隨着開始觸摸方式。
  4. 當開始觸摸方法調用時,我們應該啓動一個間隔大約爲0.2的NSTimer(這取決於您調用的速度有多快),重複true並作爲一個選擇器調用一個您想要調用的方法當用戶點擊按鈕時要執行的內容)。
  5. 當停止觸摸方法調用時,我們應該使定時器 (.invalidate())無效,並將定時器賦值爲nil。

就這樣!

0

而現在對於完全不同的東西:
ReactiveCocoa 6

self.button.reactive 
    .controlEvents([.touchDown]) 
    .observeValues { button in 
     SignalProducer.timer(interval: .milliseconds(500), on: QueueScheduler.main) 
      .take(until: button.reactive.controlEvents([.touchDragOutside, .touchDragExit, .touchUpInside, .touchUpOutside, .touchCancel]).map { _ in return }) 
      .prefix(value: Date()) 
      .startWithValues { date in 
       NSLog("\(date)") 
      } 
     }