2012-06-04 66 views
1

我在iTunesU(193P)上採用了免費的Stanford課程,我們創建了一個UIView的子類,並創建了一個名爲scale的公共屬性。我們的想法是,當我們捏的時候,視圖的大小會相應地改變,但我對於財產規模的調整者何時被調用感到困惑。這裏是下面的相關代碼:什麼時候從UIView子類調用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方法時,何時或如何繼續調用setScale方法?也許我在這裏錯過了一些東西。

回答

0

@cspam,記得設置手勢識別爲兩個步驟:
1)添加手勢識別到的UIView - 這種困惑我的演講,但eventhough他是在說一個手勢識別添加的UIView,他真的意味着添加一個手勢識別器FOR UIView,IN UIViewController。那就是你缺少你必須在UIViewController子類添加在這種情況下,代碼(Faceviewcontroller - 你的名字可能不同),這是什麼將繼續調用FaceView你捏上述方法:

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

你可以在你的UIView的setter方法中添加這段代碼(換句話說,在你的UIViewController中爲你的UIView創建和連接一個IBOutlet屬性)並覆蓋setter方法以包含上面的代碼。

2)第二部分是你的代碼。所以每次控制器感應到捏手勢時都會調用捏合方法。

希望這會有所幫助。

+0

我明白#2是你所說的,但不是全部#1。我不清楚你在之後說了什麼......「你可以在你的UIView的setter方法中將這段代碼添加到你的UIViewController(子類)中....」。你指的是什麼代碼? – cspam

+0

我的意思是我理解#1而不是#2,對不起 – cspam

+0

我在#2中說的是,你的代碼是正確的,它和你的UIView子類一樣。但是您需要在您創建的UIViewController子類中使用我的代碼。我的代碼會在有手勢時觸發,而我的代碼會觸發你的代碼,因爲我的代碼將目標(方法所在的位置)設置爲你的UIView子類(FaceView)。我更新了代碼。 – Spectravideo328