ฉันวางภาพ (UIImageView) บนแถบนำทาง ตอนนี้ฉันต้องการตรวจจับเหตุการณ์การสัมผัสและต้องการจัดการเหตุการณ์ ฉันจะทำเช่นนั้นได้อย่างไร?
ฉันวางภาพ (UIImageView) บนแถบนำทาง ตอนนี้ฉันต้องการตรวจจับเหตุการณ์การสัมผัสและต้องการจัดการเหตุการณ์ ฉันจะทำเช่นนั้นได้อย่างไร?
คำตอบ:
ในทางปฏิบัติอย่าทำอย่างนั้น
เพิ่มปุ่มที่มีสไตล์แบบกำหนดเองแทน (ไม่มีกราฟิกของปุ่มเว้นแต่คุณจะระบุรูปภาพ) บน UIImageView จากนั้นแนบวิธีการใด ๆ ที่คุณต้องการเรียกใช้
คุณสามารถใช้เทคนิคนี้กับหลาย ๆ กรณีที่คุณต้องการให้พื้นที่บางส่วนของหน้าจอทำหน้าที่เป็นปุ่มแทนที่จะไปยุ่งกับสิ่งที่ Touch
A UIImageView
มาจากUIView
ที่มาจากUIResponder
ดังนั้นจึงพร้อมที่จะจัดการกับเหตุการณ์สัมผัส คุณจะต้องการที่จะให้touchesBegan
, touchesMoved
และtouchesEnded
วิธีการและพวกเขาจะได้รับการเรียกหากผู้ใช้แตะภาพ หากสิ่งที่คุณต้องการคือเหตุการณ์การแตะมันง่ายกว่าเพียงแค่ใช้ปุ่มที่กำหนดเองกับภาพที่กำหนดเป็นภาพปุ่ม แต่ถ้าคุณต้องการการควบคุมที่ละเอียดกว่าการแตะการเคลื่อนไหว ฯลฯ นี่คือวิธีที่จะไป
คุณจะต้องดูสิ่งต่างๆเพิ่มเติม:
แทนที่canBecomeFirstResponder
และส่งคืนใช่เพื่อระบุว่ามุมมองสามารถกลายเป็นจุดสำคัญของเหตุการณ์การสัมผัสได้ (ค่าเริ่มต้นคือ NO)
ตั้งค่าuserInteractionEnabled
คุณสมบัติเป็นใช่ ค่าเริ่มต้นUIViews
คือใช่ แต่สำหรับUIImageViews
ไม่ใช่ดังนั้นคุณต้องเปิดใช้อย่างชัดเจน
หากคุณต้องการตอบสนองต่อเหตุการณ์แบบมัลติทัช (เช่นการบีบนิ้วการซูม ฯลฯ ) คุณจะต้องตั้งค่า multipleTouchEnabled
เป็นใช่
userInteractionEnabled
เป็นใช่ในมุมมองผู้ปกครองของฉัน ดูstackoverflow.com/questions/5887305/…
หากต้องการเพิ่มเหตุการณ์การสัมผัสลงใน UIImageView ให้ใช้สิ่งต่อไปนี้ในไฟล์. m ของคุณ:
UITapGestureRecognizer *newTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(myTapMethod)];
[myImageView setUserInteractionEnabled:YES];
[myImageView addGestureRecognizer:newTap];
-(void)myTapMethod{
// Treat image tap
}
คุณยังสามารถเพิ่ม UIGestureRecognizer ไม่จำเป็นต้องให้คุณเพิ่มองค์ประกอบเพิ่มเติมในลำดับชั้นมุมมองของคุณ แต่ยังให้โค้ดที่เขียนขึ้นอย่างดีทั้งหมดสำหรับจัดการเหตุการณ์การสัมผัสด้วยอินเทอร์เฟซที่ค่อนข้างเรียบง่าย:
UISwipeGestureRecognizer *swipeRight = [[UISwipeGestureRecognizer alloc]
initWithTarget:self action:@selector(handleSwipe:)];
swipeRight.direction = UISwipeGestureRecognizerDirectionRight;
[imgView_ addGestureRecognizer:swipeRight];
[swipeRight release];
UISwipeGestureRecognizer *swipeLeft = [[UISwipeGestureRecognizer alloc]
initWithTarget:self action:@selector(handleSwipe:)];
swipeLeft.direction = UISwipeGestureRecognizerDirectionLeft;
[imgView_ addGestureRecognizer:swipeLeft];
[swipeLeft release];
ฉันอยู่ในหัวข้อต่างๆในช่วงไม่กี่ชั่วโมงที่ผ่านมาเพื่อพยายามหาวิธีแก้ปัญหาของฉัน แต่ก็ไม่มีประโยชน์ ฉันเห็นว่านักพัฒนาหลายคนแบ่งปันปัญหานี้และฉันคิดว่าคนที่นี่รู้เรื่องนี้ ฉันมีหลายภาพใน a UIScrollView
พยายามรับเหตุการณ์การแตะ
ฉันไม่ได้รับเหตุการณ์ใด ๆ จาก an UIImangeView
แต่ฉันได้รับเหตุการณ์จากUILable
พารามิเตอร์ที่คล้ายกันที่ฉันตั้งค่าไว้ ภายใต้ iOS 5.1
ฉันได้ทำสิ่งต่อไปนี้แล้ว:
UIImageView
ใช่สำหรับUIImageView
ไม่ได้ช่วยอะไรเลยการแนบโค้ดบางส่วนด้านล่างในรหัสนี้ฉันเริ่มต้นทั้ง a UIImageView
และUILabel
ฉลากทำงานได้ดีในแง่ของการเริ่มทำงาน ฉันพยายามเก็บรหัสที่ไม่เกี่ยวข้อง
UIImageView *single_view = [[UIImageView alloc]initWithFrame:CGRectMake(200, 200, 100, 100)];
single_view.image = img;
single_view.layer.zPosition = 4;
UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(singleTapGestureCaptured:)];
[single_view addGestureRecognizer:singleTap];
[single_view setMultipleTouchEnabled:YES];
[single_view setUserInteractionEnabled:YES];
[self.myScrollView addSubview:single_view];
self.myScrollView.userInteractionEnabled = YES;
UILabel *testLabel = [[UILabel alloc] initWithFrame:CGRectMake(100, 100, 100, 100)];
testLabel.backgroundColor = [UIColor redColor];
[self.myScrollView addSubview:testLabel];
[testLabel addGestureRecognizer:singleTap];
[testLabel setMultipleTouchEnabled:YES];
[testLabel setUserInteractionEnabled:YES];
testLabel.layer.zPosition = 4;
และวิธีการจัดการเหตุการณ์:
- (void)singleTapGestureCaptured:(UITapGestureRecognizer *)gesture
{
UIView *tappedView = [gesture.view hitTest:[gesture locationInView:gesture.view] withEvent:nil];
NSLog(@"Touch event on view: %@", [tappedView class]);
}
ดังที่กล่าวว่าได้รับการแตะฉลากแล้ว
แทนที่จะสร้าง UIImageView ที่สัมผัสได้จากนั้นวางไว้บนแถบนำทางคุณควรสร้าง UIBarButtonItem ซึ่งคุณสร้างขึ้นจาก UIImageView
ขั้นแรกให้ดูภาพ:
UIImageView *yourImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"nameOfYourImage.png"]];
จากนั้นทำให้รายการ barbutton ออกจากมุมมองภาพของคุณ:
UIBarButtonItem *yourBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:yourImageView];
จากนั้นเพิ่มรายการปุ่มแถบลงในแถบนำทางของคุณ:
self.navigationItem.rightBarButtonItem = yourBarButtonItem;
โปรดจำไว้ว่ารหัสนี้จะเข้าไปในตัวควบคุมมุมมองซึ่งอยู่ภายในอาร์เรย์วิวคอนโทรลเลอร์ของตัวควบคุมการนำทาง โดยพื้นฐานแล้ว "รายการปุ่มแถบที่ดูรูปภาพที่สัมผัสได้" นี้จะปรากฏในแถบนำทางเมื่อตัวควบคุมมุมมองนี้แสดงขึ้นเท่านั้น เมื่อคุณดันตัวควบคุมมุมมองอื่นรายการปุ่มแถบนำทางนี้จะหายไป
คุณอาจต้องการที่จะแทนที่touchesBegan:withEvent:
วิธีการUIView
(หรือ subclass) ที่มีคุณUIImageView
subview
ภายในวิธีนี้ให้ทดสอบว่าUITouch
สัมผัสใดที่อยู่ในขอบเขตของUIImageView
อินสแตนซ์ (สมมติว่ามีการเรียกimageView
)
นั่นคือCGPoint
องค์ประกอบ[touch locationInView]
ตัดกับCGRect
องค์ประกอบ[imageView bounds]
หรือไม่? ดูฟังก์ชันCGRectContainsPoint
เพื่อเรียกใช้การทดสอบนี้
ขั้นแรกคุณควรวาง UIButton จากนั้นคุณสามารถเพิ่มภาพพื้นหลังสำหรับปุ่มนี้หรือคุณต้องวาง UIImageView ไว้เหนือปุ่ม
หรือ:
คุณสามารถเพิ่มท่าทางการแตะลงใน UIImageView เพื่อให้ได้รับการคลิกเมื่อแตะที่ UIImageView
สำหรับผู้ที่กำลังมองหาโซลูชัน Swift 4 สำหรับคำตอบนี้คุณสามารถใช้สิ่งต่อไปนี้เพื่อตรวจจับเหตุการณ์การสัมผัสบน UIImageView
let gestureRecognizer: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(imageViewTapped))
imageView.addGestureRecognizer(gestureRecognizer)
imageView.isUserInteractionEnabled = true
จากนั้นคุณจะต้องกำหนดตัวเลือกของคุณดังนี้:
@objc func imageViewTapped() {
// Image has been tapped
}
เพิ่มท่าทางในมุมมองนั้น เพิ่มรูปภาพลงในมุมมองนั้นจากนั้นก็จะตรวจพบท่าทางสัมผัสบนรูปภาพด้วย คุณสามารถลองใช้วิธีการมอบหมายของเหตุการณ์สัมผัส จากนั้นในกรณีนั้นก็อาจตรวจพบ