十七 配置文件安装路径
如果 xcode 中配置文件安装比较多,有些用不到了,可以到下面路径进行删除.
~/Library/MobileDevice/Provisioning Profiles
十六 去除 tabbar 上方黑线
1> 直接剪切
通过打印 tabBar 的子 view, 我们发现黑线的 y 值是-0.5;
>
[UITabBar appearance].clipsToBounds = YES;
这种方法虽然直接,对于去除 navi 的黑线也是有效的.但是本人不推荐这么去做.如果你的应用里没有突出的当然是可以的.
2> 删除黑线
和删除 navi 的差不多,不过不用进行二次遍历.
for (UIView *view in self.subviews) {
if ([view isKindOfClass:[UIImageView class]] && view.height < 1) {
[view removeFromSuperview];
}
}
当然这种删除方式,适合自定义的 tabBar, 如果是使用tabbarController 的属性的话,就不适用了.因为在tabbarController里我们拿不到 tabBar 的 subViews. 通过打印,会发现是空数组.这时我们可以使用KVC 使用自定义的 tabBar 去替换系统属性.
十五
后台返回的经常会见到(null), 那么
NSString *str = nil;
if ([str isEqualToString:@""] || str.length == 0) {
NSLog(@"str: %@, %p", str, str);
}
NSString *str2 = @"";
NSLog(@"str2: %@\n, %p", str2, str2);
NSNull *null = [NSNull null];
NSLog(@"null: %@, %p", null, null);
/*
str: (null), 0x0
str2:
, 0x102bb1098
null: , 0x103869d80
*/
由上面得出以下结论.
1.nil, 表示的是空指针,指向的对象是空,地址是0x0, 打印返回的结果是(null).
2.[NSNull null],表示一个对象是空值,是有内存地址的.打印结果是
3.对于字符串来讲一个空字符串和字符串是空是两种概念.如 str 和str2,两种写法. 如果有时候不确定返回的字符串是@""还是 nil, 最好使用[str isEqualToString:@""] || str.length == 0 这种判断方式. str 只使用** [str isEqualToString:@""] ** 是无效的.
十四 将字符串按照特定字符分割成数组
在某个功能中,后台返回的是字符串,但是要显示在不同的label 中,才注意到了这个方法.
NSString *str = @"a,b,c,d";
NSArray *array = [str componentsSeparatedByString:@","];
NSLog(@"%@", array);
/*
(
a,
b,
c,
d
)
*/
十三 网络请求
由于现在的请求是 HTTP,运行时报以下信息内容
App Transport Security has blocked a cleartext HTTP (http://) resource load since it is insecure. Temporary exceptions can be configured via your app's Info.plist file.
这时候需要在info.plist中添加一个字段.
十二 使 navi 变成透明的
for (UIView *view in self.navigationController.navigationBar.subviews) {
if ([view isKindOfClass:NSClassFromString(@"_UINavigationBarBackground")]) {
[view removeFromSuperview];
}
}
十一 如何使 webView 取消弹簧效果
通过打印webView 的 subViews 发现, webView 的子 View 中有个 _UIWebViewScrollView 的成员变量, 所以进行猜测.
for (UIView *view in webView.subviews) {
if ([view isKindOfClass:[UIScrollView class]]) {
UIScrollView *scrollView = view;
scrollView.bounces = NO;
}
}
注意到了 webView 有一个scrollView 的属性,那么更简单的做法是:
webView.scrollView.bounces = NO;
十 tableview 中没有数据的 cell 设置空白(没有数据,不显示分割线)
只需要给 tableView 的 tableFooterView 添加一个空的 View 即可
tableView.tableFooterView = [[UIView alloc] init];
九 给 textfiled 添加背景图
有一个属性background,在习惯性找backgroundImage 的时候,有时忽略了这个属性.
八 替换字符串
有时候需要替换字符串里的字符.
NSString *str = @"+1234+567890+";
// 替换字符
NSString *str2 = [str stringByReplacingOccurrencesOfString:@"+" withString:@"%2B"];
NSLog(@"%@", str2);
七 获取设备的一些信息
在实际应用中需要获取设备的信息.系统给了一个类UIDevice, 可以用来获取一些基本信息.
UIDevice *dev = [UIDevice currentDevice];
NSLog(@"%@\n%@\n%@\n%@\n%@\n", dev.model, dev.name, dev.localizedModel, dev.systemName, dev.systemVersion);
// 打印结果
/*
iPhone
明月钓无痕
iPhone
iPhone OS
9.3.1
*/
如果要获取具体的设备型号,比如要给专门的机型推送一些服务的话.那个就得拿到设备的类型.
// 在使用之前要导入头文件 #import
struct utsname systemInfo;
uname(&systemInfo);
NSString *deviceString = [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding];
NSLog(@"%@", deviceString);
// iPhone8,1 产品类型
通过拿到产品类型我们可以进而判断出机型. 下面是网上总结出来的
/*
//iPhone
if ([deviceString isEqualToString:@"iPhone1,1"]) return @"iPhone 1G";
if ([deviceString isEqualToString:@"iPhone1,2"]) return @"iPhone 3G";
if ([deviceString isEqualToString:@"iPhone2,1"]) return @"iPhone 3GS";
if ([deviceString isEqualToString:@"iPhone3,1"]) return @"iPhone 4";
if ([deviceString isEqualToString:@"iPhone3,2"]) return @"Verizon iPhone 4";
if ([deviceString isEqualToString:@"iPhone4,1"]) return @"iPhone 4S";
if ([deviceString isEqualToString:@"iPhone5,1"]) return @"iPhone 5";
if ([deviceString isEqualToString:@"iPhone5,2"]) return @"iPhone 5";
if ([deviceString isEqualToString:@"iPhone5,3"]) return @"iPhone 5C";
if ([deviceString isEqualToString:@"iPhone5,4"]) return @"iPhone 5C";
if ([deviceString isEqualToString:@"iPhone6,1"]) return @"iPhone 5S";
if ([deviceString isEqualToString:@"iPhone6,2"]) return @"iPhone 5S";
if ([deviceString isEqualToString:@"iPhone7,1"]) return @"iPhone 6 Plus";
if ([deviceString isEqualToString:@"iPhone7,2"]) return @"iPhone 6";
if ([deviceString isEqualToString:@"iPhone8,1"]) return @"iPhone 6s";
if ([deviceString isEqualToString:@"iPhone8,2"]) return @"iPhone 6s Plus";
//iPod
if ([deviceString isEqualToString:@"iPod1,1"]) return @"iPod Touch 1G";
if ([deviceString isEqualToString:@"iPod2,1"]) return @"iPod Touch 2G";
if ([deviceString isEqualToString:@"iPod3,1"]) return @"iPod Touch 3G";
if ([deviceString isEqualToString:@"iPod4,1"]) return @"iPod Touch 4G";
if ([deviceString isEqualToString:@"iPod5,1"]) return @"iPod Touch 5G"; return @"iPod Touch 5G";
//iPad
if ([deviceString isEqualToString:@"iPad1,1"]) return @"iPad";
if ([deviceString isEqualToString:@"iPad2,1"]) return @"iPad 2 (WiFi)";
if ([deviceString isEqualToString:@"iPad2,2"]) return @"iPad 2 (GSM)";
if ([deviceString isEqualToString:@"iPad2,3"]) return @"iPad 2 (CDMA)";
if ([deviceString isEqualToString:@"iPad2,4"]) return @"iPad 2 (32nm)";
if ([deviceString isEqualToString:@"iPad2,5"]) return @"iPad mini (WiFi)";
if ([deviceString isEqualToString:@"iPad2,6"]) return @"iPad mini (GSM)";
if ([deviceString isEqualToString:@"iPad2,7"]) return @"iPad mini (CDMA)";
if ([deviceString isEqualToString:@"iPad3,1"]) return @"iPad 3(WiFi)";
if ([deviceString isEqualToString:@"iPad3,2"]) return @"iPad 3(CDMA)";
if ([deviceString isEqualToString:@"iPad3,3"]) return @"iPad 3(4G)";
if ([deviceString isEqualToString:@"iPad3,4"]) return @"iPad 4 (WiFi)";
if ([deviceString isEqualToString:@"iPad3,5"]) return @"iPad 4 (4G)";
if ([deviceString isEqualToString:@"iPad3,6"]) return @"iPad 4 (CDMA)";
if ([deviceString isEqualToString:@"iPad4,1"]) return @"iPad Air";
if ([deviceString isEqualToString:@"iPad4,2"]) return @"iPad Air";
if ([deviceString isEqualToString:@"iPad4,3"]) return @"iPad Air";
if ([deviceString isEqualToString:@"iPad5,3"]) return @"iPad Air 2";
if ([deviceString isEqualToString:@"iPad5,4"]) return @"iPad Air 2";
if ([deviceString isEqualToString:@"i386"]) return @"Simulator";
if ([deviceString isEqualToString:@"x86_64"]) return @"Simulator";
if ([deviceString isEqualToString:@"iPad4,4"]||[deviceString isEqualToString:@"iPad4,5"]@"iPad4,5"]||[deviceString isEqualToString:@"iPad4,6"]) return @"iPad mini 2";
if ([deviceString isEqualToString:@"iPad4,7"]||[deviceString isEqualToString:@"iPad4,8"]||[deviceString isEqualToString:@"iPad4,9"]) return @"iPad mini 3";
*/
六 如何修改项目的名称
由于创建项目时,项目名称包含中文会,Bundle Identifier 中会直接使用-代替中文.所以项目名称一般会使用英文,实在不行要使用拼音.这样的话,安装到手机中的名称要显示自己想要的名称的话.
需要在** info.plist ** 中添加一项.** Bundle display name **.
对应的 Value 就是安装app 后,显示的名称.
五 图层渐变色
// 渐变色
CAGradientLayer *layer = [CAGradientLayer layer];
layer.frame = CGRectMake(100, 100, 200, 200);
layer.opacity = 0.4; // 不透明度
// 不加(id)的话,会报不是 oc 类型的错误
layer.colors = @[(id)[UIColor redColor].CGColor, (id)[UIColor yellowColor].CGColor, (id)[UIColor blueColor].CGColor];
// 颜色占的分割位置
layer.locations = @[@0.5, @0.7];
// 渐变色方向,左上角到右下角
layer.startPoint = CGPointMake(0, 0);
layer.endPoint = CGPointMake(1, 1);
[self.view.layer addSublayer:layer];
四 如何避免 CATextLayer 中的字体模糊
由于现在是Retina 屏幕,使用 CATextLayer时,设置完字体后显示会模糊.
下面看一下映射关系.
非Retina:1 Point = 1 x 1 Pixel
Retina:1 Point = 2 x 2 Pixel
由于 Retina 屏一个 Point 映射4个(2 * 2) Pixel,所以 scale为2.
所以这时牵扯到一个属性:contentsScale
CATextLayer *layer = [[CATextLayer alloc] init];
layer.frame = CGRectMake(100, 100, 200, 200);
layer.backgroundColor = [UIColor redColor].CGColor;
layer.string = @"hahah";
layer.fontSize = 20;
layer.contentsScale = 2; // 这个是重点,不设置的话, string 就会模糊
[self.view.layer addSublayer:layer];
三 如何设置导航栏标题的字体
有两种方案:
方案一: 使用带属性的字符串,这种方法简单明了.
UIColor *color = [UIColor redColor];
NSDictionary *dict = @{
NSForegroundColorAttributeName : color,
NSFontAttributeName : [UIFont systemFontOfSize:20]
};
self.navigationController.navigationBar.titleTextAttributes = dict;
方案二: 设置navigationItem.titleView. 给titleView赋值一个 label, 这样子的话修改起来都是常规做法.
UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 80, 44)];
label.text = @"测试";
label.textColor = [UIColor redColor];
label.textAlignment = NSTextAlignmentCenter;
self.navigationItem.titleView = label;
二 如何删除导航栏下的黑线
// 使用递归遍历所有的层级的 view 层,我们可以看到有一个 height=0.5的 imageView, 把这个删掉就好了.
- (void)getSubViews:(UIView *)view {
for (UIView *subView in view.subviews) {
if (subView.subviews.count) {
[self getSubViews:subView];
} else {
if (subView.frame.size.height <= 1) {
[subView removeFromSuperview];
}
}
}
}
一 如何改变状态栏的字体颜色
-
1 需要在 info.plist 中添加一个字段,否则使用下面的代码会无效.
- 2 在 AppDelegate的- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions; 执行一个方法.
// 字体设置成白色.
[UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleLightContent;