UIImageView의 UIGestureRecognizer
나는이
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...
}
예, UIGestureRecognizer를 UIImageView에 추가 할 수 있습니다. 다른 답변에서 언급했듯이
userInteractionEnabled
속성을 로 설정하여 이미지보기에서 사용자 상호 작용을 활성화하는 것이 중요 합니다
YES
. UIImageView는 사용자 상호 작용 속성이
YES
기본적으로 설정된 UIView에서 상속 되지만 UIImageView의 사용자 상호 작용 속성은
NO
기본적으로 설정되어 있습니다.로부터
새 이미지보기 개체는 기본적으로 사용자 이벤트를 무시하도록 구성되어 있습니다. UIImageView의 사용자 정의 서브 클래스에서 이벤트를 처리하려면 오브젝트를 초기화 한 후 userInteractionEnabled 특성 값을 YES로 명시 적으로 변경해야합니다.
어쨌든, 대부분의 대답. , a 및 a
UIImageView
로 a 를 만드는 방법의 예는 다음과 같습니다 .
UIPinchGestureRecognizer
UIRotationGestureRecognizer
UIPanGestureRecognizer
먼저
viewDidLoad
또는 에서 선택한 다른 방법으로 이미지보기를 만들고 이미지, 프레임을 제공하고 사용자 상호 작용을 활성화하십시오. 그런 다음 다음과 같이 세 가지 제스처를 만듭니다. 델리게이트 속성 (대부분 self로 설정)을 사용해야합니다. 여러 제스처를 동시에 사용해야합니다.
- (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];
}
}
마지막으로 매우 중요한 것은 제스처가 동시에 작동 할 수 있도록
메서드
gestureRecognizer: shouldRecognizeSimultaneouslyWithGestureRecognizer
를 사용해야합니다 . 이 세 가지 제스처가이 클래스를 대리자로 할당 한 유일한 세 가지 제스처 인 경우
YES
아래 그림과 같이 간단히 반환 할 수 있습니다. 그러나이 클래스를 대리자로 할당 한 추가 제스처가있는 경우이 메서드에 논리를 추가하여 모든 제스처를 함께 사용하기 전에 어떤 제스처가 어떤 제스처인지 확인할 수 있습니다.
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
return YES;
}
클래스가
프로토콜을 준수하는지 확인하십시오 . 그렇게하려면 인터페이스가 다음과 같아야합니다.
@interface MyClass : MySuperClass <UIGestureRecognizerDelegate>
If you prefer to play with the code in a working sample project yourself, the sample project I've created containing this code can be found here.
Swift 4.2
myImageView.isUserInteractionEnabled = true
let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(imageTapped))
tapGestureRecognizer.numberOfTapsRequired = 1
myImageView.addGestureRecognizer(tapGestureRecognizer)
and when tapped:
@objc func imageTapped(_ sender: UITapGestureRecognizer) {
// do something when image tapped
print("image tapped")
}
Swift 2.0 Solution
You create a tap, pinch or swipe gesture recognizer in the same manor. Below I'll walk you through 4 steps to getting your recognizer up and running.
4 Steps
1.) Inherit from UIGestureRecognizerDelegate
by adding it to your class signature.
class ViewController: UIViewController, UIGestureRecognizerDelegate {...}
2.) Control drag from your image to your viewController to create an IBOutlet:
@IBOutlet weak var tapView: UIImageView!
3.) In your viewDidLoad add the following code:
// 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.) Create the function that will be called when your gesture recognizer is tapped. (You can exclude the = nil
if you choose).
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)
}
Your final code should look something like this:
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)
}
}
I just done this with swift4 by adding 3 gestures together in single view
- UIPinchGestureRecognizer : Zoom in and zoom out view.
- UIRotationGestureRecognizer : Rotate the view.
- UIPanGestureRecognizer : Dragging the view.
Here my sample code
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
}
}
Any question, just type to comment. thank you
SWIFT 3 Example
override func viewDidLoad() {
self.backgroundImageView.addGestureRecognizer(
UITapGestureRecognizer.init(target: self, action:
#selector(didTapImageview(_:))
)
)
self.backgroundImageView.isUserInteractionEnabled = true
}
func didTapImageview(_ sender: Any) {
// do something
}
}
No gesture recongnizer delegates or other implementations where necessary.
You can also drag a tap gesture recogniser to the image view in Storyboard. Then create an action by ctrl+drag to the code...
For Blocks lover you can use ALActionBlocks to add action of gestures in block
__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];
참고URL : https://stackoverflow.com/questions/3907397/uigesturerecognizer-on-uiimageview
'programing' 카테고리의 다른 글
ExpressJS-처리되지 않은 오류 이벤트 발생 (0) | 2020.05.21 |
---|---|
INSTALL_FAILED_DUPLICATE_PERMISSION… C2D_MESSAGE (0) | 2020.05.21 |
iOS : 투명한 배경의 모달 ViewController (0) | 2020.05.21 |
django의 쿼리 세트에서 첫 번째 객체를 얻는 가장 빠른 방법은 무엇입니까? (0) | 2020.05.21 |
Java에서 C ++ 'friend'개념을 시뮬레이션하는 방법이 있습니까? (0) | 2020.05.21 |