iOS开发中遇到过的坑

iOS开发中遇到过的坑

前言

做iOS开发这么长时间以来,遇到过不少难题,也踩过不少坑,本来没想过要写这篇文章,但是鉴于以下三点,笔者决定对遇到过的并且还能回忆起来的问题做个记录。

  • 每次问题解决后,满满的成就感,但是当下一次再遇到时,又是一脸懵逼。这个问题我好像见过,但就是不记得怎么解决,记录下来方便以后查阅。
  • 每次面试的时候,面试官总会问我,你在开发中遇到过哪些问题,怎么解决的?问题嘛,挺多的,但是你要我叙述嘛,我......我......我居然一时想不起来,迷之尴尬????(面试官当时想法:一看就是个没工作经验伪造简历的),冤枉啊。
  • 为遇到同样问题的开发者提供一个参考

那些遇到过的问题与踩过的坑

1.手机录音或通话时,app界面整体下移

当你的iphone在录音或者通话时,打开app你会发现,整个界面都下移了20像素,这个问题对于scrollView、tableView等可以垂直滚动的视图可能没有太大影响,但是对于那些不能滚动的视图,就有可能底部被遮盖20像素

笔者在网上查阅了资料,也试过多种方法,这个问题依然存在,最后笔者不得不使用大绝招来解决,何为大绝招?很简单,位置尺寸写死。项目中导航控制器是自定义的,在自定义的类中添加如下代码就OK了

2.点击导航栏下方也会触发导航栏按钮的点击事件

如图所示,每次想选中右上角的图片,结果总是触发“取消”事件,明明没有点到导航栏上面去,问题的原因不清楚,解决方法创建一个UINavigationBar的分类,重写hitTest方法

如果触摸点不在它上面,就不让它接收用户交互,然后使用系统的事件处理方法去处理

3.输入中文时限制字符长度

限制字母、数字、符号等其他非中文字符的长度大家应该都知道咋整,但如果是中文输入法,这就比较蛋疼了。举个例子,限制长度为5,输入“我爱写代码”,当已经输入“我爱写”两字,然后输入“代码”时就会出现如下情况

根本写不进去啊,这是为什么呢?因为输入的拼音也被计算在了字符串长度之内,导致输入“da”以后就不能继续输入了,可通过下面的办法解决

4.修改导航栏颜色

这个问题对有经验的开发者来说不是问题,但是当年笔者刚入行时,确实被这个问题折腾了好久。比如想设置导航栏的颜色为蓝色


1

self.navigationController.navigationBar.backgroundColor = [UIColor blueColor];

运行,然后......????这特么是蓝色?笔者确定自己不是色盲

后来才知道,设置导航栏的背景色,需要设置barTintColor而不是backgroundColor


1

self.navigationController.navigationBar.barTintColor = [UIColor blueColor];

5.界面莫名其妙下移

这个问题跟上面的问题一样,都是比较基础的问题,有经验的人都知道如何解决,但是笔者曾经也被折磨过

为什么下面textView的内容不是从最上面开始的,而且还不能滚上去,当初真的被这种情况折腾的死去活来的,改frame,改约束,都没效果。后来才知道,当有导航控制器时,系统会默认将第一个添加的scrollView或其子类视图的内容下移64个像素,下面的textView是先添加的,所以其内容被下移了,而上面的却没有,解决方法是在控制器里加上下面这句代码


1

self.automaticallyAdjustsScrollViewInsets = NO;

6.GCD组函数

笔者在开发中遇到过这样一个功能,某个界面列表上面是企业,下面是联系人,而且获取企业列表与联系人列表的接口不是同一个,必须等企业跟联系人列表数据都获取完毕后才能刷新,于是就用到了GCD组函数

然而问题来了,[[IBOSServer shared]...]这玩意儿是封装好的,并且是个异步函数,大家应该都知道,异步函数不会阻塞线程,不用等里面的内容执行完就返回了,这就导致数据还没拿到,就开始执行notify里面的代码了。后来笔者发现,原来GCD组函数还有一种用法,完美解决问题

