iOS开发常见问题

十七 配置文件安装路径

如果 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";
     */
屏幕快照 2016-04-27 16.37.16.png

如何修改项目的名称

由于创建项目时,项目名称包含中文会,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];
iOS开发常见问题_第1张图片

如何避免 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;

你可能感兴趣的:(iOS开发常见问题)