[程序员日记]iOS 开发中遇到的问题(客户端篇)

在项目开发中,自己遇到一些问题及解决方法,不断更新中。

(1)UINavigationBarUITabBar上有一条横线,是ShadowImage,默认是黑色的。在项目开发中,可以改变其图片和颜色。在下图个人热点图中可以看到导航栏下面的黑线。

[self.navigationController.navigationBar  setShadowImage:[UIImage imageWithColor:MyColor]];

(2) statusBar默认的高度是20.0f,在使用微信或者QQ通话,热点等功能进入后台时,statusBar的高度会变为40.0f,下方的布局也会发生变化,在此要根据statusBar的变化调整布局,设置监听监听其变化。

打开热点时`statusBar`高度变化

监听对象为UIApplicationDidChangeStatusBarFrameNotification

[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(statusBarFrameWillChange:) name:UIApplicationDidChangeStatusBarFrameNotification object:nil];//添加监听

[[NSNotificationCenter defaultCenter]removeObserver:self name:UIApplicationDidChangeStatusBarFrameNotification object:nil];//移除监听

当前statusBar的高度也是可以获取的:

NSValue *rectValue = [notification.userInfo objectForKey:UIApplicationStatusBarFrameUserInfoKey];
CGRect statusRect = [rectValue CGRectValue];
CGRect statusFrame = [self.view convertRect:statusRect fromView:[[UIApplication sharedApplication]keyWindow]];
CGFloat statusHeight = statusFrame.size.height;

(3)在iPad开发时,使用iOS 9系统会出现tableviewCell的位置变化,在开发中默认与右侧是15个像素,可是现在明显大的多,这是因为在iOS 9后tableview的一个属性发生了变化。

tableviewCell位置变化

需要调整

tableView.cellLayoutMarginsFollowReadableWidth = NO;

补充,因为方法是iOS9之后出现的,因此在调用时需要判断系统是否大于9.0

if([UIDevice currentDevice].systemVersion.floatValue >= 9.0){
    tableView.cellLayoutMarginsFollowReadableWidth = NO;
}

(4)在做直播功能模块,使用到 弹幕 的功能(弹幕使用第三方库BarrageRenderer),弹幕为横屏自动开启,竖屏时关闭。在测试用发现弹幕有时开有时关,最终发现在屏幕横放时无法显示。原因是设置方法出现错误。

通过[UIDevice currentDevice].orientation 的状态判断横竖屏会出现错误,因为其枚举类型是UIDeviceOrientation,在查看其枚举类型时会发现其除了Portrait LandscapeLeft LandscapeRight PortraitUpsideDown外还有FaceUp FaceDown两个状态,忽略对其的设置会产生影响。

UIDeviceOrientation 枚举

typedef NS_ENUM(NSInteger, UIDeviceOrientation) {
    UIDeviceOrientationUnknown,
    UIDeviceOrientationPortrait,            // Device oriented vertically, home button on the bottom
    UIDeviceOrientationPortraitUpsideDown,  // Device oriented vertically, home button on the top
    UIDeviceOrientationLandscapeLeft,       // Device oriented horizontally, home button on the right
    UIDeviceOrientationLandscapeRight,      // Device oriented horizontally, home button on the left
    UIDeviceOrientationFaceUp,              // Device oriented flat, face up
    UIDeviceOrientationFaceDown             // Device oriented flat, face down
} __TVOS_PROHIBITED;

在对其使用时还可以将其转换成UIInterfaceOrientation,因为后者只有常见的几种类型。

UIDeviceOrientation orientation             = [UIDevice currentDevice].orientation;
UIInterfaceOrientation interfaceOrientation = (UIInterfaceOrientation)orientation;

UIInterfaceOrientation枚举

typedef NS_ENUM(NSInteger, UIInterfaceOrientation) {
    UIInterfaceOrientationUnknown            = UIDeviceOrientationUnknown,
    UIInterfaceOrientationPortrait           = UIDeviceOrientationPortrait,
    UIInterfaceOrientationPortraitUpsideDown = UIDeviceOrientationPortraitUpsideDown,
    UIInterfaceOrientationLandscapeLeft      = UIDeviceOrientationLandscapeRight,
    UIInterfaceOrientationLandscapeRight     = UIDeviceOrientationLandscapeLeft
} __TVOS_PROHIBITED;

另外在横竖屏切换时我们会对屏幕的状态做监听,通常监听的是UIDeviceOrientationDidChangeNotification,监听得到的结果是UIDeviceOrientation,也可以监听UIApplicationDidChangeStatusBarFrameNotification,得到UIInterfaceOrientation。当然UIApplicationDidChangeStatusBarFrameNotification也可以监听热点等事件中出现的问题,如问题2.

(5)引入sdk报错(非pod)

_res_9_ninit", referenced from: _setup_dns_server in QNResolver.o 
  1. 项目中需导入 libresolv.dylib或libresolv.9.dylib。(Build Phases --- Link Binary With Libraries);
  2. 或 (Build Settings --- Linking --- Other Linker Flags) 添加 -lresolv 选项