7.UISearchController

iOS8才出来的,用来替换UISearchBar + UISearchDisplayController的组合方式,项目中有用到搜索功能,于是笔者就尝试着用了一下UISearchController,将搜索框添加到了tableView的tableHeaderView上。然而当点击搜索框准备搜索时,神奇的事情发生了

搜索框居然飞到九霄云外去了,好难过,这不是我要的那种结果,结果.....
怎么解决呢?在控制器里加上下面这句代码就OK了,至于为什么,呵呵????,不知道


1

self.definesPresentationContext = YES;

8.自定义相机照片截取

这个问题说难不难,说简单也不简单,笔者当时确实花了很长一段时间才弄清楚,但是当问题解决后,感觉这特么也不复杂啊,之前怎么就没整明白呢

问题是这样的,在使用自定义相机拍完照后,需要对图片的指定区域(蓝色方框内的区域)进行截取然后上传,这里存在两个问题

拍摄时你所看到的区域,跟实际拍出来的区域是不一样的

上图就是实际拍出来的图片,明显比拍摄时看到的图片要长,不过宽度是一样的

  • 照片的坐标系与我们平时开发所使用的坐标系是不一样的
    开发中所使用的视图坐标系是以左上角为原点的,横向为x轴,纵向为y轴,而拍摄出来的照片是以右上角为原点的,横向为y轴,纵向为x轴

我们先来看一幅图

由于拍摄时所看到视图宽高比与实际拍摄出来的图片的宽高比并不一致,所以导致图片经过等比例缩放到宽度一样时,高度有一部分超出了我们的可视范围,首先,我们要计算出超出部分的高度


1

2

3

4

//_cameraView为相机视图,即拍摄时看到图片的区域

CGFloat scale = image.size.width / _cameraView.width;//计算出缩放的比例

CGFloat showImageH = image.size.height / scale;//缩放后图片的高度

CGFloat offsetY = (showImageH - _cameraView.height) * 0.5;//上下超出的部分是相等的,所以*0.5得出上面超过的部分

超出部分的高度计算完后,我们就要来计算蓝色方框(_circleView,_cameraView的子控件)的坐标了


1

2

3

4

x:(offsetY+_circleView.y) * scale,别忘了乘以缩放比例

y:_circleView.x * scale,因为circleView在父控件中水平居中,所以_circleView在父控件中的x值乘以缩放比就是在图片坐标系中的y值

width:_circleView.height scale

height:_circleView.width scale

然后根据计算好的frame截取图片就ok了


1

2

3

CGRect rect = CGRectMake(x, y, width,height);

CGImageRef tailorImageRef = CGImageCreateWithImageInRect(photo.CGImage, rect);

UIImage *tailorImage = [UIImage imageWithCGImage:tailorImageRef];

结束语

遇到过的坑,远远不止上面这些,不过有些不记得了,以后遇到了再补上吧!

时间: 2024-10-12 09:28:17

iOS开发中遇到过的坑的相关文章

iOS开发中遇到的坑 韩俊强的博客( 草稿)

从事iOS开发有些年月了,从最开始的磕磕绊绊,不知所措,到现在的遇到困难都能快速做出最佳方案处理,中间经历了不可或缺的痛苦.在项目开发中,本人有用印象笔记记录的习惯,所以很多重复出现的坑,很快迎刃而解,而不在同一个地方摔倒两次.为此,特意总结了一下开发中经常遇到的坑,有些可能和你形成共鸣,有些在你看来或许是小儿科,不喜勿喷. A valid provisioning profile for this executable was not found. 解决问题所在:发布证书无法运行在真机上!!!

iOS开发中UIPopoverController的使用详解

这篇文章主要介绍了iOS开发中UIPopoverController的使用,代码基于传统的Objective-C,需要的朋友可以参考下 一.简单介绍 1.什么是UIPopoverController 是iPad开发中常见的一种控制器(在iPhone上不允许使用) 跟其他控制器不一样的是,它直接继承自NSObject,并非继承自UIViewController 它只占用部分屏幕空间来呈现信息,而且显示在屏幕的最前面 2.使用步骤 要想显示一个UIPopoverController,需要经过下列步骤

