一句话笔记,某段时间内遇到或看到的某个可记录的点。 2016-8-26
- NSString使用stringWithFormat拼接的实用点
- beginUpdates & endUpdates
- Autoresizing特性
- 如何让 前端页面 区分 是在 App 端展示的还是 浏览器端展示
1、NSString使用stringWithFormat拼接的实用点
- 保留2位小数点
//.2代表小数点后面保留2位(2代表保留的数量)
NSString *string = [NSString stringWithFormat:@"%.2f",M_PI];
//输出结果是: 3.14
NSLog(@"%@", string);
- 用0补全的方法
NSInteger count = 3;
//03代表:如果count不足3位 用0在最前面补全(3代表总输出的个数)
NSString *string = [NSString stringWithFormat:@"%03ld",count];
//输出结果是: 003
NSLog(@"%@", string);
- 字符串中有特殊符号
%
怎么办
NSInteger count = 80;
//%是一个特殊符号 如果在NSString中用到%需要如下写法
NSString *string = [NSString stringWithFormat:@"%ld%%",count];
// NSString *string = [NSString stringWithFormat:@"%ld%@",count,@"%"];
//输出结果是: 80%
NSLog(@"%@", string);
- 字符串中有特殊符号
"
怎么办
NSInteger count = 50;
//"是一个特殊符号, 如果在NSString中用到"需要用\进行转义
NSString *string = [NSString stringWithFormat:@"%ld\"",count];
//输出结果是: 50"
NSLog(@"%@", string);
PS:阅读自iOS 开发中你是否遇到这些经验问题(一)
另外,我看到它原文中 是用" %zd"
,个人认为是可以斟酌的
NSInteger:%ld
size_t:%zd
NSUInteger:%lu
%d/%D:带符号32位整数(int)
%o/%O:无符号32位整数(unsigned int)的八进制格式
%x/%X:无符号32位整数(unsigned int)的十六进制格式
%c:8位无符号字符(unsigned char)
%C:16位UNICODE字符(unichar)
%f:64位浮点数(double
在 NSInteger 情况下, 还是用 %ld
吧,上述实用点中第二点,没用过,得记录下。
2、 beginUpdates & endUpdates
这个以前,我平常没怎么用到,但是在看我们老项目的时候,发现啦它
[tableView beginUpdates];
[tableView reloadData];
[tableView endUpdates];
很疑惑为什么要这样写,结果查阅后,认为这样写是错的,因为一般我们要执行动画时,才会遇到 beginUpdates
、endUpdates
的,而reloadData
是更新数据源的。
[tableView beginUpdates];
// 删除、插入、更新
[tableView endUpdates];
[tableView reloadRowsAtIndexPaths:@[] withRowAnimation:UITableViewRowAnimationAutomatic];
以前直接这么写也没遇到问题,但是系统有它,肯定是有其原因的,所以认为一般我们用到删除、更新、插入带有动画时 (withRowAnimation
) 配合用它会更合适。
3、 Autoresizing 特性
现在我们一般都用 AutoLayout , 但是以前 Autoresizing 使用还是很常见的,毕竟之前是木有自动布局的,在看一些老的代码中常看到,特此记录下。
Autoresizing: 当 UIView 的 autoresizesSubviews是YES时,(默认是YES), 那么在其中的子view会根据它自身的autoresizingMask属性来自动适应其与superView之间的位置和大小。autoresizingMask是一个枚举类型, 默认是UIViewAutoresizingNone, 也就是不会 autoresize。
typedef NS_OPTIONS(NSUInteger, UIViewAutoresizing) {
UIViewAutoresizingNone = 0, //view的frame不会随superview的改变而改变
UIViewAutoresizingFlexibleLeftMargin = 1 << 0, //自动调整view与superview左边的距离保证右边距离不变
UIViewAutoresizingFlexibleWidth = 1 << 1, //自动调整view的宽,保证与superView的左右边距不变
UIViewAutoresizingFlexibleRightMargin = 1 << 2, //自动调整view与superview右边的距离保证左边距不变
UIViewAutoresizingFlexibleTopMargin = 1 << 3,//自动调整view与superview顶部的距离保证底部距离不变
UIViewAutoresizingFlexibleHeight = 1 << 4, //自动调整view的高,保证与superView的顶部和底部距离不变
UIViewAutoresizingFlexibleBottomMargin = 1 << 5 //自动调整view与superview底部部的距离保证顶部距离不变
};
备注来源:iOS自动布局之Autoresizing
4、如何让 前端页面 区分 是在 App 端展示的还是 浏览器端展示
简单的说,可以通过获取用户的的 用户代理 来区分是否 是在 App 中展示的还是在浏览器中的展示的,也可以换成如何获取 UserAgent,并改变它。
用户代理(英语:User Agent)指的是代表 用户 行为的软件 软件代理程序 所提供的对自己的一个标识符。
**PS百度备注: ** Apple开发了Safari,使用了KHTML,同时也增加了很多新特性,后来干脆一锅煮,另起炉灶叫了WebKit,但是它有希望能够得到那些为KHTML编写的网页,于是Safari标称自己为Mozilla/5.0 (Macintosh; U; PPC Mac OS X; de-de) AppleWebKit/85.7 (KHTML, like Gecko) Safari/85.5。
PS维基备注:在HTTP中,User-Agent字符串通常被用于内容协商,而原始服务器为该响应选择适当的内容或操作参数。例如,User-Agent字符串可能被网络服务器用以基于特定版本的客户端软件的已知功能选择适当的变体。
iOS 中获取 userAgent
- UIWebView
NSString *userAgent = [webView stringByEvaluatingJavaScriptFromString:@"navigator.userAgent"];
NSLog(@"userAgent === %@",userAgent);
- WKWebView
[wkWebView evaluateJavaScript:@"navigator.userAgent" completionHandler:^(id result, NSError *error) {
NSLog(@"userAgent === %@",result);
}];
iOS 中改变 userAgent
- UIWebView
// 此处可直接在 AppDelegate 中 didFinishLaunchingWithOptions:
UIWebView *webView = [[UIWebView alloc] initWithFrame:CGRectZero];
NSString *userAgent = [webView stringByEvaluatingJavaScriptFromString:@"navigator.userAgent"];
NSString *newUserAgent = [userAgent stringByAppendingString:@" iOS_userAgent"];
NSDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys:newUserAgent, @"UserAgent", nil];
[[NSUserDefaults standardUserDefaults] registerDefaults:dictionary];
- WKWebView
这是iOS 9.0 之后增加的一个属性,customUserAgent
@property (nullable, nonatomic, copy) NSString *customUserAgent NS_AVAILABLE(10_11, 9_0);
iOS 8.0 - iOS 9.0 之间 WKWebView 改变 userAgent 比较特殊,可参考 Set useragent in WKWebview
换一个角度想,对 userAgent 的了解也是对 Web 端学习的另一个开始,毕竟现在学习Web 刻不容缓啊。