【iOS】基於Realm資料庫的記賬軟體--記賬模組(二)
- 2020 年 3 月 31 日
- 筆記
1、記賬介面搭建
從記賬的需求出發,該介面需要用戶輸入以下賬單資訊: (1)賬單金額 (2)賬單類型 (3)相關賬戶 (4)賬單產生的日期 (5)備註 那麼,結合一下需求,開始構思一下介面如何搭建吧。

記賬介面
其實這個介面不難搭建,一個控制器的scrollView添加包含兩個控制器的視圖(一個是收入,一個是支出)。子控制器分別用CollectView布局即可。這裡就不詳細說明了
2、數據準備
首先,我們來看看賬單類型的模型聲明。
/// 賬單類型模型 @interface MPCategoryModel : RLMObject /// 類別ID @property (nonatomic, copy) NSString *cateID; /// 類型名稱 @property (nonatomic, copy) NSString *categoryName; /// 類型圖片名 @property (nonatomic, copy) NSString *categoryImageFileName; /// 是否為收入類型 @property (nonatomic, assign) BOOL isIncome; @end RLM_ARRAY_TYPE(MPCategoryModel)
那麼,對應地,我們在程式第一次啟動時,從本地的plist文件讀取數據,寫入資料庫。這樣一來,我們就可以方便的從資料庫進行查詢了。因此在MPCategoryManager創建時,馬上進行初始化操作,部分程式碼如下
/// MPCategoryManager.m文件 + (instancetype)shareManager { static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ instance = [[self alloc] init]; [instance setup]; }); return instance; } /** 初始化 */ - (void)setup { if([self isEmpty]) { [self loadCategoryDataFromPlist]; } }當數據寫入完畢後,通過Realm Browser可以看到數據表如下

賬單類別表
3、數據查詢
以isIncome為查詢條件,分別查詢支出,收入類型類型列表。
/** 獲得收入類型列表 @return MPCategory模型數組 */ - (RLMResults *)getIncomeCategoryList { RLMResults *results = [MPCategoryModel objectsWhere:@"isIncome = YES"]; return results; } 得到以上數據後,即可進行展示了,具體展示就不詳細說了。 /** 獲得支出類型列表 @return MPCategory模型數組 */ - (RLMResults *)getOutcomeCategoryList { RLMResults *results = [MPCategoryModel objectsWhere:@"isIncome = NO"]; return results; }4、選擇動畫效果
點擊按鈕後,會提取選中的圖標顏色,然後從左到右進行「覆蓋」,如下所示:

這裡寫圖片描述
因此,我們的動畫要分兩步:
- 提取顏色
- 做"覆蓋"動畫
4.1、提取顏色
在這裡使用了一個框架CCColorCube,通過該框架,我們可以方便的提取圖標的顏色。提取方法如下:
/// 從圖片提取顏色 - (UIColor *)extractColorFromImage:(UIImage *)image { CCColorCube *cube = [[CCColorCube alloc] init]; NSArray *colors = [cube extractColorsFromImage:image flags:CCAvoidBlack count:1]; // 由於我們的圖標都是單色的,因此直接取第一個元素即為我們所需要的顏色 return colors.firstObject; }4.2、覆蓋動畫
通過shapeLayer的動畫,一開始先添加寬為「1」的線條,再設置動畫,將線條的lineWidth改為螢幕寬
- (void)animationWithBgColor:(UIColor *)color { CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"lineWidth"]; animation.fromValue = @0.0; animation.toValue = @(self.bounds.size.width * 2); animation.duration = 0.3f; //* 設置填充色 */ self.bgColorlayer.fillColor = color.CGColor; //* 設置邊框色 */ self.bgColorlayer.strokeColor = color.CGColor; self.previousColor = color; //* 保持動畫 */ animation.removedOnCompletion = NO; animation.fillMode = kCAFillModeForwards; [self.bgColorlayer addAnimation:animation forKey:@"bgColorAnimation"]; } - (CAShapeLayer *)bgColorlayer { if(_bgColorlayer == nil) { UIBezierPath *path = [UIBezierPath bezierPath]; [path moveToPoint:self.bounds.origin]; [path addLineToPoint:CGPointMake(self.bounds.origin.x, self.bounds.size.height)]; CAShapeLayer *layer = [CAShapeLayer layer]; //* 設置路徑 */ layer.path = path.CGPath; //* 設置填充色 */ layer.fillColor = [UIColor clearColor].CGColor; //* 設置邊框色 */ layer.strokeColor = [UIColor clearColor].CGColor; [self.layer insertSublayer:layer atIndex:0]; self.bgColorlayer = layer; } return _bgColorlayer; }5、數字鍵盤
由於數字鍵盤設計到了「+-=.」等操作符,所以需要判定各情況的輸入,來決定輸入的內容。流程圖如下所示:

這裡寫圖片描述
具體判斷的過程,看項目中的程式碼吧,判斷起來有點繁瑣。
6、小結
建議從記賬模組入手,這一塊完成後。記賬軟體的基本功能就完成了,剩下的只是對寫入的數據,進行操作。所以這一模組是重中之重,有不明白的可以評論或者github上issue我~

