我正在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方法?也许我在这里错过了一些东西。
答案 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)第二部分是你的代码中的内容。因此,每当控制器感应到捏合手势时,都会调用捏合方法。
希望这有帮助。