作業目標:Youtube操作影片
練習原始碼:homework0803
這個作業主要是在練習對view以及簡單的繪圖的操作,還有timer的使用
因此我截錄一些我覺得是練習關鍵的程式碼
下面的是viewController的相關程式碼
一個個出現的程式碼,按下show按鈕時觸發
- (IBAction)showButtonClick { [self clearButtonClick]; [self.circleNumber resignFirstResponder]; total = [self.circleNumber.text integerValue]; index = 0; //設定間隔一個個產生circle [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(addItems:) userInfo:NULL repeats:YES]; }
取得圓圈排列坐標的程式碼,傳入值為圓半徑及角度
//取得坐標 - (CGPoint)getPoint:(int) radius withAngel:(CGFloat) degrees{ int y = sin(degrees * M_PI / 180)*radius; int x = cos(degrees * M_PI / 180)*radius; CGPoint btCorner = CGPointMake(x, y) ; return btCorner; }
下面的程式碼則是在被新增的UIView物件裡面
顯示動畫,這邊要注意的是因為定位點的關係,由於我們希望元件的縮放是以view的中心來做縮放
所以改變的值是self.bounds,一般我們在做元件內部繪圖事件,都會使用self.bounds
而self.frame則是在外部設定物件資訊時使用。
-(void) playAnimation{ [UIView animateWithDuration:0.5f animations:^{ self.bounds = CGRectMake(self.bounds.origin.x, self.bounds.origin.y, 50, 50); }completion:^(BOOL finished) { [UIView animateWithDuration:0.5f animations:^{ self.bounds = CGRectMake(self.bounds.origin.x, self.bounds.origin.y, 30, 30); }completion:^(BOOL finished) { }]; }]; }
另外,因為- (id)initWithFrame:(CGRect)frame被呼叫的時間是在circle被新建的時後,而不是在被加到畫面時,
為了落實動畫的被執行時間,所以我又實作了layoutSubviews這個方法,
並加上BOOL init當今天是第一次被呼叫時,才會執行playAnimation
-(void)layoutSubviews{ if(init){ [self playAnimation]; init = NO; } }
然後實作按下後縮小離開時恢復大小的功能
-(void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ [UIView animateWithDuration:0.2f animations:^{ self.bounds = CGRectMake(self.bounds.origin.x, self.bounds.origin.y, 0, 0); } completion:^(BOOL finished) { }]; } -(void) touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{ [UIView animateWithDuration:0.2f animations:^{ self.bounds = CGRectMake(self.bounds.origin.x, self.bounds.origin.y, 30, 30); } completion:^(BOOL finished) { }]; }
原始碼下載:homework0803