(iOS)项目总结-项目中遇到的各种的问题和解决方法

  前言:     

 一到公司报道那时,便着手独立的去完成了一个项目,其中的辛酸泪也是不足为外人道也。这次算是一个新型的app,仍然是独立开发,但心境和想法却是完全的不同。下面说一次以前做开发时常常忽略的知识,也算是一种复习了吧。下面言归正传:


1、自带键盘的next用法

这算是比较常用的了吧,只要我们想到登录和注册界面,就应该自然而然的想到 - 键盘的next用法(当然不排除相当多的软件并没有实现这个功能)。

想法也就是:用户在输入用户名后,点击next跳转到下一个输入框。其实也不用想的如此复杂,在登录界面,我们完全可以用一个 if 语句做判断,去实现键盘的响应和注销响应。

代码如下: 

   - (BOOL)textFieldShouldReturn:(UITextField *)textField    { 

     UITextField *passTextFiled = (UITextField *)[self.view viewWithTag:201];   

   if (textField.tag == 200) {    

      [passTextFiled becomeFirstResponder];   

     }else{     

      [passTextFiled resignFirstResponder];  

    }   

   return YES; 

   }

这样就简单的在变成响应和注销响应之间实现了输入框的切换。

但还是存在一个问题,如果我实现注册界面的跳转输入框,并且在输入框很多的情况下,显然如果我仍是这样判断,会显得啰嗦和冗余。

我曾想过使用计数的方式,记录每一次的点击next后的tag,但实践中失败了,因为当我不通过next而是直接用手去触摸选择输入框时,则无法计数。

 这里先留个空白,等把手里的项目完成时再研究这个问题


2、UITextField的纠错和首字母大小写问题

这个问题只是简单的属性问题,在开发时如果忘记,建议多点进去看看,(如:command + UITextField)   

 //输入框中是否有个叉号,在什么时候显示,用于一次性删除输入框中的内容    self.clearButtonMode = UITextFieldViewModeWhileEditing;    

//是否纠错,本人感觉纠错是一个很反感的东西,但UITextField默认是 YES,这里我改成了NO      self.autocorrectionType = UITextAutocorrectionTypeNo;       

 //再次编辑就清空      self.clearsOnBeginEditing = YES;       

 //设置自动缩小显示的最小字体大小      self.minimumFontSize = 15;        

//设置键盘的样式,本人感觉这个设置对用户体验有影响。比如说我想打电话,Type为UIKeyboardTypeNumberPad,而不是其他     

 self.keyboardType = UIKeyboardTypeNamePhonePad;


3、iOS中图片的几种拉伸方法的使用

以下是apple给出的3种方法:     

   UIImage *image = [UIImage imageNamed:@"picture"];        

 //iOS5之前     

 // 左端盖宽度        

NSInteger leftCapWidth = image.size.width * 0.5f;       

 NSInteger topCapHeight = image.size.height * 0.8f;        

image = [image stretchableImageWithLeftCapWidth:leftCapWidth topCapHeight:topCapHeight];        

//iOS5之后       

 UIEdgeInsets insets = UIEdgeInsetsMake(image.size.height * 0.8f,image.size.width * 0.5f, 40, 40);       

 image = [image resizableImageWithCapInsets:insets];      

 //iOS6之后        UIEdgeInsets insets = UIEdgeInsetsMake(image.size.height * 0.8f,image.size.width * 0.5f, 40, 40);       

 image = [image resizableImageWithCapInsets:insets resizingMode:UIImageResizingModeStretch];    

下面是使用的解释:   

/**   

 *  - (UIImage *)stretchableImageWithLeftCapWidth:(NSInteger)leftCapWidth topCapHeight:(NSInteger)topCapHeight;    

 *  

  *  leftCapWidth代表左端盖宽度,topCapHeight代表顶端盖高度。系统会自动计算出右端盖宽度(rightCapWidth)和底端盖高度(bottomCapHeight)    

 * 算法如下:    

 * width为图片宽度  rightCapWidth = width - leftCapWidth - 1;       

 * height为图片高度 bottomCapHeight = height - topCapHeight - 1    

 *    

 *经过计算,你会发现中间的可拉伸区域只有1x1    

 *   

* stretchWidth为中间可拉伸区域的宽度        stretchWidth = width - leftCapWidth - rightCapWidth = 1;       

 * stretchHeight为中间可拉伸区域的高度        stretchHeight = height - topCapHeight - bottomCapHeight = 1;    

 *    

 *因此,使用这个方法只会拉伸图片中间1x1的区域,并不会影响到边缘和角落。    

 */

/**   

 * - (UIImage *)resizableImageWithCapInsets:(UIEdgeInsets)capInsets    

*  这个方法只接收一个UIEdgeInsets类型的参数,可以通过设置UIEdgeInsets的left、right、top、bottom来分别指定左端盖宽度、右端盖宽度、顶端盖高度、底端盖高度    

 * */       

 /**    

 *  - (UIImage *)resizableImageWithCapInsets:(UIEdgeInsets)capInsets resizingMode:(UIImageResizingMode)resizingMode    

对比iOS5.0中的方法,只多了一个UIImageResizingMode参数,用来指定拉伸的模式:       UIImageResizingModeStretch:拉伸模式,通过拉伸UIEdgeInsets指定的矩形区域来填充图片    UIImageResizingModeTile:平铺模式,通过重复显示UIEdgeInsets指定的矩形区域来填充图片    

 **/

