常用技巧列表:
1.去掉UITableView中UITableViewStyleGrouped
樣式的間距
2.取消表頭停滯效果
3.禁止tableView滾動
4.清除cell左邊間距
5.更改iOS的狀態欄顏色
6.利用KVC修改私有屬性
7.修改UIPageControl的選中圖片和默認圖片
8.NSArray 快速求總和 最大值 最小值 和 平均值
9.字符串中是否含有中文
10.用戶輸入了11位手機號碼后,在輸入12位時,提示他只能輸入11位
11.多線程和結束后的更新UI操作
12.隨機顏色
13.除了主界面外,攔截所有push進來的控制器并隱藏tabBar
14.加載xib
15.在View層模態視圖出來
16.在View層點擊某一按鈕push到下一控制器
17.給cell之間設置間隙
18.時間的計算
1.去掉UITableView中UITableViewStyleGrouped
樣式的間距
self.tableView .tableHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 0, 0.1)];
2.取消表頭停滯效果
怎樣讓UITableView
的表頭隨著tableView
一起滾動
如果UITableView
初始化的時候是UITableViewStyleGrouped
則表頭會跟著一起滑動
如果UITableView
初始化的時候是UITableViewStylePlain
則卡在屏幕最上面,要想取消區頭停滯效果
此時做法時
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
CGFloat sectionHeaderHeight = 250; //此高度自己設置 我這里250是cell的高度
if (scrollView.contentOffset.y<=sectionHeaderHeight&&scrollView.contentOffset.y>=0) {
scrollView.contentInset = UIEdgeInsetsMake(-scrollView.contentOffset.y, 0, 0, 0);
} else if (scrollView.contentOffset.y>=sectionHeaderHeight) {
scrollView.contentInset = UIEdgeInsetsMake(-sectionHeaderHeight, 0, 0, 0);
}
}
3.禁止tableView滾動
self.tableView.scrollEnabled = NO;
4.清除cell左邊間距
//初始化tableView
if ([self.tableView respondsToSelector:@selector(setSeparatorInset:)]) {
[self.tableView setSeparatorInset:UIEdgeInsetsMake(0, 0, 0, 0)];
}
if ([self.tableView respondsToSelector:@selector(setLayoutMargins:)]) {
[self.tableView setLayoutMargins:UIEdgeInsetsMake(0, 0, 0, 0)];
}
//cell將要顯示
-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath{
if ([cell respondsToSelector:@selector(setSeparatorInset:)]) {
[cell setSeparatorInset:UIEdgeInsetsZero];
}
if ([cell respondsToSelector:@selector(setLayoutMargins:)]) {
[cell setLayoutMargins:UIEdgeInsetsZero];
}
}
5.更改iOS的狀態欄顏色
//在AppDelegate中直接調用即可
- (void)setStatusBarBackgroundColor:(UIColor *)color
{
UIView *statusBar = [[[UIApplication sharedApplication] valueForKey:@"statusBarWindow"] valueForKey:@"statusBar"];
if ([statusBar respondsToSelector:@selector(setBackgroundColor:)])
{
statusBar.backgroundColor = color;
}
}
6.利用KVC修改私有屬性
修改UITextField中Placeholder的文字顏色、字體大小
[_textField setValue:[UIColor redColor] forKeyPath:@"_placeholderLabel.textColor"];
[_textField setValue:[UIFont boldSystemFontOfSize:16] forKeyPath:@"_placeholderLabel.font"];
7.修改UIPageControl的選中圖片和默認圖片
[_pageControl setValue:currentImage forKey:@"_currentPageImage"];
[_pageControl setValue:pageImage forKey:@"_pageImage"];
8.NSArray 快速求總和 最大值 最小值 和 平均值
NSArray *array = [NSArray arrayWithObjects:@"1", @"2", @"3", @"4", @"5.5", nil];
CGFloat sum = [[array valueForKeyPath:@"@sum.floatValue"] floatValue];
CGFloat avg = [[array valueForKeyPath:@"@avg.floatValue"] floatValue];
CGFloat max =[[array valueForKeyPath:@"@max.floatValue"] floatValue];
CGFloat min =[[array valueForKeyPath:@"@min.floatValue"] floatValue];
NSLog(@"\nsum:%f\navg:%f\nmax:%f\nmin:%f",sum,avg,max,min);
9.字符串中是否含有中文
+ (BOOL)checkIsChinese:(NSString *)string{
for (int i=0; i<string.length; i++) {
unichar ch = [string characterAtIndex:i];
if (0x4E00 <= ch && ch <= 0x9FA5) { return YES; }
}
return NO;
}
10.用戶輸入了11位手機號碼后,在輸入12位時,提示他只能輸入11位
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(textFieldTextDidChange)
name:UITextFieldTextDidChangeNotification object:_moblietextF];
-(void)textFieldTextDidChange{
if(_moblietextF.text.length > 11 ){
NSRange range = NSMakeRange(0, 11);
_moblietextF.text = [_moblietextF.text substringWithRange:range];
[self showHudAutoHideString:@"手機號碼最多為11位"];
}
}
11.多線程和結束后的更新UI操作
dispatch_async(dispatch_get_global_queue(0, 0), ^{
//耗時操作
});
dispatch_async(dispatch_get_main_queue(), ^{
//回主線程,更新UI操作
});
12.隨機顏色
[UIColor colorWithRed:arc4random_uniform(255)/255.0
green:arc4random_uniform(255)/255.0
blue:arc4random_uniform(255)/255.0 alpha:1];;
13.除了主界面外,攔截所有push進來的控制器并隱藏tabBar.
#pragma mark - 可在此方法中攔截所有push 進來的控制器
-(void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated{
if (self.childViewControllers.count>0) {
UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
// [btn setTitle:@"返回" forState:UIControlStateNormal];
[btn setImage:[UIImage imageNamed:@"nav_back"] forState:UIControlStateNormal];
//返回鍵隔得太遠
btn.contentEdgeInsets = UIEdgeInsetsMake(0, 5, 0, 0);
// [btn sizeToFit]; //等價于下面2行
btn.size = CGSizeMake(100, 30);
//讓按鈕內部的所有的內容左對齊
// btn.backgroundColor = [UIColor redColor];
btn.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft;
btn.contentMode = UIRectCornerTopLeft; //這個一般是針對是 img 的設置,而按鈕的設置是通過contentHorizontalAlignment才有效果的
[btn addTarget:self action:@selector(backClick) forControlEvents:UIControlEventTouchUpInside];
[btn setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
[btn setTitleColor:[UIColor redColor] forState:UIControlStateHighlighted];
viewController.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc]initWithCustomView:btn];
viewController.hidesBottomBarWhenPushed = YES;
}
// 這句super的push要放在后面, 讓viewController可以覆蓋上面設置的leftBarButtonItem
[super pushViewController:viewController animated:animated];
}
- (void)backClick{
[self popViewControllerAnimated:YES];
}
14.加載xib
方式一:通過類名調用 <可寫在UIView中的擴展類中,更直接方便調用>
建議
[self.tableView registerNib:[UINib nibWithNibName:NSStringFromClass([XXcell class]) bundle:nil] forCellReuseIdentifier:ID];
而不推薦這樣
[self.tableView registerNib:[UINib nibWithNibName:@"XXcell" bundle:nil] forCellReuseIdentifier:ID];
示例:
方法一:類方法
- (instancetype)XXXView{
return [[[NSBundle mainBundle] loadNibNamed:NSStringFromClass(self) owner:nil options:nil] firstObject];
}
方法二:在分類中添加一個方法
- (instancetype)viewFromXib{
return [[[NSBundle mainBundle] loadNibNamed:NSStringFromClass(self) owner:nil options:nil] firstObject];
}
######15.在View層模態視圖出來
//初始化控制器
XXViewController *show = [[XXViewController alloc]init];
[[UIApplication sharedApplication].keyWindow.rootViewController presentViewController:show animated:YES completion:nil ];
######16.在View層點擊某一按鈕push到下一控制器
因為在View我們是不能push到下一控制器的,所有只能采取回調方式處理該問題,這里采取的是block方式。
//例如(在View層):
.h
typedef void(^EditProfileCallBack)();
//其次寫一個set方法
-(void)setEditProfileCallBack:(EditProfileCallBack)callback;
.m
EditProfileCallBack _callback ; //聲明一個實例屬性
-(void)setEditProfileCallBack:(EditProfileCallBack)callback{
_callback = callback;
}
-
(IBAction)editClick:(id)sender {
if (_callback) {
_callback();
}
}
//在控制器層
YSHeaderView *headerView = [YSHeaderView viewFromXib];
[headerView setEditProfileCallBack:^{
YSEditProfileViewController *edit =[[YSEditProfileViewController alloc]init];
[self.navigationController pushViewController:edit animated:YES]; }];
#####17.給cell之間設置間隙


