2012-08-07 4 views
9

저는 iPad에서 iOS 5 용으로 개발중인 XCode 4.4를 사용하고 있으며 맞춤 검색 버튼을 만들 때 스토리 보드 레이아웃을 사용하고 있습니다.커스텀 UIButton에서 탭 좌표를 얻으려면 어떻게해야합니까?

터치 이벤트가 제대로 작동하고 로깅되었지만 지금은 사용자 정의 버튼의 탭 좌표를 원합니다.

가능한 경우 좌표를 전체 iPad 화면에 상대적이 아닌 사용자 정의 버튼 기준으로하고 싶습니다. 내가 이미지를 탭하면 그 올바르게 기록,

- (IBAction)getButtonClick:(id)sender { 

     NSLog(@"Image Clicked."); 
    } 

내가 말했듯이 :

- (IBAction)getButtonClick:(id)sender; 

과하는 .m 파일에 내 코드 :

는 여기에 .H 파일에 내 코드입니다.

탭의 좌표는 어떻게 얻을 수 있습니까?

인터넷에서 몇 가지 다른 예제를 시도했지만 로그 상자에 숫자 (어쩌면 좌표)가 표시되면 항상 고정됩니다. 나는 iOS 개발에 익숙하지 않으므로 가능한 한 간단하게 작성하십시오. 감사!

+1

0 허용 대답은 다음과 같은 구문을 제외하고 동일이 변경됩니다 작동? –

+0

Artern이 올바른 질문을하고 있습니다. 버튼 내의 좌표를 정말로 알아야합니까, 아니면 어떤 버튼이 클릭되었는지 알고 싶습니까 (이 경우 블라디미르의 훌륭한 "발신자 및 이벤트"제안은 필요하지 않습니다). '보낸 사람'에서 클릭 한 단추를 확인합니다. – Rob

+2

이미지를 UIButton으로 표시하고 사용자가 탭 한 이미지의 위치를 ​​알아야하기 때문에 좌표가 필요합니다. 나는 이미 어떤 버튼이 클릭되었는지 알려주는 방법을 알고있다. – twbbas

답변

28

당신이 버튼 동작 방법의 또 다른 변형을 사용할 수있는 터치 위치를 확인하려면 : (당신이 IB 인터페이스 노트에서 인수 필드에 "보낸 사람 및 이벤트"옵션을 만드는 경우 : enter image description here) myAction:forEvent: 액션 핸들러에 다음

당신 예를 들어, 이벤트 매개 변수에서 터치 위치를 얻을 수 있습니다 : (화면 기준) 전체 좌표계

- (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

자세한 답변을 보내 주셔서 감사합니다. 그러나 나는 여전히 온라인에서 다른 코드를 시도 할 때와 같은 오류가 발생합니다. "인스턴스로 전송 된 인식 할 수없는 선택자 2012-08-07 10 : 29 : 36.126 차이 [41044 : 707] *** 캐치되지 않은 예외 'NSInvalidArgumentException'으로 인해 응용 프로그램 종료 중, 이유 : '- [DifferencesViewController getButtonClick :] : 인식 할 수없는 선택기가 전송 됨 예를 들어 0xde26e40 ''아이디어가 있습니까? – twbbas

+1

@ user1262552의 경우 버튼 액션에 getButtonClick : 메서드가 여전히 첨부되어 있습니다. 스토리 보드 파일 또는 코드를 확인하여 버튼 컨트롤러가 기존 컨트롤러에 연결되어 있는지 확인하십시오. – Vladimir

+0

그리고 이미지를 탭하면 앱이 고정 된 것처럼 보입니다. – twbbas

0

을, 당신은 당신의 터치의 좌표를 포함하는 CGPoint을 만들어야합니다. 그러나 그렇게하려면 먼저 그 접촉을해야합니다. 먼저 접촉 이벤트를 가져온 다음 locationInView 메소드를 사용하여 해당 지점을 만듭니다. 이제 사용자가 터치 할 때 또는 손가락을 뗄 때 터치를 기록하려는 시점에 따라이 코드를 touchesBegan 또는 touchesEnded 방법으로 구현해야합니다. touchesEnded을 수행하고 모든 터치 이벤트가 포함 된 NSSet 호출 "터치"를 전달한다고 가정 해 보겠습니다.

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); 

터치 좌표를 출력해야합니다. 이제는 사용중인 버튼을 참조하도록하려면 버튼의 좌표 값을 포인트에서 수동으로 뺍니다. 그것은 간단한 해결책처럼 보입니다. 솔직히 다른 객체에 대한 참조로 좌표를 가져 오는 방법을 알지 못합니다. 객체를 기반으로보기를 만든 다음 self.view 대신 locationInView으로 전달하면됩니다.

터치에 대한 자세한 내용은 자습서 here을 참조하십시오.

1

Incase of Swift 3.

스위프트 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)") 
    } 
관련 문제