標籤:load height mat ima elf move gpo 下拉載入 omd
1.使用MJRefresh上拉載入的小細節
MJRefreshBackGifFooter *footer = [MJRefreshBackGifFooter footerWithRefreshingBlock:^{ [_searchResultView.mj_footer endRefreshing]; //載入新內容 [self loadMoreItemList];}];
這樣寫的效果是,當下拉載入時,新內容是不直接展現的,還得繼續往上拉,才能看到新內容
當換種寫法,將endRefreshing寫在loadMoreItemList時,效果就不一樣了
MJRefreshBackGifFooter *footer = [MJRefreshBackGifFooter footerWithRefreshingBlock:^{ //載入新內容 [self loadMoreItemList];}];-(void)loadMoreItemList{ //其餘代碼…… //停止重新整理 if (_searchResultView.mj_footer.state == MJRefreshStateRefreshing) { if (arrTemp.count > 0) { [_searchResultView.mj_footer endRefreshing]; } else { [_searchResultView.mj_footer endRefreshingWithNoMoreData]; } }}
這樣效果就好多了,出現新內容直接展示,而不需要在往上拖才知道有新內容,體驗比較好。
雖然是細節問題,但體驗會不一樣。
2.畫貝茲路徑時,以下的兩種畫法區別在於
UIBezierPath *bezierPath = [UIBezierPath bezierPathWithOvalInRect:view.bounds];
bezierPathWithRect 根據一個矩形畫曲線
bezierPathWithOvalInRect 根據一個矩形的內切圓畫曲線
3.若有需求,在app中,一個介面只在使用者每天初次開機時展示,那麼思路可以這樣,先擷取目前時間,然後與NSUserDefaults中儲存的時間相比較,若為同一天,則不展示,反之亦然。
NSUserDefaults *user = [NSUserDefaults standardUserDefaults];NSString *timeStorage = [user objectForKey:@"signTime"];NSDate *senddate = [NSDate date];NSDateFormatter *dateformatter = [[NSDateFormatter alloc] init];[dateformatter setDateFormat:@"YYYY-MM-dd"];NSString *timeNow = [dateformatter stringFromDate:senddate];if (![timeNow isEqualToString:timeStorage]) { //說明是當天初次開機}
上述方法有點問題,若牽涉到多帳號問題,如換個帳號登入,那麼第二個帳號就算當天首次登入,也不會展示。
解決方案就是往NSUserDefaults儲存時間時,key把例子中的signTime變為使用者id即可。
4.畫虛線,可以用drawRect,也可以用CAShapeLayer,相對來說,後者的使用範圍更廣一些,既可以寫在view內,也可以寫到controller中。
以CAShapeLayer為例,需要用到setLineDashPattern設定虛線線寬和間距
CAShapeLayer *shapeLayer = [CAShapeLayer layer];[shapeLayer setBounds:lineView.bounds];[shapeLayer setPosition:CGPointMake(lineView.frame.size.width / 2.0, lineView.frame.size.height)];[shapeLayer setFillColor:[UIColor clearColor].CGColor];//設定虛線顏色[shapeLayer setStrokeColor:[UIColor lightGrayColor].CGColor];//設定虛線寬度[shapeLayer setLineWidth:lineView.frame.size.height];//設定虛線的線寬及間距[shapeLayer setLineDashPattern:[NSArray arrayWithObjects:[NSNumber numberWithInt:5], [NSNumber numberWithInt:5], nil]];CGMutablePathRef path = CGPathCreateMutable();CGPathMoveToPoint(path, NULL, 0, 0);CGPathAddLineToPoint(path, NULL, lineView.frame.size.width, 0);[shapeLayer setPath:path];CGPathRelease(path);[lineView.layer addSublayer:shapeLayer];
效果如下:
5.底部導覽列tabbar的點擊代理方法中,點擊的序號可以擷取上一個和現在點擊的
- (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController*)viewController { //現在點擊的 NSUInteger selectedNum = [tabBarController.viewControllers indexOfObject:viewController]; //上一個 NSUInteger selectedIndex = tabBarController.selectedIndex;}
6.擷取螢幕可視地區上有哪些cell顯示,可以用
①UITableview的方法,這個最直接,返回一個UITableviewcell的數組。
- (NSArray*)visibleCells;
②UITableview的又一個方法,返回一個NSIndexPath的數組,可以直接用indexpath.row去調table裡的資料了。比較方便用於自定製的cell
- (NSArray*)indexPathsForVisibleRows;
③擷取index內的frame
- (CGRect)rectForRowAtIndexPath:(NSIndexPath*)indexPath;
7.判斷controller是否在當前螢幕展示,即出現在可視地區,在controller中可以用
self.isViewLoaded && self.view.window來判斷。
也可以添加到controller的分類中
+(BOOL)isControllerVisible:(UIViewController *)controller{ return[controller.isViewLoaded && controller.view.window];}
因為當controller的view展示時,view.window一定不是空值。
iOS工作筆記(十五)