(6)在使用tableView时,使用footerView在最后一行默认不显示最后一条横线。简单粗暴的方法,在cell中重写layoutSubviews方法。

- (void)layoutSubviews {
    [super layoutSubviews];

    for (UIView *subview in self.contentView.superview.subviews) {
        if ([NSStringFromClass(subview.class) hasSuffix:@"SeparatorView"]) {
              subview.hidden = NO;
        }
    }
}
显示tableView最后一行横线

(7)项目中有视频缓存,使用腾讯云下载完成下载功能,于是问题就来了,相信在做视频缓存、下载功能的同行可能也会遇到这种问题。

视频下载完成后,在 我的缓存中 查看,没有问题,但当软件更新或重新安装,视频列表还在,但视频打不开了。

查看腾讯云视频成功回调,发现在返回的字典中,缓存文件的路径是完整的。如图。

查看文件路径

查看文件路径并重新安装后会发现文件内容没变,但文件名变了。

重新安装前
重新安装后

这说明,app在重新安装或升级后,会重新建一个文件,并将原来的文件全部copy过去,然后将原文件删除。

知道原因之后就要解决了,当然解决的方法简单粗暴,既然是文件名,那就进行拼接和裁剪了。在plist文件中存储的是裁剪后的后半段路径,而读取文件路径后再拼接上Caches地址。

获取Caches目录路径的方法:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
NSString *cachesDir = [paths objectAtIndex:0];

(8)iOS给好评时一般会直接打开app store应用详情界面,其实也可以直接跳转到评论页面,更有利于引导用户打分和评论。(将下面id改成自己的app id即可)

[[UIApplication sharedApplication]openURL:[NSURL URLWithString:@"http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewContentsUserReviews?id=id1128294199&pageNumber=0&sortOrdering=2&type=Purple+Software&mt=8"]];

直接跳转到详情

https://itunes.apple.com/cn/app/jia-zhang-mu-ke/id1128294199?mt=8

(9)键盘操作
测试发现一个问题,切换输入法的时候键盘高度会上移,查找发现,UIKeyboardWillShowNotification监听会调用多次,每次输入法(如中英文)切换时会调用,从而调用相关修改布局的方法。

多次调用监听

初始时textField所在的view不显示在视图中,通过button的触发才显示,因此原监听后的调用方法:

  float time = [noti.userInfo[UIKeyboardAnimationDurationUserInfoKey] floatValue];
  CGRect beginRect = [dic[UIKeyboardFrameBeginUserInfoKey] CGRectValue];
  CGRect endRect = [dic[UIKeyboardFrameEndUserInfoKey] CGRectValue];
  [UIView animateWithDuration:time animations:^{
      self.bottomView.hidden = NO;
      CGRect rect = self.bottomView.frame;
      rect.origin.y -= (beginRect.origin.y - endRect.origin.y+50);
      self.bottomView.frame = rect;
  }];

尝试用值纪录调用次数,只记录第一次调用发现也不可行,故将其view隐藏,通过按钮的触发显示。

self.bottomView.hidden = NO;
rect.origin.y -= (beginRect.origin.y - endRect.origin.y);

[补充]
后来发现键盘高度会变化是由于IQKeybord惹的祸,将其禁用后使用原方法可以。

(10)UITextView回车发送
UITextField中有这样一个代理函数,可以实现键盘回车键发送的功能

- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text

但是UITextView中并没有这个方法,所以需要判断当前输入的字符是否是回车,然后做出响应的处理。在这个函数的最后一个参数text代表你每次输入的的那个字,所以:

- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:  (NSRange)range replacementText:(NSString *)text{
    if ([text isEqualToString:@"\n"]){
        return NO; 
    }

    return YES;
}

(11)TableView如何在初始化就选中某一行?
[self.tableView selectRowAtIndexPath:indexpath animated:YES scrollPosition:UITableViewScrollPositionMiddle]; //选中第5行

(12)UISwitch颜色的改变
switchView.onTintColor = [UIColor colorWithRed:225/256.0 green:225/256.0 blue:225/256.0 alpha:1];
switchView.thumbTintColor = DEF_LightBlueColor;

更多问题后续补充,欢迎探讨指正

文章优先发表于:http://keyliu.com
转载请注明出处。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,294评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,493评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,790评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,595评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,718评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,906评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,053评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,797评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,250评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,570评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,711评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,388评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,018评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,796评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,023评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,461评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,595评论 2 350

推荐阅读更多精彩内容

  • 概述在iOS开发中UITableView可以说是使用最广泛的控件,我们平时使用的软件中到处都可以看到它的影子,类似...
    liudhkk阅读 9,007评论 3 38
  • 作业一 作业二
  • 最近陆续看了「次第花开」,「透过佛法看世界」以及「正念的奇迹」,获益匪浅,被佛法的广阔无边和博大精深深深吸引。我做...
    寂颜慕菲阅读 757评论 0 1
  • 时间,太多说不清与道不明。 曾经扒着不放的等回头,如今面对回头,心情或许是那时候换位的一种体验,只是在换位中不公平...
    半颗西柚阅读 326评论 0 0