######方法1:在xib中給cell中再嵌套一個UIView, 通過設置上下左右的約束即可 ,把contentView設置為灰色(可根據需求設置)

---
######方法2:操縱contentView,contentView默認是跟cell填充到一起的 把contentView往右邊移動,寬度和高度減少(省略不說)
---
######方法3:直接操作cell,跟操作contentView差不多。cell層重寫`-(void)setFrame:(CGRect)frame`方法
/*
思路如下:
tabView的顏色為灰色 cell的默認顏色是白色
把整個cell的x值 = 5
那么整個cell的W就是他的2倍
然后設置高度-5 則露出來的就是tableView顏色
從而就投機取巧了
/
-(void)setFrame:(CGRect)frame{
frame.origin.y += 5;
frame.origin.x = 5;
frame.size.width -= 2frame.origin.x;
frame.size.height -=5;
[super setFrame:frame ];
}
---
######18.時間的計算
1、后臺返回形式: create_time : 2016-12-06 17:42:40
> 需求要求顯示:剛剛、多少小時之前、昨天時分秒等等)
寫了一個分類 拿去直接用 。
.h文件
import <Foundation/Foundation.h>
@interface NSDate (HHExtension)
/**
- 比較from和self的時間差值
*/
- (NSDateComponents )deltaFrom:(NSDate )from;
/
- 是否為今年
/
-(BOOL)isThisYear;
/* - 是否為今天
*/
- (BOOL)isToday;
/**
- 是否為昨天
*/
- (BOOL)isYesterday;
@end
.m文件
import "NSDate+HHExtension.h"
@implementation NSDate (HHExtension)
// 比較from和self的時間差值
-
(NSDateComponents *)deltaFrom:(NSDate *)from{
//日歷
NSCalendar *calendar =[NSCalendar currentCalendar];
//比較時間
NSCalendarUnit unit = NSCalendarUnitDay|
NSCalendarUnitMonth|
NSCalendarUnitYear|
NSCalendarUnitHour|
NSCalendarUnitMinute|
NSCalendarUnitSecond;
return [calendar components:unit
fromDate:from
toDate:self options:0];
}
//是否為今年
-(BOOL)isThisYear{
NSCalendar *calendar =[NSCalendar currentCalendar];
NSInteger nowYear = [calendar component:NSCalendarUnitYear
fromDate:[NSDate date]];NSInteger selfYear = [calendar component:NSCalendarUnitYear
fromDate:self];
return nowYear = selfYear;
}
//是否為今天 (BOOL)isToday{
NSDateFormatter *formatter = [[NSDateFormatter alloc]init];
[formatter setDateFormat:@"yyyy-MM-dd"];
NSString *nowString = [formatter stringFromDate:[NSDate date]];
NSString *selfString = [formatter stringFromDate:self];
return [nowString isEqualToString:selfString];
}
// 是否為昨天-
(BOOL)isYesterday{
// 2014-12-31 23:59:59 -> 2014-12-31
// 2015-01-01 00:00:01 -> 2015-01-01
NSDateFormatter *formatter=[[NSDateFormatter alloc]init];
[formatter setDateFormat:@"yyyy-MM-dd"];
NSDate *nowDate = [formatter dateFromString:
[formatter stringFromDate:[NSDate date]]];NSDate *selfDate =[formatter dateFromString:
[formatter stringFromDate: self]];
NSCalendar *calendar = [NSCalendar currentCalendar];
NSDateComponents *components =[calendar components:
NSCalendarUnitDay |
NSCalendarUnitMonth |
NSCalendarUnitYear
fromDate:selfDate toDate:nowDate options:0];
return components.year ==0 &&components.month ==1 &&components.day == 1;
}
@end
在Model層中,后臺必定會有一個關于時間的參數。
/** 發布時間 */
@property (nonatomic, copy) NSString *create_time;
-(NSString *)create_time{
NSDateFormatter *formatter =[[NSDateFormatter alloc]init];
[formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
NSDate *create =[formatter dateFromString:_create_time];
if (create.isThisYear) {//今年
if(create.isToday){
NSDateComponents *compoents =[[NSDate date]deltaFrom:create];
if (compoents.hour>= 1) { //時間差距 >= 1小時
return [NSString stringWithFormat:@"%zd小時前",compoents.hour];
}else if (compoents.minute >= 1){// 1小時 > 時間差距 >= 1分鐘
return [NSString stringWithFormat:@"%zd小時前",compoents.minute];
}else{// 1分鐘 > 時間差距
return @"剛剛";
}
}else if (create.isYesterday) {//昨天
formatter.dateFormat= @"昨天 HH:mm:ss";
return [formatter stringFromDate:create];
}else{//其他
formatter.dateFormat = @"MM-dd HH:mm:ss";
return [formatter stringFromDate:create];
}
}else{//非今年
return _create_time;
}
}
在View層中,填充數據。在控制器中,已經將數據賦給了數據模型,故在Viewce層直接賦值即可。
-(void)setModel:(XXXXModel *)model{
_model = model;
_create_time.text = _model.create_time;
---
2、后臺返回形式:"applyTime":1475854462000,
>需要要求:顯示年月日時分秒 那么就沒有必要像上面那樣搞的那么復雜。
這時候我們就可以在View層直接這樣設置即可:
-(void)setModel:(XXXXModel *)model{
_model = model;
NSDateFormatter *df = [[NSDateFormatter alloc]init];
[df setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
NSDate *cmtDate = [NSDate dateWithTimeIntervalSince1970:model.applyTime/1000];
NSString *datestr = [df stringFromDate:cmtDate];
self.dateLabel.text = datestr;
}