ios實用技能大總結一

常用技巧列表:
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);
Snip20161103_6.png
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之間設置間隙
![沒有間隙的cell
](http://upload-images.jianshu.io/upload_images/1658521-d83bd2c1640a2783.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

![有間隙的cell](http://upload-images.jianshu.io/upload_images/1658521-f3558f1f3006d052.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
######方法1:在xib中給cell中再嵌套一個UIView, 通過設置上下左右的約束即可 ,把contentView設置為灰色(可根據需求設置)


![cell里面嵌套UIView](http://upload-images.jianshu.io/upload_images/1658521-928c0dba73e1e6a4.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

---

######方法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 -= 2
frame.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;
}

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 概述在iOS開發中UITableView可以說是使用最廣泛的控件,我們平時使用的軟件中到處都可以看到它的影子,類似...
    liudhkk閱讀 9,086評論 3 38
  • *面試心聲:其實這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個offer,總結起來就是把...
    Dove_iOS閱讀 27,205評論 30 471
  • 1.nav1.navigationBar.barStyle=UIBarStyleBlack; //改變導航欄背景顏...
    SadMine閱讀 1,615評論 1 4
  • 專欄 作者葛曉,國稅新人,自由寫手,兼職模特。
    葛曉gxiao閱讀 430評論 0 2
  • 如果能聽著歌就很元氣的過每一天就好了。下午到現在。都是花在自己喜歡的事物上的吧。這樣一個人聽著歌,走路,是一件很稍...
    渡貍醬閱讀 127評論 0 0