iOS项目中的知识点总结

释放双眼,带上耳机,听听看~!

项目中的积累

 

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];
}
}

人已赞赏
iOS文章

iOS开发Expected selector for Objective-C and Expected method body

2020-3-4 11:35:40

iOS文章

iOS单元测试和集成测试

2020-3-4 12:08:54

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
有新消息 消息中心
搜索