1

我正在参加关于 iTunesU(193P) 的免费斯坦福课程,我们创建了一个作为 UIView 子类的类,并创建了一个名为 scale 的公共属性。这个想法是,当我们捏合时,视图的比例会相应改变,但我对何时调用属性比例的设置器感到困惑。这是下面的相关代码:

@interface FaceView : UIView

@property (nonatomic) CGFloat scale; //anyone who wants do publicly can set my scale

-(void)pinch:(UIPinchGestureRecognizer *)gesture;

@end
@synthesize scale = _scale;

#define DEFAULT_SCALE 0.90

-(CGFloat)scale{
    if(!_scale){
        return DEFAULT_SCALE;
    }else {
        return _scale;
    }
}

-(void)setScale:(CGFloat)scale{
    NSLog(@"setting the scale");
    if(scale != _scale){
        _scale = scale;
        [self setNeedsDisplay];
    }
}

-(void)pinch:(UIPinchGestureRecognizer *)gesture{

    if ( (gesture.state == UIGestureRecognizerStateChanged) || (gesture.state == UIGestureRecognizerStateEnded)){

        self.scale *= gesture.scale;
        gesture.scale = 1;
    }
}

当我处于“捏合模式”时,在我捏合时会继续调用 setScale 方法,因为我的 NSLog 语句会打印出来,直到我停止捏合。当没有任何代码以编程方式调用 setScale 方法时,何时或如何继续调用它?也许我在这里错过了一些东西。

4

1 回答 1

0

@cspam,请记住设置手势识别器需要两个步骤:
1)向 UIView 添加手势识别器 - 这让我在讲座中感到困惑,但即使他说向 UIView 添加手势识别器,他的真正意思是添加手势识别器对于 UIView,在 UIViewController 中。这是您在这种情况下必须添加到 UIViewController 子类中的代码(Faceviewcontroller - 您的名称可能不同),这就是在上面的 FaceView 中继续调用您的 pinch 方法的原因:

 UIPinchGestureRecognizer *pinchGesture=[[UIPinchGestureRecognizer alloc]initWithTarget:self.faceView action:@selector(pinch)];  
[self.faceView addGestureRecognizer:pinchGesture];

您可以在 UIView 的 setter 方法中将这段代码添加到 UIViewController(子类)中[换句话说,在 UIViewController 中创建一个 IBOutlet 属性并将其连接到情节提要中的 UIView] 并覆盖 setter 方法以包含上面的代码。

2)第二部分是您的代码中的内容。因此,每次控制器感应到捏合手势时都会调用捏合方法。

希望这可以帮助。

于 2012-06-05T11:01:41.657 回答