什么时候从UIView子类调用setter方法

时间:2012-06-04 17:50:01

标签: objective-c uiview stanford-nlp cs193p

我正在iTunesU(193P)上学习免费的斯坦福课程,我们创建了一个类,它是UIView的一个子类,并创建了一个名为scale的公共属性。我们的想法是,当我们捏合时,视图的比例会相应地改变,但我很困惑何时调用属性比例的setter。以下是相关代码:

@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方法?也许我在这里错过了一些东西。

1 个答案:

答案 0 :(得分:0)

@cspam,请记住设置手势识别器有两个步骤:
1)为UIView添加一个手势识别器 - 这在演讲中让我很困惑,但是尽管他说要为UIView添加一个手势识别器,他的确意味着在UIViewController中添加一个手势识别器FOR UIView。在这种情况下,你必须在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)第二部分是你的代码中的内容。因此,每当控制器感应到捏合手势时,都会调用捏合方法。

希望这有帮助。