iOS开发中一些有用的小代码

1.判断邮箱格式是否正确的代码: //利用正则表达式验证 -(BOOL)isValidateEmail:(NSString *)email { NSString *emailRegex = @"[A-Z0-9a-z._%+-][email protected][A-Za-z0-9.-]+\\.[A-Za-z]{2,4}"; NSPredicate *emailTest = [NSPredicate predicateWithFormat:@"SELF MATCHES%@&qu

IOS开发中使用CNContact对通讯录增删改查

IOS开发中使用CNContact对通讯录增删改查 首先当然是把CNcontact包含在工程中: 1 @import Contacts; 1.下面是增加联系人的程序段: 1 CNMutableContact * contact = [[CNMutableContact alloc]init]; 2 contact.imageData = UIImagePNGRepresentation([UIImage imageNamed:@"22"]); 3 //设置名字 4 contact.gi

ios开发中-AFNetworking 的简单介绍

Blog: Draveness 关注仓库,及时获得更新: iOS-Source-Code-Analyze 在这一系列的文章中,我会对 AFNetworking 的源代码进行分析,深入了解一下它是如何构建的,如何在日常中完成发送 HTTP 请求.构建网络层这一任务. AFNetworking 是如今 iOS 开发中不可缺少的组件之一.它的 github 配置上是如下介绍的: Perhaps the most important feature of all, however, is the ama

iOS 开发中用户记住账户,密码

在iOS开发中经常会用到记住账户.密码,以此来提高用户的体验.下面就浅谈一下账户.密码的存储. 一.登录 记录已登录用户步骤,存入偏好设置中存储放入一个数组. 具体存储 1:存储用户到偏好设置中,其中用户是一个数组向服务器响应客户端后的一些操作(如果响应数据成功)其中用户和密码是一一对应的 1.1先从沙盒中偏好设置中读取对应的用户集合 读取用户名: NSMutableArray *AccArys = [NSMutableArray arrayWithArray:[[NSUserDefaults

iOS开发中KVC、KVO简介

在iOS开发中,KVC和KVO是经常被用到的.可以使用KVC对对象的属性赋值和取得对象的属性值,可以使用KVO监听对象属性值的变化.简单介绍一下KVC和KVO. 一:键值编码(KVC) KVC,全称 Key Value Coding(键值编码),是OC 语言的一个特性,使用KVC,可以对对象的属性进行动态读写. KVC的操作方法由 NSKeyValueCoding协议提供,而NSObject已经实现了这个协议,因此OC中的几乎所有对象都可以使用KVC操作.常用的KVC操作方法有: (1)设置属性

iOS开发中打电话发短信等功能的实现

在APP开发中,可能会涉及到打电话.发短信.发邮件等功能.比如说,通常一个产品的“关于”页面,会有开发者的联系方式,理想情况下,当用户点击该电话号码时,能够自动的帮用户拨出去,就涉及到了打电话的功能. iOS开发中,有三种方式可以打电话: (1)直接跳到拨号界面,代码如下 1 2 NSURL *url = [NSURL URLWithString:@"tel://10010"];  [[UIApplication sharedApplication] openURL:url]; 缺点:

iOS开发——淫技篇&iOS开发中各种淫技总结(六)

iOS开发中各种淫技总结(六) swift中指针的使用 在 Swift 中,指针都使用一个特殊的类型来表示,那就是 UnsafePointer<T>.遵循了 Cocoa 的一贯不可变原则,UnsafePointer<T> 也是不可变的.当然对应地,它还有一个可变变体,UnsafeMutablePointer<T>.绝大部分时间里,C 中的指针都会被以这两种类型引入到 Swift 中:C 中 const 修饰的指针对应 UnsafePointer (最常见的应该就是 C