jar*_*ryd 176 objective-c uiimageview uigesturerecognizer ios
我有一个UIImageView,我希望能够调整大小和旋转等.
可以UIGestureRecognizer添加到UIImageView?
我想UIImageView在运行时创建一个旋转和捏合识别器.
如何添加这些识别器?
小智 422
检查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...
}
Run Code Online (Sandbox Code Playgroud)
Mic*_*lum 75
是的,可以将UIGestureRecognizer添加到UIImageView.如其他答案中所述,记住通过将其userInteractionEnabled属性设置为在图像视图上启用用户交互非常重要YES.UIImageView继承自UIView,其用户交互属性YES默认设置为默认值,但UIImageView的用户交互属性NO默认设置为.
默认情况下,新图像视图对象配置为忽略用户事件.如果要在UIImageView的自定义子类中处理事件,则必须在初始化对象后显式将userInteractionEnabled属性的值更改为YES.
无论如何,在答案的大部分.这是一个如何创建UIImageViewa UIPinchGestureRecognizer,a UIRotationGestureRecognizer和a 的示例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
}
Run Code Online (Sandbox Code Playgroud)
以下是检测到视图上的手势时将调用的三种方法.在它们内部,我们将检查手势的当前状态,如果它在开始或更改中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];
}
}
Run Code Online (Sandbox Code Playgroud)
最后也非常重要的是,您需要使用UIGestureRecognizerDelegate方法gestureRecognizer: shouldRecognizeSimultaneouslyWithGestureRecognizer来允许手势同时工作.如果这三个手势是将此类指定为其委托的唯一三个手势,那么您可以简单地返回YES如下所示.但是,如果您有其他手势将此类指定为其委托,则可能需要向此方法添加逻辑,以确定在允许它们一起工作之前哪个手势.
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
return YES;
}
Run Code Online (Sandbox Code Playgroud)
不要忘记确保您的类符合UIGestureRecognizerDelegate协议.为此,请确保您的界面看起来像这样:
@interface MyClass : MySuperClass <UIGestureRecognizerDelegate>
Run Code Online (Sandbox Code Playgroud)
如果您更喜欢自己使用工作示例项目中的代码,可以在此处找到我创建的包含此代码的示例项目.
aya*_*aya 12
myImageView.isUserInteractionEnabled = true
let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(imageTapped))
tapGestureRecognizer.numberOfTapsRequired = 1
myImageView.addGestureRecognizer(tapGestureRecognizer)
Run Code Online (Sandbox Code Playgroud)
当点击时:
@objc func imageTapped(_ sender: UITapGestureRecognizer) {
// do something when image tapped
print("image tapped")
}
Run Code Online (Sandbox Code Playgroud)
Dan*_*ieu 11
您可以在同一庄园中创建轻击,捏合或滑动手势识别器.下面我将向您介绍4个步骤,让您的识别器启动并运行.
4个步骤
1.)UIGestureRecognizerDelegate通过将其添加到您的类签名继承.
class ViewController: UIViewController, UIGestureRecognizerDelegate {...}
Run Code Online (Sandbox Code Playgroud)
2.)控制从图像拖动到viewController以创建IBOutlet:
@IBOutlet weak var tapView: UIImageView!
Run Code Online (Sandbox Code Playgroud)
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)
Run Code Online (Sandbox Code Playgroud)
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)
}
Run Code Online (Sandbox Code Playgroud)
您的最终代码应如下所示:
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)
}
}
Run Code Online (Sandbox Code Playgroud)
我只是用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
}
}
Run Code Online (Sandbox Code Playgroud)
如有任何问题,只需输入评论即可。谢谢
| 归档时间: |
|
| 查看次数: |
102283 次 |
| 最近记录: |