iOS开发常见问题

作者: 明月钓无痕 | 来源:发表于2016-04-20 15:05 被阅读444次

    十七 配置文件安装路径

    如果 xcode 中配置文件安装比较多,有些用不到了,可以到下面路径进行删除.
    ~/Library/MobileDevice/Provisioning Profiles

    十六 去除 tabbar 上方黑线

    1> 直接剪切
    通过打印 tabBar 的子 view, 我们发现黑线的 y 值是-0.5;

    <UIImageView: 0x7fd863647140; frame = (0 -0.5; 375 0.5); autoresize = W; userInteractionEnabled = NO; layer = <CALayer: 0x7fd86364c290>>
    
        [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>

    后台返回的经常会见到(null), 那么<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: <null>, 0x103869d80
         */
    

    由上面得出以下结论.
    1.nil, 表示的是空指针,指向的对象是空,地址是0x0, 打印返回的结果是(null).
    2.[NSNull null],表示一个对象是空值,是有内存地址的.打印结果是<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 <sys/utsname.h>
     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];
    

    如何避免 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开发常见问题

      本文链接:https://www.haomeiwen.com/subject/afiwlttx.html