iOS实用技巧集锦(持续更新)

索引


友情提示:
点击下方超链接, 开启新页面后, 会自动定位到对应的位置.
也可以直接复制想看的内容, 使用 Command + F 直接搜索.
Command + F 搜索不到时, 是因为超链接是直接链接到了另外一篇文章, 请直接点击超链接进行查看.

  • NSDate

    • <a href="#NSDateGetTomorrowAndYesterday" > 获取昨天和明天 </a>
    • <a href="#NSDateGetTimeZoneDate" > 获取带时区的 NSDate </a>
    • <a href="#NSDateGetTimeString" > 将 NSDate 转为字符串 </a>
    • <a href="#NSDateGetIsSameDay" > 判断是否是同年同月同一天 </a>
  • UINavigationController

  • UITableViewController

    • <a href="#UITableViewControllerSuspensionView" >在 UITableViewController 中添加一个悬浮视图 (不随 TableView 滚动)</a>
  • UISearchBar

    • <a href="#UISearchBarPlaceHolderColor" >修改 UISearchBar 的 placeHolderColor</a>
    • <a href="#UISearchBarTextColor" >修改 UISearchBar 的 TextColor</a>
  • UITextField

    • <a href="#UITextFieldMonitorTextChange" >监听 UITextField 中的文字发生变化</a>
    • <a href="#UITextFieldTextDown" >输入中文时, 文字下移</a>
  • UITextView

    • <a href="#UITextViewMonitorTextChange" >监听 UITextView 中的文字发生变化</a>
  • UIStatusBar

    • <a href="#UIStatusBarHide" >隐藏 UIStatusBar</a>
    • <a href="#UIStatusBarHide64" >隐藏 UIStatusBar, 并保持 UINavigationBar 高度为 64</a>
  • UILabel

    • <a href="#GradientLabel" >渐变色 Label</a>
  • AMap

    • <a href="#AMapDistanceTwoPoint" >计算两坐标点之间距离</a>
  • Cocoapods

    • <a href="#CocoapodError-36">error: RPC failed; curl 56 SSLRead() return error -36</a>
  • App Publish

    • <a href="#ArchiveDisable">Archive 按钮不可点击</a>

NSDate


<a name="NSDateGetTomorrowAndYesterday" id="NSDateGetTomorrowAndYesterday" ></a>

获取昨天和明天

环境: iOS10Xcode8.1

NSDate *today = [NSDate date];
// 昨天
NSDate *yesterday = [NSDate dateWithTimeInterval: -24*60*60 sinceDate: today];
// 明天
NSDate *tomorrow  = [NSDate dateWithTimeInterval:  24*60*60 sinceDate: today];

<a name="NSDateGetTimeZoneDate" id="NSDateGetTimeZoneDate" ></a>

获取带时区的 NSDate

环境: iOS10Xcode8.1

NSDate *currentDate = [NSDate date];
NSTimeZone *timeZone = [NSTimeZone systemTimeZone];
NSTimeInterval timeInterval = [timeZone secondsFromGMTForDate: currentDate];
NSDate *timeZoneDate = [currentDate dateByAddingTimeInterval: timeInterval];

<a name="NSDateGetTimeString" id="NSDateGetTimeString" ></a>

将 NSDate 转为字符串

环境: iOS10Xcode8.1

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
NSString *dateString = [dateFormatter stringFromDate: [NSDate date]];

<a name="NSDateGetIsSameDay" id="NSDateGetIsSameDay" ></a>

判断是否是同年同月同一天

环境: iOS10Xcode8.1

- (BOOL)isSameDay:(NSDate *)date1 date2:(NSDate *)date2   {  

    NSCalendar *calendar = [NSCalendar currentCalendar];  
      
    unsigned unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit |  NSDayCalendarUnit;  
    NSDateComponents* comp1 = [calendar components:unitFlags fromDate:date1];  
    NSDateComponents* comp2 = [calendar components:unitFlags fromDate:date2];  
      
    return [comp1 day]   == [comp2 day] && 
           [comp1 month] == [comp2 month] && 
           [comp1 year]  == [comp2 year];  
}  

UITableViewController


<a name="UITableViewControllerSuspensionView" id="UITableViewControllerSuspensionView" ></a>

在 UITableViewController 中添加一个悬浮视图 (不随 TableView 滚动)

环境: iOS10Xcode8.1

  1. 重写 UITableViewController 中的 loadView 方法.
- (void)loadView {
      [super loadView];
    
      // Obtain self.view
      UITableView *tableView = (UITableView *)self.view;
    
      // Create container view
      UIView *containerView = [[UIView alloc] initWithFrame: self.view.bounds];
      [containerView addSubview: tableView];
    
      // Replace self.view
      self.view = containerView;
}
  1. 然后就可以在 self.view 中添加悬浮视图了, 例如:
- (void)viewDidLoad {
      [super viewDidLoad];

      UIView *view = [[UIView alloc];
      view.bounds = CGRectMake(0, 0, 50, 50);
      view.backgroundColor = [UIColor greenColor];
      [self.view addSubview: view];
}

UISearchBar


<a name="UISearchBarPlaceHolderColor" id="UISearchBarPlaceHolderColor" ></a>

修改 UISearchBar 的 placeHolderColor

环境: iOS10Xcode8.1

UISearchBar *searchBar = [UISearchBar new];
UITextField *searchTextField = [searchBar valueForKey:@"_searchField"];
searchTextField.textColor = [UIColor blackColor];

<a name="UISearchBarTextColor" id="UISearchBarTextColor" ></a>

修改 UISearchBar 的 TextColor

环境: iOS10Xcode8.1

UISearchBar *searchBar = [UISearchBar new];
UITextField *searchTextField = [searchBar valueForKey:@"_searchField"];
[searchTextField setValue:[UIColor lightGrayColor] forKeyPath:@"_placeholderLabel.textColor"];

UITextField


<a name="UITextFieldMonitorTextChange" id="UITextFieldMonitorTextChange" ></a>

监听 UITextField 中的文字发生变化

环境: iOS10Xcode8.1

  1. 注册系统通知: textDidChangeNotificationAction
[[NSNotificationCenter defaultCenter] addObserver: self 
                                           selector: @selector(textDidChangeNotificationAction:) 
                                               name: UITextFieldTextDidChangeNotification 
                                             object: nil];
  1. 实现响应方法: textDidChangeNotificationAction:
- (void)textDidChangeNotificationAction:(NSNotification *)notification {
    UITextField *textField = notification.object; // 通过 notification.object, 获取对应的 TextField
}

<a name="UITextFieldTextDown" id="UITextFieldTextDown" ></a>

输入中文时, 文字下移

环境: iOS10Xcode8.1

问题现象: 这个 Bug 最常见的情况是在 UITableViewController 中, 当你设置 TextFieldborderStyle 属性为 UITextBorderStyleNone 的时候, 当你点击 TextField 准备输入文字时, 就会复现这个 Bug. 看下面两张图, 第一张为普通状态, 第二张为输入状态:

普通状态

输入状态

很明显看到 字向下偏移了. (Note: 这个问题, 貌似是当 ViewControllerView 的第一个子视图是 ScrollViewScrollView 子类时, 都会出现这个情况, 有兴趣的同学可以试试.)

解决办法: 首先设置 borderStyle 属性为 UITextBorderStyleLine, 然后在照一张纯白色的图片, 当做 TextField 的背景(这张图片可以使代码生成的, 也可以是一张 1*1 像素的纯白图片). Storyboard 的设置如下图:

Storyboard 设置

UITextView


<a name="UITextViewMonitorTextChange" id="UITextViewMonitorTextChange" ></a>

监听 UITextView 中的文字发生变化

环境: iOS10Xcode8.1

  1. 注册系统通知: textDidChangeNotificationAction
[[NSNotificationCenter defaultCenter] addObserver: self 
                                           selector: @selector(textDidChangeNotificationAction:) 
                                               name: UITextViewTextDidChangeNotification 
                                             object: nil];
  1. 实现响应方法: textDidChangeNotificationAction:
- (void)textDidChangeNotificationAction:(NSNotification *)notification {
    UITextView *textView = notification.object; // 通过 notification.object, 获取对应的 TextView
}

UIStatusBar


<a name="UIStatusBarHide" id="UIStatusBarHide" ></a>

隐藏 UIStatusBar

环境: iOS10Xcode8.1

  1. 首先设置 info.plist 文件, 添加下面这一行.

    设置 info.plist

  2. 隐藏与显示 UIStatusBar

// Show status bar
[[UIApplication sharedApplication] setStatusBarHidden: YES
                                            withAnimation: UIStatusBarAnimationSlide];
// Hide status bar
[[UIApplication sharedApplication] setStatusBarHidden: NO
                                            withAnimation: UIStatusBarAnimationSlide];

<a name="UIStatusBarHide64" id="UIStatusBarHide64" ></a>

隐藏 UIStatusBar, 并保持 UINavigationBar 高度为 64

环境: iOS10Xcode8.1

UIStatusBar 隐藏后, 会出现 UINavigationBar 上移 20 个点的情况, 解决办法如下. 查看原文

UINavigationBar+StatusBarHidden.h

@interface UINavigationBar (StatusBarHidden)
@property (nonatomic) BOOL fixedNavigationBarHeight;
@end

UINavigationBar+StatusBarHidden.m

#import <objc/runtime.h>

static char const* const FixedNavigationBarHeight = "FixedNavigationBarHeight";

@implementation UINavigationBar (StatusBarHidden)
#pragma mark - Override Methods
+ (void)load {
    method_exchangeImplementations(class_getInstanceMethod(self, @selector(sizeThatFits:)),
                                   class_getInstanceMethod(self, @selector(sizeThatFits_FixedNavigationBarHeight:)));
}

#pragma mark - Replace Methods
- (CGSize)sizeThatFits_FixedNavigationBarHeight:(CGSize)size {
 if ([UIApplication sharedApplication].statusBarHidden &&
  [[[UIDevice currentDevice] systemVersion] compare: @"7.0" options:NSNumericSearch] != NSOrderedAscending &&
  self.fixedNavigationBarHeight) {
  CGSize newSize = CGSizeMake(self.frame.size.width, 64);
  return newSize;
 }
 else return [self sizeThatFits_FixedNavigationBarHeight:size];
}

#pragma mark - Override Getter/Setter Methods
- (BOOL)fixedNavigationBarHeight {
 return [objc_getAssociatedObject(self, FixedNavigationBarHeight) boolValue];
}

- (void)setFixedNavigationBarHeight:(BOOL)fixedNavigationBarHeight {
 objc_setAssociatedObject(self, FixedNavigationBarHeight,
  [NSNumber numberWithBool:fixedNavigationBarHeight], OBJC_ASSOCIATION_RETAIN);
}

@end

UILabel


<a name="GradientLabel" id="GradientLabel" ></a>

渐变色 Label

环境: iOS10Xcode8.1

  1. 先看效果


    渐变色 Label
  2. 生成一个 UILabel 的成员变量
@interface ViewController () {
    UILabel *_lblTitle;
}
  1. 初始化 _lblTitle:
    _lblTitle = [UILabel new];
    _lblTitle.text = @"Liguoan";
    _lblTitle.textAlignment = NSTextAlignmentCenter;
    _lblTitle.font = [UIFont systemFontOfSize: 20];
  1. 初始化 CAGradientLayer 实例:
    CAGradientLayer *gradientLayer = [CAGradientLayer layer];
    gradientLayer.position = self.view.center;
    gradientLayer.bounds = (CGRect){CGPointZero, {[UIScreen mainScreen].bounds.size.width, 44}};
    gradientLayer.colors = @[
                             (id)[UIColor redColor]   .CGColor,
                             (id)[UIColor orangeColor].CGColor,
                             (id)[UIColor greenColor] .CGColor
                             ];
    gradientLayer.startPoint = CGPointMake(0, 0.5);
    gradientLayer.endPoint = CGPointMake(1, 0.5);
    [self.view.layer addSublayer: gradientLayer];
  1. 重点: 将 _lblTitle.layer 设置成 gradientLayermaskLayer:
    gradientLayer.mask = _lblTitle.layer;
    _lblTitle.frame = gradientLayer.bounds;

AMap


<a name="AMapDistanceTwoPoint" id="AMapDistanceTwoPoint" ></a>

计算两坐标点之间距离

环境: iOS10Xcode8.1

  1. 生成 MAMapPoint 对象
MAMapPoint point1 = MAMapPointForCoordinate(CLLocationCoordinate2DMake(39.989612,116.480972));
MAMapPoint point2 = MAMapPointForCoordinate(CLLocationCoordinate2DMake(39.990347,116.480441));
  1. 计算两点之间距离
CLLocationDistance distance = MAMetersBetweenMapPoints(point1,point2);

Cocoapods


<a name="CocoapodError-36" id="CocoapodError-36" ></a>

error: RPC failed; curl 56 SSLRead() return error -36

问题现象: 如下图

RPC failed; curl 56 SSLRead() return error -36

遇到这个错误一般来说是因为你电脑里安装了两个及两个以上的 Xcode 导致的.

Xcode7、Xcode8

解决办法: 此时在终端输入以下指令:

sudo xcode-select -switch /Applications/Xcode8.app/Contents/Developer

路径有可能不相同, 所以需要在Applications 中找到 Xcode,右键显示包内容,找到 Developer 文件夹拖到终端里面即可.

App Publish


<a name="ArchiveDisable" id="ArchiveDisable" ></a>

Archive 按钮不可点击

解决办法: 不要使用模拟器, 需要选择成 Device.

选择 Device

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,607评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,047评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,496评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,405评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,400评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,479评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,883评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,535评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,743评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,544评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,612评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,309评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,881评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,891评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,136评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,783评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,316评论 2 342

推荐阅读更多精彩内容

  • 因为要结局swift3.0中引用snapKit的问题,看到一篇介绍Xcode8,swift3变化的文章,觉得很详细...
    uniapp阅读 4,385评论 0 12
  • 1,Search Bar 怎样去掉背景的颜色(storyboard里只能设置background颜色,可是发现cl...
    以德扶人阅读 2,321评论 2 50
  • 2017年3月24日 天气晴 星期五 今天早上第四节课的时候我很开心,因为我可以去练习跑步,还可以去玩老鹰抓小...
    琦琦花仙子小月阅读 107评论 3 1
  • 对于本次服侍(伟建弟兄)我自己要作一个检讨。本来服侍之前我本想3天禁食祷告,但我没有做到,怕自己撑不住。 理论上我...
    shining杨阅读 213评论 0 0
  • 半夜带着哭的鼻子不透气的脑袋,和一颗觉得无比通透刚被疗愈过的心,还有对自己好多好多的疼惜和怜爱,来写一写一句话、一...
    摇月亮阅读 2,747评论 2 0