图片拉伸的以上内容参考文章 《iOS图片拉伸技巧》讲的很好,建议大家多看看。


4、iOS中唤起自带浏览器(safari)的方法

也是一个简单的一句代码 ,这种也就是知道了就知道了,不知道就是抓耳挠腮吧 

   NSURL *url = [NSURL URLWithString:urlStr];    [[UIApplication sharedApplication] openURL:url];


5、iOS中唤起电话界面

app内部唤起电话界面的实现,是找了很多资料才有的一个结论(安全,并且拨打完之后可以返回app)

实现的方法是使用UIWebView 加载电话,目前这种方法是合法的,App Store也允许通过的。  

 NSURL *phoneURL = [NSURL URLWithString:[NSString stringWithFormat:@"tel:%@",newPhoneString]];     

 if (_phoneCallWebView) { 

               [_phoneCallWebView loadRequest:[NSURLRequest requestWithURL:phoneURL]];  

 }

但如果使用下面的这种方法,则可能不允许通过审核    [

[UIApplication sharedApplication] openURL:phoneURL];


6、iOS 调用地图的方法

app内部调用第三方app,这里有一个详细的文章《 IOS实现应用内打开第三方地图app进行导航》

- app内部调用地图,需要先检测用户手机上是否已经安装地图app。

我们常用的地图app有:高德、百度;国外有:谷歌(Google Map )。当然还有苹果自带的地图,随着iOS10的发布,苹果地图这块也有很大的完善和进步。

我使用Xcode模拟器实现时,会提示:

 1、-canOpenURL: failed for URL: "iosamap://" - error: "(null)" 。原因是:模拟器上没有高德地图。 

2、-canOpenURL: failed for URL: "comgooglemaps://" - error: "This app is not allowed to query for scheme comgooglemaps"。 原因是:LSApplicationQueriesSchemes 我自己马虎设成了字典类型。

首先说好的是iOS9以后,我们在app内部要跳转到其他软件时,需要在 Info.plist 中添加白名单。

方法为:在Info.plist中添加 key :LSApplicationQueriesSchemes  类型为:Array。

将高德、百度、谷歌的值填进去分别是:**iosamap**|**baidumap**|**comgooglemaps**

图片:


 至于下面代码中的URLScheme 和appName  

是在Info.plist 的URL types中添加  URL Scheme( URL Schemes 是一个数组,允许应用定义多个 URL schemes。 )  和  URL identifier(建议采用反转域名的方法保证该名字的唯一性,比如 com.yourApp.www)

图片如下:


 下面是具体的代码:

 __block NSString *urlScheme = urlScheme;   

 __block NSString *appName = appName;    

__block CLLocationCoordinate2D coordinate = self.coordinate;        

UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"选择地图" message:nil preferredStyle:UIAlertControllerStyleActionSheet];          

//apple自带的地图不需要判断        

UIAlertAction *action = [UIAlertAction actionWithTitle:@"苹果地图" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) {      

           MKMapItem *currentLocation = [MKMapItem mapItemForCurrentLocation]; 

           MKMapItem *toLocation = [[MKMapItem alloc] initWithPlacemark:[[MKPlacemark alloc] initWithCoordinate:coordinate addressDictionary:nil]];                      

 [MKMapItem openMapsWithItems:@[currentLocation, toLocation]                          launchOptions:@{

MKLaunchOptionsDirectionsModeKey: MKLaunchOptionsDirectionsModeDriving,MKLaunchOptionsShowsTrafficKey: [NSNumber numberWithBool:YES]}];        

}];        

 [alert addAction:action];        

 //判断百度地图   

 if ( [[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"baidumap://"]])      

{        UIAlertAction *action = [UIAlertAction actionWithTitle:@"百度地图" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) {                       

 NSString *urlString = [[NSString stringWithFormat:@"baidumap://map/direction?origin={{我的位置}}&destination=latlng:%f,%f|name=目的地&mode=driving&coord_type=gcj02",coordinate.latitude, coordinate.longitude] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

  [[UIApplication sharedApplication] openURL:[NSURL URLWithString:urlString]];         

 }];        

[alert addAction:action];      

}     

 //判断高德地图     

 if ( [[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"iosamap://"]])      

 {        

UIAlertAction *action = [UIAlertAction actionWithTitle:@"高德地图" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) {                        

NSString *urlString = [[NSString stringWithFormat:@"iosamap://navi?sourceApplication=%@&backScheme=%@&lat=%f&lon=%f&dev=0&style=2",appName,urlScheme,coordinate.latitude, coordinate.longitude] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];  

        [[UIApplication sharedApplication] openURL:[NSURL URLWithString:urlString]];                    }];       

 [alert addAction:action];    

}        

 //判断谷歌地图   

 if ( [[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"comgooglemaps://"]])    {       

 UIAlertAction *action = [UIAlertAction actionWithTitle:@"谷歌地图" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) {                       

 NSString *urlString = [[NSString stringWithFormat:@"comgooglemaps://?x-source=%@&x-success=%@&saddr=&daddr=%f,%f&directionsmode=driving",appName,urlScheme,coordinate.latitude, coordinate.longitude] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];                      [[UIApplication sharedApplication] openURL:[NSURL URLWithString:urlString]];          

}];                

[alert addAction:action];    

}        

UIAlertAction *action = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:nil];    [alert addAction:action];        

[self presentViewController:alert animated:YES completion:^{          

}];    

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念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

推荐阅读更多精彩内容