UIGesture Recognizer를 여러 뷰에 첨부할 수 있습니까?
UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapTapTap:)];
[self.view1 addGestureRecognizer:tapGesture];
[self.view2 addGestureRecognizer:tapGesture];
[tapGesture release];
위의 코드에서는 다음만 탭합니다.view2
인정합니다.제가 세 번째 줄을 언급하면 다음을 탭합니다.view1
인정합니다.제 말이 맞으며 제스처 인식기를 한 번만 사용할 수 있다면 버그인지 아니면 문서가 더 필요한지 잘 모르겠습니다.
A UIGestureRecognizer
단일 보기와 함께 사용됩니다.나는 그 문서가 얼룩덜룩하다는 것에 동의합니다.그거UIGestureRecognizer
싱글입니다.view
자산이 제공합니다.
보다
제스처 인식기가 부착된 보기(읽기 전용)
@속성(비원자, 읽기 전용) UIView *보기
토론 제스처 인식기 추가 방법을 사용하여 제스처 인식기를 UIView 개체에 첨부(또는 추가)합니다.
저는 아래를 사용하여 그것을 극복했습니다.
for (UIButton *aButton in myButtons) {
UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(handleLongPress:)];
longPress.minimumPressDuration=1.0;
[aButton addGestureRecognizer:longPress];
[longPress release];
}
그런 다음 내 핸들 LongPress 메서드에서 나는 제스처 인식기의 보기와 동일한 UI 버튼을 설정하고 그 버튼을 기반으로 내가 수행하는 작업을 분기합니다.
- (void)handleLongPress:(UILongPressGestureRecognizer*)gesture {
if ( gesture.state == UIGestureRecognizerStateEnded ) {
UIButton *whichButton=(UIButton *)[gesture view];
selectedButton=(UIButton *)[gesture view];
....
}
스위프트 3의 경우, 위의 바빅 래소드 답변을 기반으로 합니다.
func setGestureRecognizer() -> UIPanGestureRecognizer {
var panRecognizer = UIPanGestureRecognizer()
panRecognizer = UIPanGestureRecognizer (target: self, action: #selector(pan(panGesture:)))
panRecognizer.minimumNumberOfTouches = 1
panRecognizer.maximumNumberOfTouches = 1
return panRecognizer
}
///set the recognize in multiple views
view1.addGestureRecognizer(setGestureRecognizer())
view2.addGestureRecognizer(setGestureRecognizer())
아니요, 제스처 인식기를 둘 이상의 보기에 첨부해서는 안 됩니다.
Apple 설명서에는 다음과 같은 명시적 정보가 있습니다.
보기에 첨부된 제스처 인식자
모든 제스처 인식기는 하나의 보기와 연결됩니다.대조적으로 보기는 여러 제스처에 응답할 수 있으므로 보기에 여러 제스처 인식기가 있을 수 있습니다.제스처 인식기가 특정 보기에서 발생하는 터치를 인식하려면 제스처 인식기를 해당 보기에 연결해야 합니다.
iOS용 이벤트 처리 가이드 - 제스처 인식기 Apple 개발자 라이브러리
다른 사람들이 언급한 것처럼 일부 경우에는 작동할 수 있지만, 이는 분명히 설명서에 위배되며 향후 iOS 버전에서 변경될 수 있습니다.
모니터링할 보기에 별도의 제스처 인식기를 추가하여 공통 동작을 공유할 수 있습니다.
우리가 뭔가를 할 수 있어요. 이렇게, 쉽고 간단합니다.
컨트롤러에 아래와 같이 함수를 만듭니다(이 함수는 제스처 인식기를 반환합니다).
-(UITapGestureRecognizer*)setRecognizer{
UITapGestureRecognizer *gestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(openProfile)];
[gestureRecognizer setNumberOfTapsRequired:1];
return gestureRecognizer;
}
이제 다중 뷰에서 이 인식기를 설정합니다.
[self.view1 addGestureRecognizer:[self setRecognizer]];
[self.view2 addGestureRecognizer:[self setRecognizer]];
kwalker가 위에서 답변한 것처럼 여러 버튼에 제스처 보기를 추가하기 위해 코드화하고 싶지 않은 사용자가 인터페이스 빌더를 통해 이를 수행하기를 원한다면 도움이 될 수 있습니다.
UIButtons 및 UILabels와 같은 다른 개체를 추가하는 것처럼 개체 라이브러리에서 Long Press gesture Recognizer를 추가할 수 있습니다.
처음에 제가 사용하게 된 것은 하나만 사용한 것입니다.
에 대한 참조 설정UIButton
파일 소유자와 함께 작업을 보냈습니다.
참고: 여러 개의 UIButton 또는 다른 개체가 있는 경우 각 개체에 대해 별도의 제스처 인식기가 필요합니다.자세한 내용은 제 질문을 참조해 주십시오.길게 누르기 제스처 인식기의 잘못된 UIButton 태그 가져오기
만약 당신이 고정된 견해를 가지고 있다면, 저는 당신이 이런 것을 하는 것을 제안합니다.
[self.view1 addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapTapTap:)]];
[self.view2 addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapTapTap:)]];
그런 식으로 하면 여러 가지 쓸모없는 변수를 줄일 수 있습니다.
보기에 일반 확장자를 만들어 제스처 인식자를 쉽게 추가할 수 있습니다.이것은 단지 예시일 뿐이지만 이렇게 보일 수 있습니다.
extension UIView {
func setGestureRecognizer<Gesture: UIGestureRecognizer>(of type: Gesture.Type, target: Any, actionSelector: Selector, swipeDirection: UISwipeGestureRecognizer.Direction? = nil, numOfTaps: Int = 1) {
let getRecognizer = type.init(target: target, action: actionSelector)
switch getRecognizer {
case let swipeGesture as UISwipeGestureRecognizer:
guard let direction = swipeDirection else { return }
swipeGesture.direction = direction
self.addGestureRecognizer(swipeGesture)
case let tapGesture as UITapGestureRecognizer:
tapGesture.numberOfTapsRequired = numOfTaps
self.addGestureRecognizer(tapGesture)
default:
self.addGestureRecognizer(getRecognizer)
}
}
}
보기에 2 탭 인식기를 추가하려면 다음을 호출합니다.
let actionSelector = #selector(actionToExecute)
view.setGestureRecognizer(of: UITapGestureRecognizer.self, target: self, actionSelector: actionSelector, numOfTaps: 2)
또한 스와이프 인식기를 쉽게 추가할 수 있습니다.
view.setGestureRecognizer(of: UISwipeGestureRecognizer.self, target: self, actionSelector: actionSelector, swipeDirection: .down)
등등.대상은 선택기에 연결되어야 합니다.
로 재정의합니다.<UIScrollViewDelegate>
'
그리고 .m 클래스에서 다음 방법을 사용합니다.
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer{
return YES;
}
이 방법은 단일 보기에서 다중 스와이프를 활성화하는 데 도움이 됩니다.
제스처 다시 쓰기(다시 만들기) 동일한 기능을 가리키는 제스처 인식기를 추가할 때마다 인식합니다.아래의 경우 작동합니다.IBOutletCollection을 사용하고 있습니다.
스위프트 2:
@IBOutlet var topicView: [UIView]!
override func viewDidLoad() {
for view in self.topicView as [UIView] {
view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: "viewClicked:"))
}
}
func viewClicked(recognizer: UITapGestureRecognizer) {
print("tap")
}
이것이 오래된 게시물인 것은 알지만 비슷한 것을 발견했고 다른 누군가에게 유용하기를 바랍니다.저는 단순히 제 imageView를 배열에 저장하고 각 imageView를 설정하는 기능으로 동일한 제스처 인식기에 할당했습니다.
내가 보기에 DidLoad():
imageViewList = [imageView, imageView2, imageView3]
setupImageViews(imageViews: imageViewList)
영상 보기를 설정하는 기능:
func setupImageViews(imageViews: [UIImageView]) {
for imageView in imageViews {
let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(imageTapped(tapGestureRecognizer:)))
imageView.isUserInteractionEnabled = true
imageView.addGestureRecognizer(tapGestureRecognizer)
//set up image to be displayed with the right aspect
imageView.autoresizingMask = [.flexibleWidth, .flexibleHeight, .flexibleBottomMargin, .flexibleRightMargin, .flexibleLeftMargin, .flexibleTopMargin]
imageView.contentMode = .scaleAspectFit // OR .scaleAspectFill
imageView.clipsToBounds = true
}
}
또한 작업 선택기 image Taped()에서는 어떤 영상 보기를 탭하든 해당 코드를 가질 수 있습니다.
@objc func imageTapped(tapGestureRecognizer: UITapGestureRecognizer)
{
switch tapGestureRecognizer.view {
case imageView:
print("tapped Image View 1") //add your actions here
case imageView2:
print("tapped Image View 2") //add your actions here
case imageView3:
print("tapped Image View 3") //add your actions here
default:
print("Tap not detected")
}
_ = tapGestureRecognizer.view as! UIImageView
//additional code...
}
xib의 이미지 뷰인 이 코드 마이 뷰를 사용하여 수행할 수 있습니다.
- (void)viewDidLoad
{
firstIV.tag = 501;
secondIV.tag = 502;
thirdIV.tag = 503;
forthIV.tag = 504;
[self addTapGesturetoImageView: firstIV];
[self addTapGesturetoImageView: secondIV];
[self addTapGesturetoImageView: thirdIV];
[self addTapGesturetoImageView: forthIV];
}
-(void)addTapGesturetoImageView:(UIImageView*)iv
{
iv.userInteractionEnabled = YES;
UITapGestureRecognizer * textfielBGIVTapGasture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(textfielBGIVTapped:)];
textfielBGIVTapGasture.numberOfTapsRequired = 1;
[iv addGestureRecognizer:textfielBGIVTapGasture];
}
- (void)textfielBGIVTapped:(UITapGestureRecognizer *)recognizer {
int tag = recognizer.view.tag-500;
switch (tag) {
case 1:
{
//firstIV tapped;
break;
}
case 2:
{
//secondIV tapped;
break;
}
case 3:
{
//thirdIV tapped;
break;
}
case 4:
{
//forthIV tapped;
break;
}
default: {
break;
}
}
}
언급URL : https://stackoverflow.com/questions/4747238/can-you-attach-a-uigesturerecognizer-to-multiple-views
'programing' 카테고리의 다른 글
오류 유형 3 오류:활동 클래스 {}이(가) 없습니다. (0) | 2023.07.02 |
---|---|
CTE 오류: "앵커와 재귀 부품 사이에 유형이 일치하지 않습니다." (0) | 2023.07.02 |
Debug 모드에서 Spring Boot이 H2 콘솔을 차단하고 있습니다. (0) | 2023.07.02 |
마우스 이동 시 업데이트되는 Vue.js 구성 요소 간의 상태 공유 (0) | 2023.07.02 |
R 데이터 프레임에 행을 추가하는 방법 (0) | 2023.07.02 |