ฉันมีUIImageView
ซึ่งฉันต้องการที่จะสามารถปรับขนาดและหมุน ฯลฯ
ที่สามารถUIGestureRecognizer
ถูกเพิ่มไปยังUIImageView
?
ฉันต้องการเพิ่มตัวจดจำการหมุนและการหยิกUIImageView
ที่จะถูกสร้างขึ้นในขณะใช้งานจริง
ใครจะเพิ่มตัวจดจำเหล่านี้ได้อย่างไร
ฉันมีUIImageView
ซึ่งฉันต้องการที่จะสามารถปรับขนาดและหมุน ฯลฯ
ที่สามารถUIGestureRecognizer
ถูกเพิ่มไปยังUIImageView
?
ฉันต้องการเพิ่มตัวจดจำการหมุนและการหยิกUIImageView
ที่จะถูกสร้างขึ้นในขณะใช้งานจริง
ใครจะเพิ่มตัวจดจำเหล่านี้ได้อย่างไร
คำตอบ:
ตรวจสอบว่าuserInteractionEnabled
เป็นบนYES
UIImageView
จากนั้นคุณสามารถเพิ่มตัวจำแนกท่าทาง
imageView.userInteractionEnabled = YES;
UIPinchGestureRecognizer *pgr = [[UIPinchGestureRecognizer alloc]
initWithTarget:self action:@selector(handlePinch:)];
pgr.delegate = self;
[imageView addGestureRecognizer:pgr];
[pgr release];
:
:
- (void)handlePinch:(UIPinchGestureRecognizer *)pinchGestureRecognizer
{
//handle pinch...
}
userInteractionEnabled
ยังคงต้องตั้งค่าเป็น YES / true ใน Xcode 8 Objective-C / Swift
ใช่ UIGestureRecognizer สามารถเพิ่มใน UIImageView ตามที่ระบุไว้ในคำตอบอื่น ๆ ก็เป็นสิ่งสำคัญมากที่จะจำไว้ว่าให้เปิดใช้งานการโต้ตอบกับผู้ใช้ในมุมมองภาพโดยการตั้งค่าของคุณสมบัติการuserInteractionEnabled
YES
UIImageView สืบทอดมาจาก UIView ซึ่งคุณสมบัติการโต้ตอบผู้ใช้ถูกตั้งค่าเป็นค่าYES
เริ่มต้นอย่างไรก็ตามคุณสมบัติการโต้ตอบกับผู้ใช้ของ UIImageView ถูกกำหนดเป็นค่าNO
เริ่มต้น
วัตถุมุมมองรูปภาพใหม่ถูกกำหนดค่าให้ละเว้นกิจกรรมผู้ใช้โดยค่าเริ่มต้น ถ้าคุณต้องการจัดการเหตุการณ์ในคลาสย่อยที่กำหนดเองของ UIImageView คุณต้องเปลี่ยนค่าของคุณสมบัติ userInteractionEnabled เป็น YES อย่างชัดเจนหลังจากเริ่มต้นวัตถุ
อย่างไรก็ตามในจำนวนมากของคำตอบ นี่คือตัวอย่างของวิธีการสร้างหนึ่งUIImageView
ที่มีความUIPinchGestureRecognizer
เป็นและUIRotationGestureRecognizer
UIPanGestureRecognizer
ขั้นแรกในviewDidLoad
หรืออีกวิธีหนึ่งที่คุณเลือกสร้างมุมมองรูปภาพกำหนดรูปภาพเฟรมและเปิดใช้งานการโต้ตอบกับผู้ใช้ จากนั้นสร้างสามท่าทางดังต่อไปนี้ ตรวจสอบให้แน่ใจว่าได้ใช้ทรัพย์สินของพวกเขา (ส่วนใหญ่ตั้งเป็นตนเอง) สิ่งนี้จะต้องใช้ท่าทางหลายอย่างในเวลาเดียวกัน
- (void)viewDidLoad
{
[super viewDidLoad];
// set up the image view
UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"someImage"]];
[imageView setBounds:CGRectMake(0.0, 0.0, 120.0, 120.0)];
[imageView setCenter:self.view.center];
[imageView setUserInteractionEnabled:YES]; // <--- This is very important
// create and configure the pinch gesture
UIPinchGestureRecognizer *pinchGestureRecognizer = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(pinchGestureDetected:)];
[pinchGestureRecognizer setDelegate:self];
[imageView addGestureRecognizer:pinchGestureRecognizer];
// create and configure the rotation gesture
UIRotationGestureRecognizer *rotationGestureRecognizer = [[UIRotationGestureRecognizer alloc] initWithTarget:self action:@selector(rotationGestureDetected:)];
[rotationGestureRecognizer setDelegate:self];
[imageView addGestureRecognizer:rotationGestureRecognizer];
// creat and configure the pan gesture
UIPanGestureRecognizer *panGestureRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panGestureDetected:)];
[panGestureRecognizer setDelegate:self];
[imageView addGestureRecognizer:panGestureRecognizer];
[self.view addSubview:imageView]; // add the image view as a subview of the view controllers view
}
ต่อไปนี้เป็นวิธีการสามวิธีที่จะเรียกใช้เมื่อตรวจพบท่าทางบนมุมมองของคุณ ภายในพวกเขาเราจะตรวจสอบสถานะปัจจุบันของท่าทางและหากอยู่ในสถานะเริ่มต้นหรือเปลี่ยนแปลงUIGestureRecognizerState
เราจะอ่านคุณสมบัติมาตราส่วน / การหมุน / การแปลของท่าทางใช้ข้อมูลนั้นกับการแปลงเลียนแบบใช้การเลียนแบบการเปลี่ยนภาพ มุมมองจากนั้นรีเซ็ตมาตราส่วนท่าทาง / การหมุน / การแปล
- (void)pinchGestureDetected:(UIPinchGestureRecognizer *)recognizer
{
UIGestureRecognizerState state = [recognizer state];
if (state == UIGestureRecognizerStateBegan || state == UIGestureRecognizerStateChanged)
{
CGFloat scale = [recognizer scale];
[recognizer.view setTransform:CGAffineTransformScale(recognizer.view.transform, scale, scale)];
[recognizer setScale:1.0];
}
}
- (void)rotationGestureDetected:(UIRotationGestureRecognizer *)recognizer
{
UIGestureRecognizerState state = [recognizer state];
if (state == UIGestureRecognizerStateBegan || state == UIGestureRecognizerStateChanged)
{
CGFloat rotation = [recognizer rotation];
[recognizer.view setTransform:CGAffineTransformRotate(recognizer.view.transform, rotation)];
[recognizer setRotation:0];
}
}
- (void)panGestureDetected:(UIPanGestureRecognizer *)recognizer
{
UIGestureRecognizerState state = [recognizer state];
if (state == UIGestureRecognizerStateBegan || state == UIGestureRecognizerStateChanged)
{
CGPoint translation = [recognizer translationInView:recognizer.view];
[recognizer.view setTransform:CGAffineTransformTranslate(recognizer.view.transform, translation.x, translation.y)];
[recognizer setTranslation:CGPointZero inView:recognizer.view];
}
}
ในที่สุดและที่สำคัญคุณจะต้องใช้วิธีUIGestureRecognizerDelegategestureRecognizer: shouldRecognizeSimultaneouslyWithGestureRecognizer
เพื่อให้ท่าทางทำงานในเวลาเดียวกัน หากท่าทางทั้งสามนี้เป็นสามท่าทางเท่านั้นที่มีการกำหนดคลาสนี้เป็นตัวแทนของพวกเขาคุณสามารถกลับมาYES
ดังที่แสดงด้านล่าง อย่างไรก็ตามหากคุณมีท่าทางสัมผัสเพิ่มเติมที่ได้รับมอบหมายให้เป็นคลาสนี้คุณอาจต้องเพิ่มตรรกะในวิธีนี้เพื่อพิจารณาว่าท่าทางใดเป็นแบบไหนก่อนที่จะอนุญาตให้พวกเขาทำงานร่วมกันได้
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
return YES;
}
อย่าลืมตรวจสอบให้แน่ใจว่าคลาสของคุณเป็นไปตามโปรโตคอลUIGestureRecognizerDelegate ในการทำเช่นนั้นตรวจสอบให้แน่ใจว่าอินเทอร์เฟซของคุณมีลักษณะดังนี้:
@interface MyClass : MySuperClass <UIGestureRecognizerDelegate>
หากคุณต้องการเล่นกับรหัสในโครงการตัวอย่างที่ใช้งานได้ด้วยตัวเองโครงการตัวอย่างที่ฉันสร้างขึ้นซึ่งมีรหัสนี้สามารถพบได้ที่นี่
myImageView.isUserInteractionEnabled = true
let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(imageTapped))
tapGestureRecognizer.numberOfTapsRequired = 1
myImageView.addGestureRecognizer(tapGestureRecognizer)
และเมื่อแตะ:
@objc func imageTapped(_ sender: UITapGestureRecognizer) {
// do something when image tapped
print("image tapped")
}
คุณสร้างตัวจำแนกลายมือแบบแตะจีบนิ้วหรือการปัดนิ้วในคฤหาสน์เดียวกัน ด้านล่างฉันจะแนะนำคุณผ่าน 4 ขั้นตอนเพื่อทำให้ตัวจำแนกลายมือของคุณทำงาน
4 ขั้นตอน
1. ) รับค่าจากUIGestureRecognizerDelegate
การเพิ่มลงในคลาสของคุณ
class ViewController: UIViewController, UIGestureRecognizerDelegate {...}
2. )ควบคุมการลากจากภาพของคุณไปยัง viewController ของคุณเพื่อสร้าง IBOutlet:
@IBOutlet weak var tapView: UIImageView!
3. )ใน viewDidLoad ของคุณให้เพิ่มรหัสต่อไปนี้:
// create an instance of UITapGestureRecognizer and tell it to run
// an action we'll call "handleTap:"
let tap = UITapGestureRecognizer(target: self, action: Selector("handleTap:"))
// we use our delegate
tap.delegate = self
// allow for user interaction
tapView.userInteractionEnabled = true
// add tap as a gestureRecognizer to tapView
tapView.addGestureRecognizer(tap)
4. )สร้างฟังก์ชั่นที่จะถูกเรียกเมื่อตัวจำแนกท่าทางของคุณถูกแตะ (คุณสามารถยกเว้น= nil
หากคุณเลือก)
func handleTap(sender: UITapGestureRecognizer? = nil) {
// just creating an alert to prove our tap worked!
let tapAlert = UIAlertController(title: "hmmm...", message: "this actually worked?", preferredStyle: UIAlertControllerStyle.Alert)
tapAlert.addAction(UIAlertAction(title: "OK", style: .Destructive, handler: nil))
self.presentViewController(tapAlert, animated: true, completion: nil)
}
รหัสสุดท้ายของคุณควรมีลักษณะดังนี้:
class ViewController: UIViewController, UIGestureRecognizerDelegate {
@IBOutlet weak var tapView: UIImageView!
override func viewDidLoad() {
super.viewDidLoad()
let tap = UITapGestureRecognizer(target: self, action: Selector("handleTap:"))
tap.delegate = self
tapView.userInteractionEnabled = true
tapView.addGestureRecognizer(tap)
}
func handleTap(sender: UITapGestureRecognizer? = nil) {
let tapAlert = UIAlertController(title: "hmmm...", message: "this actually worked?", preferredStyle: UIAlertControllerStyle.Alert)
tapAlert.addAction(UIAlertAction(title: "OK", style: .Destructive, handler: nil))
self.presentViewController(tapAlert, animated: true, completion: nil)
}
}
ฉันเพิ่งทำสิ่งนี้กับ swift4 ด้วยการเพิ่ม 3 ท่าทางด้วยกันในมุมมองเดียว
นี่คือตัวอย่างรหัสของฉัน
class ViewController: UIViewController: UIGestureRecognizerDelegate{
//your image view that outlet from storyboard or xibs file.
@IBOutlet weak var imgView: UIImageView!
// declare gesture recognizer
var panRecognizer: UIPanGestureRecognizer?
var pinchRecognizer: UIPinchGestureRecognizer?
var rotateRecognizer: UIRotationGestureRecognizer?
override func viewDidLoad() {
super.viewDidLoad()
// Create gesture with target self(viewcontroller) and handler function.
self.panRecognizer = UIPanGestureRecognizer(target: self, action: #selector(self.handlePan(recognizer:)))
self.pinchRecognizer = UIPinchGestureRecognizer(target: self, action: #selector(self.handlePinch(recognizer:)))
self.rotateRecognizer = UIRotationGestureRecognizer(target: self, action: #selector(self.handleRotate(recognizer:)))
//delegate gesture with UIGestureRecognizerDelegate
pinchRecognizer?.delegate = self
rotateRecognizer?.delegate = self
panRecognizer?.delegate = self
// than add gesture to imgView
self.imgView.addGestureRecognizer(panRecognizer!)
self.imgView.addGestureRecognizer(pinchRecognizer!)
self.imgView.addGestureRecognizer(rotateRecognizer!)
}
// handle UIPanGestureRecognizer
@objc func handlePan(recognizer: UIPanGestureRecognizer) {
let gview = recognizer.view
if recognizer.state == .began || recognizer.state == .changed {
let translation = recognizer.translation(in: gview?.superview)
gview?.center = CGPoint(x: (gview?.center.x)! + translation.x, y: (gview?.center.y)! + translation.y)
recognizer.setTranslation(CGPoint.zero, in: gview?.superview)
}
}
// handle UIPinchGestureRecognizer
@objc func handlePinch(recognizer: UIPinchGestureRecognizer) {
if recognizer.state == .began || recognizer.state == .changed {
recognizer.view?.transform = (recognizer.view?.transform.scaledBy(x: recognizer.scale, y: recognizer.scale))!
recognizer.scale = 1.0
}
}
// handle UIRotationGestureRecognizer
@objc func handleRotate(recognizer: UIRotationGestureRecognizer) {
if recognizer.state == .began || recognizer.state == .changed {
recognizer.view?.transform = (recognizer.view?.transform.rotated(by: recognizer.rotation))!
recognizer.rotation = 0.0
}
}
// mark sure you override this function to make gestures work together
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
return true
}
}
คำถามใด ๆ เพียงแค่พิมพ์เพื่อแสดงความคิดเห็น ขอบคุณ
SWIFT 3 ตัวอย่าง
override func viewDidLoad() {
self.backgroundImageView.addGestureRecognizer(
UITapGestureRecognizer.init(target: self, action:#selector(didTapImageview(_:)))
)
self.backgroundImageView.isUserInteractionEnabled = true
}
func didTapImageview(_ sender: Any) {
// do something
}
ไม่ได้มอบหมายผู้แนะนำหรือการใช้งานอื่น ๆ ตามที่จำเป็น
คุณยังสามารถลากตัวจดจำท่าทางการแตะไปยังมุมมองรูปภาพStoryboard
ได้ จากนั้นสร้างการกระทำตามctrl + drag
รหัส
สำหรับคนรักบล็อกคุณสามารถใช้ALActionBlocksเพื่อเพิ่มการกระทำของท่าทางในบล็อก
__weak ALViewController *wSelf = self;
imageView.userInteractionEnabled = YES;
UITapGestureRecognizer *gr = [[UITapGestureRecognizer alloc] initWithBlock:^(UITapGestureRecognizer *weakGR) {
NSLog(@"pan %@", NSStringFromCGPoint([weakGR locationInView:wSelf.view]));
}];
[self.imageView addGestureRecognizer:gr];