项目中的积累

1. 相对路径

$(SRCROOT)/

2. 把返回按钮的文字隐藏

[[UIBarButtonItem appearance] 
    setBackButtonTitlePositionAdjustment:UIOffsetMake(0, -60)
    forBarMetrics:UIBarMetricsDefault];

3. 改变 NavigationBar 的字体颜色

NavigationBar 上面有两处可以改变字体颜色,一是标题,二是左右按钮的文字。

改变按钮的文字颜色:

[UINavigationBar appearance].tintColor = [UIColor whiteColor];

改变标题的文字颜色:

[[UINavigationBar appearance] setTitleTextAttributes:@{NSForegroundColorAttributeName : [UIColor whiteColor]}];

4. 去掉 NavigationBar 下方的阴影

iOS 7 NavigationBar的下方默认是有一条阴影的,如果想要 NavigationBar 和下面内容的背景颜色融为一体的话,就要去掉这个阴影:

[[UINavigationBar appearance] setBackgroundImage:[UIImage new] forBarMetrics:UIBarMetricsDefault];
[[UINavigationBar appearance] setShadowImage:[UIImage new]];
改变 TabBar 的字体颜色
[UITabBarItem.appearance setTitleTextAttributes:
     @{ NSForegroundColorAttributeName : [UIColor blueColor] }
                                       forState:UIControlStateNormal];
[UITabBarItem.appearance setTitleTextAttributes:
     @{ NSForegroundColorAttributeName : [UIColor whiteColor] }
                                       forState:UIControlStateSelected];

5. 改变 StatusBar 的颜色

iOS7以后,status bar 的背景颜色变成了透明色,而且系统会根据 app的颜色自动改变 status bar 的字体颜色(黑和白)。但是这个自动改变的字体颜色并不一定和所有的 app 都搭配,比如我们 app 的主题色是稍微浅一丢丢的蓝,但是系统匹配的 status bar 的字体颜色就是黑色,看起来就很不爽,所以就要强制将其改为白色。

首先在 Info.plist 中的 Information Property List 中添加一个 Key为View controller-based status bar appearance的 item,其 Type 设为 Boolean,Value 设为 NO
然后在AppDelegate.m的application:didFinishLaunchingWithOptions:中添加:

[UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleLightContent;

6. 隐藏 StatusBar

有时候为了实现沉浸式设计,比如 app 首次打开的引导页,需要隐藏整个 StatusBar,方法如下:

和改变 StatusBar 颜色一样,在 Info.plist 中的 Information Property List 中添加一个 Key为View controller-based status bar appearance的 item,其 Type 设为 Boolean,Value 设为 NO
在需要隐藏StatusBar 的 ViewController 中的viewDidLoad加入以下代码:

if ([self respondsToSelector:@selector(setNeedsStatusBarAppearanceUpdate)]) {
     [self prefersStatusBarHidden];
     [self setNeedsStatusBarAppearanceUpdate];
 }
重写prefersStatusBarHidden:
-(BOOL)prefersStatusBarHidden {
 return YES;
}

注:但是这样设置的话从这个页面开始整个 app 的 StatusBar 都会隐藏,如果想要再显示出来,只需要在其他 ViewController 中加入:

[UIApplication sharedApplication].statusBarHidden = NO;

7. 用Reveal连接模拟器调试

首先打开Terminal,输入 vim ~/.lldbinit 创建一个名为.lldbinit的文件,然后将如下内容输入到该文件中:

command alias reveal_load_sim expr (void*)dlopen("/Applications/Reveal.app/Contents/SharedSupport/iOS-Libraries/libReveal.dylib", 0x2);
command alias reveal_load_dev expr (void*)dlopen([(NSString*)[(NSBundle*)[NSBundle mainBundle]               pathForResource:@"libReveal" ofType:@"dylib"] cStringUsingEncoding:0x4], 0x2);
command alias reveal_start expr (void)[(NSNotificationCenter*)[NSNotificationCenter defaultCenter]           postNotificationName:@"IBARevealRequestStart" object:nil];
command alias reveal_stop expr (void)[(NSNotificationCenter*)[NSNotificationCenter defaultCenter]            postNotificationName:@"IBARevealRequestStop" object:nil];

该步骤其实是为lldb设置了4个别名,为了后续方便操作,这4个别名意义如下:

reveal_load_sim 为模拟器加载reveal调试用的动态链接库

reveal_load_dev 为真机加载reveal调试用的动态链接库

reveal_start 启动reveal调试功能

reveal_stop 结束reveal调试功能

接下来,我们在AppDelegate类的 application: didFinishLaunchingWithOptions:
点击该方法左边的行号区域,增加一个断点,之后右击该断点,选择“Edit Breakpoint”。
点击”Action”项边右的”Add Action”,然后输入“reveal_load_sim
勾选上Options上的”Automatically continue after evaluating”选项。

之后我们运行模拟器,然后打开Reveal,就可以在Reveal界面的左上角,看到有模拟器可以连接调试,选择它,则可以在Reveal中查看和调试该iOS程序的界面了。

8. 字典转json字符串

//NSJSONWritingPrettyPrinted  是有换位符的。

//如果NSJSONWritingPrettyPrinted 是nil 的话 返回的数据是没有 换位符的 
+ (NSString*)dictionaryToJson:(NSDictionary *)dic

{

    NSError *parseError = nil;

    NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dic options:NSJSONWritingPrettyPrinted error:&parseError];

    return [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];

}

9. json字符串转字典

/*!

* @brief 把格式化的JSON格式的字符串转换成字典

* @param jsonString JSON格式的字符串

* @return 返回字典

*/

json格式字符串转字典:

+ (NSDictionary *)dictionaryWithJsonString:(NSString *)jsonString {

    if (jsonString == nil) {

        return nil;

}

NSData *jsonData = [jsonString dataUsingEncoding:NSUTF8StringEncoding];

NSError *err;

NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:jsonData

options:NSJSONReadingMutableContainers

error:&err];

if(err) {

    NSLog(@"json解析失败:%@",err);

    return nil;

}

return dic;

}

10. view遮盖状态栏

UIWindow中有相关层级设定的如下设置

typedef CGFloat UIWindowLevel;  
const UIWindowLevel UIWindowLevelNormal; // 0.0  
const UIWindowLevel UIWindowLevelAlert; // 2000.0  
const UIWindowLevel UIWindowLevelStatusBar; // 1000.0

只需要把 UIWindow层级设置为
UIWindowLevelAlert即可

[UIApplication 


----------


sharedApplication].keyWindow.windowLevel = UIWindowLevelAlert;

11. cell分割线并未补全,添加以下方法

-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
    if ([cell respondsToSelector:@selector(setSeparatorInset:)]) 
    {
        [cell setSeparatorInset:UIEdgeInsetsZero];
    }
    if ([cell respondsToSelector:@selector(setPreservesSuperviewLayoutMargins:)]) 
    {
        [cell setPreservesSuperviewLayoutMargins:NO];
    }
    if ([cell respondsToSelector:@selector(setLayoutMargins:)]) 
    {
        [cell setLayoutMargins:UIEdgeInsetsZero];
    }
}