使用UIImageView、UIButton實現一個綜合小案例---湯姆貓
回憶:UIImageView 來自UIView,UIView 來自UIResponder,UIButton 來自UIControl,UIControl 來自UIView
單獨看實現,代碼實現其實比較簡單,但是創意很難得,美工要求很高! 是一個了不起的游戲!
功能分析
步驟分析
Images.xcassets中的素材
1> 蘋果極力推薦(images。xcassets 只支持 png 格式)png格式的圖片,因為 png 格式圖片保真,不要用 jpg 圖片,jpg不保真,壓縮比太高,有噪點。
2> 圖片只支持[UIImage imageNamed]的方式實例化,但是不能從Bundle中加載
3> 在編譯時,Images.xcassets中的所有文件會被打包為Assets.car的文件
如果一定要使用 jpg 格式圖片,那么要放到 supporting files 文件夾內
UIImageView的序列幀動畫
類關系
NS_CLASS_AVAILABLE_IOS(2_0) @interface UIImageView : UIView
找到一個屬性;動畫圖像(復數,數組)
@PRoperty(nonatomic,copy) NSArray *animationImages; // The array must contain UIImages. Setting hides the single image. default is nil
還有一個時間間隔
@property(nonatomic) NSTimeInterval animationDuration; // for one cycle of images. default is number of images * 1/30th of a second (i.e. 30 fps)
double類型,是一組圖片,播放一個周期的時間,默認是每秒30個圖
typedef double NSTimeInterval;
還有一個重復屬性,0代表無線重復,默認是0
@property(nonatomic) NSInteger animationRepeatCount; // 0 means infinite (default is 0)
還有三個對象方法
- (void)startAnimating;- (void)stopAnimating;- (BOOL)isAnimating;
注意:不可以并行的進行動畫,比如和水的時候,不能同時被打頭!需要判斷方法,上面提到了isAnimating 方法
代碼如下:
#import "ViewController.h"@interface ViewController ()@property (weak, nonatomic) IBOutlet UIImageView *tom;@end@implementation ViewController- (void)tomAnimationOfName:(NSString *) img andCount:(int)count{ //序列幀動畫:讓一組圖片,和放電影一樣,一張張的播放,動起來的效果 //判斷是否動畫中,不可以同步 if ([self.tom isAnimating]) { //直接結束動畫操作方法,這里就是沒有返回值,nil 不行 return; } //開始肯定是存儲圖片,81個,用可變數組 NSMutableArray *arrayImage = [NSMutableArray array]; //遍歷圖片 for (int i = 0; i < count; i++) { //類似 c,格式控制,不足兩位0補齊 NSString *name = [NSString stringWithFormat:@"%@_%02d.jpg", img, i]; UIImage *image = [UIImage imageNamed:name]; //添加到數組里 [arrayImage addObject:image]; } //然后開始動畫 //把圖片放到animationImages,接受數組參數 self.tom.animationImages = arrayImage; //設置時間間隔,81張圖,圖多就播的時間稍微長,否則短 self.tom.animationDuration = arrayImage.count * 0.074; //設置重復次數 self.tom.animationRepeatCount = 1; //開始動畫 [self.tom startAnimating]; //結束動畫}- (IBAction)head{ [self tomAnimationOfName:@"knockout" andCount:81];}- (IBAction)drink{ [self tomAnimationOfName:@"drink" andCount:81];}
不過,發現程序運行的時候非洲消耗內存!
考慮UIImage imageNamed問題(詳解:UIImage 的imageWithContentsOfFile:path和imageNamed的區別)
在圖片使用完成后,不會直接被釋放掉,具體釋放時間由系統決定,這是不好的,不合理的。需要我們手動改變。比如如果同一圖片,一個程序里總是反復使用每次都要重新從磁盤加載,會降低性能。(程序員追求的是平衡,相對性能好,執行時間好。不能搞極端。)這些是模擬器測不出來的,因為使用的是電腦的內存,不會輕易用完。一般來說:imageNmaed 適用于圖片小的,常用的圖像處理。來進行加載。還可以使用[UIImage imageWithContentsOfFile:path]實例化圖像(全路徑)。
因為前者有緩存(圖片所占用的內存會一直停留在程序中)
NSString *name = [NSString stringWithFormat:@"%@_%02d.jpg", img, i]; // UIImage *image = [UIImage imageNamed:name]; //添加到數組里 NSString *file = [[NSBundle mainBundle] pathForResource:name ofType:nil]; UIImage *image = [UIImage imageWithContentsOfFile:file]; [arrayImage addObject:image];
這樣發現,還是沒什么大的改變,那么應該在動畫調用的時候,做手動的把動畫數組的內容清空!這里還要注意,要節哀延遲,否則動畫剛開始,就清空了!注意!
//結束動畫,應該等等再清空 [self.tom performSelector:@selector(setAnimationImages:) withObject:nil afterDelay:self.tom.animationDuration];
代碼中的方法重構的策略
1> 將具有共性的代碼復制到一個新的方法
2> 根據不同的調用情況,增加方法的參數
提示:在寫程序時不要著急重構,有時候把代碼先寫出來,更容易看清楚如何重構才會更好!當一份代碼重復出現在程序的多處地方,就會造成程序又臭又長,當這份代碼的結構要修改時,每一處出現這份代碼的地方都得修改,導致程序的擴展性很差,因此,要將重復出現的代碼抽取到某個方法中,在需要這份代碼的地方調用方法即可
Bundle中的圖片素材
往項目中拖拽素材時,通常選擇
1> Destination: 勾選
2> Folders:
選擇第一項:黃色文件夾
Xcode中分文件夾,Bundle中所有素材所在,都在同一個文件夾下,開發效率很高,因此,不能出現文件重名的情況,但是美工不舒服。
特點:
可以直接使用[NSBundle mainBundle]作為資源路徑,效率高!
可以使用[UIImage imageNamed:]加載圖像
選擇第二項:藍色文件夾
Xcode中分文件夾,Bundle中同樣分文件夾,因此,可以出現文件重名的情況
特點:
需要在[NSBundle mainBundle]的基礎上拼接實際的路徑,效率較差!
不能使用[UIImage imageNamed:]加載圖像
文件管理
[NSFileManager defaultManager]
常用方法
1> 判斷文件是否存在
- (BOOL)fileExistsAtPath:(NSString *)path;
2> 將文件從源路徑復制到目標路徑
- (BOOL)copyItemAtPath:(NSString *)srcPath toPath:(NSString *)dstPath error:(NSError **)error;
3> 刪除文件
- (BOOL)removeItemAtPath:(N
序列幀動畫開發大概步驟:
// 1. 設置圖片的數組[self.tom setAnimationImages:xxx];// 2. 設置動畫時長,默認每秒播放30張圖片[self.tom setAnimationDuration:xxx];// 3. 設置動畫重復次數,默認為0,無限循環[self.tom setAnimationRepeatCount:xxx];// 4. 開始動畫[self.tom startAnimating];// 5. 動畫播放完成后,清空動畫數組[self.tom performSelector:@selector(setAnimationImages:) withObject:nil afterDelay:self.tom.animationDuration];
新聞熱點
疑難解答