2012-08-07 72 views
9

我在iPad上使用爲iOS 5開發的XCode 4.4,並在創建我的自定義按鈕時使用Storyboard佈局。如何獲取自定義UIButton上的水龍頭座標?

我有觸摸事件正確工作和日誌記錄,但現在我想要在我的自定義按鈕上獲取水龍頭的x/y座標。

如果可能,我希望座標相對於自定義按鈕而不是相對於整個iPad屏幕。

這是我在.h文件中的代碼:

- (IBAction)getButtonClick:(id)sender; 

和我的.m文件代碼:

- (IBAction)getButtonClick:(id)sender { 

     NSLog(@"Image Clicked."); 
    } 

就像我說的,是正確地記錄,當我點擊的形象。

如何獲取水龍頭的座標?

我已經嘗試了幾個互聯網上的不同例子,但是當它在日誌框中顯示一堆數字(也許是座標)時,它們總是會凍結。我非常新開發iOS,所以請儘可能簡單。謝謝!

+1

爲什麼你需要的座標? – 2012-08-07 14:22:15

+0

Artern提出正確的問題。你真的需要知道按鈕內的座標,還是隻想知道點擊了哪個按鈕(在這種情況下,你不需要弗拉基米爾對「發件人和事件」的出色建議),而是你可以看看在'發件人'處確定哪個按鈕被點擊。 – Rob 2012-08-07 14:30:23

+2

我需要的座標,因爲我顯示的圖像作爲UIButton,我需要知道用戶點擊該圖像上的哪個位置。我已經知道如何判斷哪個按鈕被點擊了。 – twbbas 2012-08-07 14:32:08

回答

28

爲了讓您可以用按鈕操作方法的另一種變型觸摸位置:myAction:forEvent:(如果從IB接口注創建在參數字段「發件人和事件」選項:enter image description here

然後在動作處理程序中可以從事件參數獲得觸摸位置,例如:

- (IBAction)myAction:(UIButton *)sender forEvent:(UIEvent *)event { 
    NSSet *touches = [event touchesForView:sender]; 
    UITouch *touch = [touches anyObject]; 
    CGPoint touchPoint = [touch locationInView:sender]; 
    NSLog(@"%@", NSStringFromCGPoint(touchPoint)); 
} 
+1

感謝您的詳細解答。但是,當我嘗試從在線獲得其他代碼時,我仍然收到同樣的錯誤。 「無法識別的選擇器發送到實例0xde26e40 2012-08-07 10:29:36.126差異[41044:707] ***終止應用程序由於未捕獲的異常'NSInvalidArgumentException',原因:' - [DifferencesViewController getButtonClick:]:無法識別的選擇器已發送例如0xde26e40'「有什麼想法? – twbbas 2012-08-07 14:31:20

+1

@ user1262552,你仍然有getButtonClick:方法附加到你的按鈕動作,檢查你的故事板文件或代碼,以確保按鈕動作綁定到您的視圖控制器的現有方法 – Vladimir 2012-08-07 14:32:47

+0

當我點擊圖像時,應用程序似乎凍結。 – twbbas 2012-08-07 14:33:20

0

對於整體座標(參照屏幕),你需要創建一個CGPoint包含您觸摸的座標。但要做到這一點,您需要首先獲得該觸覺。因此,首先獲取觸摸事件,然後通過使用locationInView方法表示該點。現在,取決於您想要記錄觸摸的時間 - 當用戶觸摸下來或手指擡起時 - 您必須在touchesBegantouchesEnded方法中實現此代碼。假設你做touchesEnded,它通過NSSet cales「接觸」包含所有觸摸事件。

UITouch *tap = [touches anyObject]; 
CGPoint touchPoint = [tap locationInView:self.view]; 

「touchPoint」現在將包含用戶提起手指的點。要打印出座標,只需訪問該點的x和y屬性:

CGFloat pointX = touchPoint.x; 
CGFloat pointY = touchPoint.y; 
NSLog(@" Coordinates are: %f, %f ", pointX, pointY); 

應該輸出觸摸的座標。現在讓它被引用到你正在使用的任何按鈕上,我建議你只需從這個點上手動減去按鈕座標的值。這看起來像一個簡單的解決方案,老實說,我不知道一種獲得座標以引用另一個對象的方式,除非您基於該對象創建視圖,並將其傳遞給locationInView而不是self.view

欲瞭解更多關於觸摸的信息,有一套很好的教程here

1

Swift Incase of 3。0接受的答案,除了工作相同的語法將如下改變:

雨燕3.0:

@IBAction func buyTap(_ sender: Any, forEvent event: UIEvent) { 
    let myButton = sender as! UIButton 
    let touches = event.touches(for: myButton) 
    let touch = touches?.first 
    let touchPoint = touch?.location(in: myButton) 
    print("touchPoint\(touchPoint)") 
    } 
相關問題