同时缩放,旋转和移动UIGestureRecognizer

时间:2013-07-18 11:09:54

标签: ios objective-c uigesturerecognizer

我无法找出为什么我的刻度,旋转和移动不会同时起作用..

我看了很多例子,我似乎无法找到问题。 首先我认为这是一个gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer问题,但不是请求帮助:))

这是我的代码:

@implementation StoryEditorPageHolderView   
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer{
    return YES;
}
- (id)initWithProperty:(Property *)property scale:(CGFloat)scaleFactor pos:(CGPoint)point dustbin:(DustbinView *)dustBin{
    self = [super initWithFrame:CGRectZero];
    if(self){
        self.imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:property.imageName]];


        self.frame = CGRectMake(0, 0, self.imageView.frame.size.width, self.imageView.frame.size.height);
        [self addSubview:_imageView];

        UIPinchGestureRecognizer *pinchRecognizer = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(scale:)];
        [self addGestureRecognizer:pinchRecognizer];

        UIRotationGestureRecognizer *rotationRecognizer = [[UIRotationGestureRecognizer alloc] initWithTarget:self action:@selector(rotate:)];
        [self addGestureRecognizer:rotationRecognizer];

        UIPanGestureRecognizer *panRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(move:)];
        [panRecognizer setMinimumNumberOfTouches:1];
        [panRecognizer setMaximumNumberOfTouches:1];
        [self addGestureRecognizer:panRecognizer];

        UITapGestureRecognizer *tapProfileImageRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapped:)];
        [tapProfileImageRecognizer setNumberOfTapsRequired:2];
        [self addGestureRecognizer:tapProfileImageRecognizer];



    }
    return self;
}

- (void)rotate:(UIRotationGestureRecognizer *)rotate {
    if (rotate.state == UIGestureRecognizerStateBegan) {
        prevRotation = 0.0;
    }

    float thisRotate = rotate.rotation - prevRotation;
    prevRotation = rotate.rotation;
    self.transform = CGAffineTransformRotate(self.transform, thisRotate);
}

- (void)scale:(UIPinchGestureRecognizer *)pinch {
    if (pinch.state == UIGestureRecognizerStateBegan)
        prevPinchScale = 1.0;

    float thisScale = 1 + (pinch.scale-prevPinchScale);
    prevPinchScale = pinch.scale;
    self.transform = CGAffineTransformScale(self.transform, thisScale, thisScale);
}

-(void)move:(UIPanGestureRecognizer *)pan {

    if (pan.state == UIGestureRecognizerStateBegan){
        prevPanPoint = [pan locationInView:self.superview];
    }

    CGPoint curr = [pan locationInView:self.superview];

    float diffx = curr.x - prevPanPoint.x;
    float diffy = curr.y - prevPanPoint.y;

    CGPoint centre = self.center;
    centre.x += diffx;
    centre.y += diffy;
    self.center = centre;

    prevPanPoint = curr;
}
@end

我在.h文件中也有UIGestureRecognizerDelegate作为delegate

#import <Foundation/Foundation.h>


@class Property;
@class DustbinView;

@interface StoryEditorPropertyView : UIView <UIGestureRecognizerDelegate>

@property (strong, nonatomic) UIPanGestureRecognizer *panRecognizer;
@property (strong, nonatomic) UIPinchGestureRecognizer *pinchRecognizer;
@property (strong, nonatomic) UIRotationGestureRecognizer *rotationRecognizer;
@property (strong, nonatomic) UITapGestureRecognizer *tapProfileImageRecognizer;
@property (strong, nonatomic) UIImageView *imageView;
@property (strong, nonatomic) Property *property;
@property (nonatomic) CGPoint pointBegin;
@property (nonatomic) bool isRemoveable;
@property (nonatomic) CGFloat beginScale;
@property (strong, nonatomic) DustbinView *dustBin;

- (id)initWithProperty:(Property *)property scale:(CGFloat)scaleFactor pos:(CGPoint)point dustbin:(DustbinView *)dustBin;

@end

3 个答案:

答案 0 :(得分:2)

这对我有用:

UIPinchGestureRecognizer *pinchRecognizer = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(scale:)];
pinchRecognizer.delegate = self;
[self addGestureRecognizer:pinchRecognizer];

UIRotationGestureRecognizer *rotationRecognizer = [[UIRotationGestureRecognizer alloc] initWithTarget:self action:@selector(rotate:)];
pinchRecognizer.delegate = self;
[self addGestureRecognizer:rotationRecognizer];

UIPanGestureRecognizer *panRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(move:)];
pinchRecognizer.delegate = self;
[panRecognizer setMinimumNumberOfTouches:1];
[panRecognizer setMaximumNumberOfTouches:1];
[self addGestureRecognizer:panRecognizer];

答案 1 :(得分:0)

好的,你做错了的是没有为UIGestureRecognizer添加一个对象来适应。例如,你有

 UITapGestureRecognizer *tapProfileImageRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapped:)];
    [tapProfileImageRecognizer setNumberOfTapsRequired:2];
    [self addGestureRecognizer:tapProfileImageRecognizer];

这正是你所需要的,除了这一行

 [self addGestureRecognizer:tapProfileImageRecognizer];

这是将手势添加到课堂上。你需要一个OBJECT:)

所以就这样做

 [self.view addGestureRecognizer:tapProfileImageRecognizer];

所有你的手势,它应该工作:) 你总是要确保你要添加到对象上,而不是类

希望这会有所帮助!!

编辑:

将UIGestureRecognizers放到UIView上是你做你正在做的事情的方式。你现在需要做的就是去Xcode,

  • file - &gt;新文件
  • 制作UIViewController子类
  • 确保将其命名为......
  • 在.xib文件下,找到:

enter image description here

然后,如果你看看UIView的位置,请点击它。这将打开UIView属性面板。转到圈子里有i的小按钮。它是属性面板下的蓝色。点击它,您应该看到:

enter image description here

在哪里可以看到显示“UIView”

的方框

这是您键入UIView的子类的地方。

这应该有助于解决您遇到的任何问题。希望有所帮助! :)

答案 2 :(得分:-1)

添加您应该放在viewDidLoad而不是init方法中的手势代码,并在视图中添加手势(self.view)而不是在对象(self)本身。 尝试如下我做了一些改变

-(void) viewDidLoad
{
        UIPinchGestureRecognizer *pinchRecognizer = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(scale:)];
        [self.view addGestureRecognizer:pinchRecognizer];

        UIRotationGestureRecognizer *rotationRecognizer = [[UIRotationGestureRecognizer alloc] initWithTarget:self action:@selector(rotate:)];
        [self.view addGestureRecognizer:rotationRecognizer];

        UIPanGestureRecognizer *panRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(move:)];
        [panRecognizer setMinimumNumberOfTouches:1];
        [panRecognizer setMaximumNumberOfTouches:1];
        [self.view addGestureRecognizer:panRecognizer];

        UITapGestureRecognizer *tapProfileImageRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapped:)];
        [tapProfileImageRecognizer setNumberOfTapsRequired:2];
        [self.view addGestureRecognizer:tapProfileImageRecognizer];
}