澳门新葡京平台游戏:iOS开发错误以及解决方案

作者:澳门新葡京平台游戏

今天看到有人在群里问到给导航栏设置背景图片后,子视图的布局都是从导航栏的底部开始布局,但是当我亲身测试的时候,却没有发现这个问题,还是从0点开始布局,我就问了当时我出现问题的同学,他说他是用纯代码写的,我改用纯代码后发现是那位同学描述的那样从导航栏的底部开始布局,但是为什么storyboard不是这样啦.最后我打开有storyboard的工程查找原因最终我找到了这样一个东西:

UINavigationBar是我们在开发过程中经常要用到的一个控件,下面我会为大家介绍一些常用的用法。

Swift_ios_开发之UINavigationController的常用属性那些事

在iOS的学习和开发中,经常会遇到一些bug需要调试很久,查找很多资料才能解决,本文就针对这类问题进行归纳和总结,一方面是记录自己的开发历程中所遇到的问题,另一方面希望大家在遇到这个问题的时候能通过本文的解决方法进行debug,快速调试( 本文将会持续地不定时地更新)

澳门新葡京平台游戏 1storyboard中的属性设置

  1. 设置导航栏的标题

1.导航栏是否隐藏 self.navigationController?.navigationBar.hidden = false 2.导航栏的最底部颜色设置 //backgroundColor 是最底下的color self.navigationController?.navigationBar.backgroundColor = UIColor.redColor() 3.导航栏
1.导航栏是否隐藏
self.navigationController?.navigationBar.hidden = false
2.导航栏的最底部颜色设置
//backgroundColor 是最底下的color
self.navigationController?.navigationBar.backgroundColor = UIColor.redColor()
3.导航栏的表层颜色,即首先看到的颜色
//barTintColor 是表层颜色
self.navigationController?.navigationBar.barTintColor = UIColor.grayColor()
4.导航栏中间标题title的颜色,大小,字体设置
self.navigationController?.navigationBar.titleTextAttributes = [NSForegroundColorAttributeName:UIColor.blueColor(),NSFontAttributeName:UIFont(name: "Heiti SC", size: 24.0)!]
5.导航栏隐藏左边backitem,即leftbarbuttonitem
//完全隐藏backItem//
self.navigationItem.setHidesBackButton(true, animated: true)
6.导航栏leftbarbuttonitem的颜色设置
swiftself.navigationController?.navigationBar.tintColor = UIColor.whiteColor()
7.导航栏leftbarbuttonitem的字体,颜色,大小设置
self.navigationItem.leftBarButtonItem?.setTitleTextAttributes([NSForegroundColorAttributeName:UIColor.blueColor(),NSFontAttributeName: UIFont(name: "Chalkduster", size: 13)!], forState: UIControlState.Normal)
8.导航栏重新定义leftbarbuttonitem
//重新定义backItem,将覆盖原来的BackItem.与storyboard中拖入一个item,效果一样。都是覆盖原来的backitem。

1. UINavigationController无法设置navigationItem的内容:

对于navigationController,如果想设置navigationBar中navigationItem的title,leftBarButtonItem,rightBarButtonItem,不能直接设置navigationController的这几个属性,这样设置是没效果的,因为navigationController用压栈的方式管理多个视图控制器,以及多个navigationBar,所以要设置这几个属性必须通过navigationController所管理的视图控制器来设置,例如viewController.navigationItem.tilte = @"nineteen"; | viewController.title = @"nineteen";(这种方式在有TabbarViewController的时候也会设置下面对应的title),但是需要注意的是不要这样写,viewController.navigationController.title = @"nineteen";这样写是没有效果的。

默认是勾选的,先看一下勾选的效果.

这个不多说,直接上代码

//第一种代码定义方式self.navigationItem.setLeftBarButtonItem(UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.Add, target: self, action: "function"), animated: true)

2.UIView或者是UIView的子类无法显示:

在自定义button等控件的时候,有时候在代码都写好之后发现控件无法显示,出现这种情况很大可能性是因为frame或者是size的设置有问题,debug应该从这两个方面进行。

澳门新葡京平台游戏 2默认勾选效果

self.navigationItem.title = @"UINavigationBar使用总结";

//第二种代码定义方式
self.navigationItem.leftBarButtonItem = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.Add, target: self, action: "function")

3.UITableView在显示后才获取到数据:

在写tableView获取网络数据的时候,如果采用了MVC模式,对于数据类,如果获取网络上的数据是通过异步进行的,那么可能会出现这样的情况:当tableView加载完成之后数据类对象才获取到网络中的数据。这时候我们采取的解决办法是,添加刷新控件,在刷新控件的方法体中进行获取网络数据的异步方法执行,然后在获取到数据之后便停止刷新,同时刷新tableView。

再看去掉勾选的效果

  1. 设置导航栏的背景颜色

//第三种代码定义的方式self.navigationItem.setLeftBarButtonItem(UIBarButtonItem(title: "<Grandre", style: UIBarButtonItemStyle.Plain, target: self, action: "function"), animated: true)
9.导航栏设置成透明
//将导航栏设置成透明
self.navigationController?.navigationBar.setBackgroundImage(UIImage(), forBarMetrics: UIBarMetrics.Default)
self.navigationController!.navigationBar.shadowImage = UIImage()
self.navigationController?.navigationBar.translucent = true

4.button使用设置圆形时使用backgroundImage而不是Image

我们在使用button的时候,要根据情况来选择设置backgroundImage还是Image,我们在创建圆形头像(button类型)的时候,我们需要设置backgroundImage,然后对layer进行设置,而不是设置Image。

澳门新葡京平台游戏 3去掉勾选的效果

//通过barTintColor来设置背景色self.navigationController.navigationBar.barTintColor= [UIColorredColor];

5. 导入了第三方框架,删除之后,仍然出现警告"ld: warning: directory not found for option"

使用了第三方框架后,发现该框架不是很好用或者是发现了更加好用的框架,想要更换,于是把以前的框架给删除,但是删除之后还会报一个警告“ld: warning: directory not found for option”,这就很尴尬了,这个问题也是急得我头疼(轻微强迫症),这时候需要在targets的Build Settings中找到Library Search Paths和Framework Search Paths,然后将保存的路径删除即可-

刚才我们去掉勾选的属性是对应纯代码中的edgesForExtendedLayout这个属性,sb是默认勾选的所以会发生从0点开始布局,当我们去掉勾选就正常了.

得到的效果如下:

6、使用UICollectionViewController报错:"UICollectionView must be initialized with a non-nil layout parameter

纯代码可以修改这个属性来影响布局.

澳门新葡京平台游戏 4

有些开发者在使用集合和列表的功能时习惯使用控件的类型,如UICollectionView或者是UITableView,但是还有些开发者就习惯使用UICollectionViewController和UITableViewController,在使用UICollectionView的时候,创建它之前,我们都会先创建一个UICollectionViewFlowLayout,然后在创建的时候调用initWithCollectionViewLayout这个方法传入。然而,我们在使用UICollectionViewController的时候,做了如下步骤:创建了自定义的继承于UICollectionViewController的类,然后在该类的viewDidLoad中调用self.collectionViewFlowLayout

XXX,运行就会发现出现了这个错误,我们会思考,这里是传入了flowLayout的啊,为什么会报错呢,如果你遇到了这个错误,还不知道怎么解决的话,那么就可能和我这时候一样对视图控制器的加载机制理解还不够。
分析:
viewDidLoad方法表示视图已经加载完毕之后需要调用的代码,换句话说,调用viewDidLoad中的代码时,collectionView已经加载完毕,但是,并没有给它传入一个UICollectionLayout,所以就出现这个错误
解决方案
在创建自定义继承于UICollectionViewController的类的时候,就应该传入一个UICollectionLayout,通过调用initWithLayout方法:)

好了问题也搞清楚了.就不多说了.

Snip20150912_1.png

7、安装cocoaPods的时候报错"Error fetching Http://ruby.taobao.org/: bad response Not Found 404 (Http://ruby.taobao.org/specs.4.8.gz)"

网上的部分教程说描述说替换ruby软件源为你淘宝软件源的代码为:"$ gem sources -a Http://ruby.taobao.org/",解决办法为将网址中的http改为https,因为淘宝已经关闭了http的镜像服务,改为https的镜像服务了。

设置导航栏透明:

barTintColor: 这个属性需要在iOS7以上才可以使用; 如果要支持iOS6以及以下的系统,可以参考这篇文章:UINavigationBar Background Color

8、上架APP出现错误 " ERROR ITMS-9000: “Unsupported architectures. Your executable contains unsupported architectures '[x86_64, i386]' "

首先我解决这个问题是参考了stackoverflow以及一个国外的个人博主的一篇博文http://ikennd.ac/blog/2015/02/stripping-unwanted-architectures-from-dynamic-libraries-in-xcode/(因为国内并没有相关描述 — —)
原因
我在导入第三方SDK的时候,使用了动态库的手动导入(没有使用cocoaPods进行SDK的管理)
解决方案
将动态库换为静态库导入(苹果是推荐使用静态库的)

[self.navigationController.navigationBarsetBackgroundImage:[UIImagenew]forBarMetrics:UIBarMetricsDefault];

  1. 设置导航栏的背景图片
9、使用storyboard中的UITableView的时候,默认情况下在UITableView的顶部会有一个空白区域(第一次见到感觉好二..)

这个是因为在iOS 7之后, UIViewcontroller新增了属性automaticallyAdjustsScrollViewInsets,即是否根据按所在界面的navigationbar与tabbar的高度,自动调整UIScrollView的inset。
解决方案
在该视图控制器(storyboard中)的属性中将Adjust Scroll View Insets这个选项的勾选取消(默认是选中的)

[self.navigationController.navigationBarsetShadowImage:[UIImagenew]];

除了通过设置背景颜色来改变导航栏的外观外,我们还可以通过背景图片来设置导航栏的外观。

10、UITableView中的分割线无法显示(仅仅在滑动时显示,停止滑动时不会显示)

这是由于模拟器不是100%的比例显示造成的问题,只要把模拟器的显示比例调整到100%就会显示正常了。

如果喜欢小编,可以点击关注,我会不定期的更新一些文章,也可以关注我的专题

[self.navigationController.navigationBarsetBackgroundImage:[UIImageimageNamed:@"Background"]                                                  forBarMetrics:UIBarMetricsDefault];

11、storyboard中的button出现奇怪的显示

对于纯代码的开发者来说一般不会出现这个问题,因为大家在创建UIButton的时候一般是制定button的类型为Custom,如果使用storyboard也不要忘了将UIButton的类型改为Custom

本人联系方式:qq:513961360

澳门新葡京平台游戏 5

12、怎么在设置storyboard中的UIButton的圆角?

如果是使用纯代码模式,那么我们可以对layer的cornerRadius属性进行赋值,但是在storyboard中是没有这个属性的,是因为这个是layer的属性,这时候就需要用到storyboard的Runtime Attributes,截图如下:

澳门新葡京平台游戏 6

email:513961360@qq.com

Snip20150912_2.png

13、取消UINavigationController的leftBarButtonItem

如果直接将leftBarButtonItem设置为nil的话,则会显示系统默认的leftBarButtonItem,我们应该这样做

self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc]initWithTitle:@"" style:UIBarButtonItemStylePlain target:self action:nil];

也可以加我们的qq群希望能与朋友们一起聊天和学习.群里还有很多iOS开发者,帮助我们解决问题,并且同时学习.

在这里得稍微说说UIBarMetrics这个枚举, 它主要是用来控制在不同状态下导航栏的显示。和UIButton的

14、storyboard中使用UIImageView(设置为Aspect Fill模式)的尺寸总会偏大一点

因为这种模式是要和图片进行配合的,所以我们应该勾选UIImageView的Clip Subviews这个选项(坑啊...)
图:

澳门新葡京平台游戏 7

qq群号:580284575

- (void)setBackgroundImage:(nullable UIImage *)image forState:(UIControlState)state这个方法有点类似。

//表示横屏竖屏都显示

UIBarMetricsDefault,

//表示在只横屏下才显示,和UIBarMetricsLandscapePhone功效一样,不过iOS8已经弃用了

UIBarMetricsCompact,

UIBarMetricsDefaultPrompt和UIBarMetricsCompactPrompt这两个我还没搞清楚是什么意思,有知道的朋友不妨给我们来普及一下。。

  1. 更改顶部状态栏的颜色

从效果图可以看出,我们设置背景色或者背景图之后,状态栏依然还是默认的黑色,这样感觉不好看。好在,系统给我们提供了UIStatusBarStyleDefaultUIStatusBarStyleLightContent两种样式供我们选择。

UIStatusBarStyleDefault,系统的默认样式,黑色内容,用于浅色的背景(如白色)

UIStatusBarStyleLightContent 白色内容,用于深色的背景(如红色)

下面来看看具体怎么实现,主流的实现方式是分两步:

在工程的Info.plist文件中添加一行UIViewControllerBasedStatusBarAppearance,选择Boolean类型,并设置为YES,Xcode会自动把名称变为View controller-based status bar appearance。

澳门新葡京平台游戏 8

Snip20150913_4.png

在你的ViewController中添加下面的方法

-(UIStatusBarStyle)preferredStatusBarStyle{returnUIStatusBarStyleLightContent;}

想知道更多地方式,可以参考这两个页面:How to change Status Bar text color in iOS 7和iOS7下Status Bar字体颜色修改

另外,特别需要注意的是,如果你的ViewController是通过navigationController push进来的,还需要加下面一句代码才能生效:

self.navigationController.navigationBar.barStyle = UIBarStyleBlack;

具体,可参考UIStatusBarStyle PreferredStatusBarStyle does not work on iOS 7

恩,我们来看看运行效果。

澳门新葡京平台游戏 9

Snip20150913_5.png

  1. 设置返回按钮

从上面的效果图中我们可以看到返回按钮还是默认的蓝色按钮,下面我将会大家来介绍返回按钮的个性化。

设置返回按钮的颜色

只需要设置tintColor属性即可

self.navigationController.navigationBar.tintColor= [UIColorwhiteColor];

得到的效果图如下:

澳门新葡京平台游戏 10

Snip20150915_1.png

只设置返回按钮的图片

- (void)goToBack {    [self.navigationControllerpopViewControllerAnimated:YES];}- (void)setBackButtonWithImage {UIImage*leftButtonIcon = [[UIImageimageNamed:@"LeftButton_back_Icon"]                              imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];UIBarButtonItem*leftButton = [[UIBarButtonItemalloc] initWithImage:leftButtonIcon                                                                  style:UIBarButtonItemStyleBorderedtarget:selfaction:@selector(goToBack)];self.navigationItem.leftBarButtonItem= leftButton;//修复navigationController侧滑关闭失效的问题self.navigationController.interactivePopGestureRecognizer.delegate= (id)self;}

得到的效果如下:

澳门新葡京平台游戏 11

Snip20150915_2.png

这里需要注意的地方有三点:

需要自己实现返回按钮的事件。

特别的解释下UIImage的imageWithRenderingMode:方法,参数UIImageRenderingModeAlwaysOriginal表示总是用原图渲染,如果不这么设置,返回按钮将会显示tintColor的颜色(默认为蓝色)。UITabbarItem也存在同样地问题。

我们自己设置返回按钮,会导致系统的侧滑关闭效果失效。添加上面代码中最后一句代码即可修复。

仅设置返回按钮的文字

- (void)setBackButtonTitle {UIBarButtonItem*leftButton = [[UIBarButtonItemalloc] initWithTitle:NSLocalizedString(@"取消",nil)                                                                  style:UIBarButtonItemStylePlaintarget:selfaction:@selector(goToBack)];    leftButton.tintColor= [UIColorwhiteColor];self.navigationItem.leftBarButtonItem= leftButton;}

得到的效果如下:

澳门新葡京平台游戏 12

Snip20150915_3.png

自定义返回按钮

如果上面几种方式还无法满足你的要求(比如,需要同时设置返回按钮文字和图片),就需要用到UIBarButtonIteminitWithCustomView方法。

- (void)setCustomLeftButton {UIView* leftButtonView = [[UIViewalloc]initWithFrame:CGRectMake(0,0,60,40)];UIButton* leftButton = [UIButtonbuttonWithType:UIButtonTypeSystem];    leftButton.backgroundColor= [UIColorclearColor];    leftButton.frame= leftButtonView.frame;    [leftButton setImage:[UIImageimageNamed:@"LeftButton_back_Icon"] forState:UIControlStateNormal];    [leftButton setTitle:@"返回"forState:UIControlStateNormal];    leftButton.tintColor= [UIColorredColor];    leftButton.autoresizesSubviews=YES;    leftButton.contentHorizontalAlignment=UIControlContentHorizontalAlignmentLeft;    leftButton.autoresizingMask=UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleLeftMargin;    [leftButton addTarget:selfaction:@selector(goToBack) forControlEvents:UIControlEventTouchUpInside];    [leftButtonView addSubview:leftButton];UIBarButtonItem* leftBarButton = [[UIBarButtonItemalloc] initWithCustomView:leftButtonView];self.navigationItem.leftBarButtonItem= leftBarButton;}

得到的效果图如下:

澳门新葡京平台游戏 13

Snip20150915_5.png

设置rightBarButtonItem基本上脱离不了上面的几种方式,大家可以参照上面返回按钮的设置方式。

  1. 隐藏导航栏底部的线条

有时候遇到一些特殊的要求,需要隐藏导航栏底部的线条。

两行代码就可以做到。

设置导航栏的背景图(setBackgroundImage方法)

设置导航栏的shadowImage (setShadowImage方法)

UINavigationBar*navigationBar =self.navigationController.navigationBar;//设置透明的背景图,便于识别底部线条有没有被隐藏[navigationBar setBackgroundImage:[[UIImagealloc] init]                      forBarPosition:UIBarPositionAnybarMetrics:UIBarMetricsDefault];//此处使底部线条失效[navigationBar setShadowImage:[UIImagenew]];

来看看效果图:

澳门新葡京平台游戏 14

Snip20150922_1.png

另外,还有一种做法,一行代码就可以达到效果,也真是够神奇的。。

//方法二:self.navigationController.navigationBar.clipsToBounds=YES;

想要知道更详细的内容可以参考这个页面:How to hide iOS7 UINavigationBar 1px bottom line

  1. 设置导航条底部线条的颜色

有了上面的基础,设置导航栏线条的颜色就变得很简单了。

首先,我做了个UIImage的分类:通过颜色转成UIImage;

然后,用上面的方案来设置导航栏底部线条。

颜色转图片的代码:

@implementationUIImage(ColorImage) (UIImage*)imageWithColor:(UIColor*)color{CGRectrect =CGRectMake(0.0f,0.0f,1.0f,1.0f);UIGraphicsBeginImageContext(rect.size);CGContextRefcontext =UIGraphicsGetCurrentContext();CGContextSetFillColorWithColor(context, [colorCGColor]);CGContextFillRect(context, rect);UIImage*image =UIGraphicsGetImageFromCurrentImageContext();UIGraphicsEndImageContext();returnimage;}@end

设置导航栏底部线条颜色的代码:

UINavigationBar*navigationBar =self.navigationController.navigationBar;    [navigationBar setBackgroundImage:[[UIImagealloc] init]                      forBarPosition:UIBarPositionAnybarMetrics:UIBarMetricsDefault];//此处使底部线条颜色为红色[navigationBar setShadowImage:[UIImageimageWithColor:[UIColorredColor]]];

依照惯例,看下效果图:

澳门新葡京平台游戏 15

Snip20150923_2.png

当然还有其他的方式也可以做到,如addSubview, addSubLayer等。感兴趣的话可以参考下这个页面:iOS7 - Change UINavigationBar border color

  1. 在导航栏上添加多个按钮

澳门新葡京平台游戏,以微信打开网页时的效果为例,效果图如下,有两个按钮:返回和关闭。

澳门新葡京平台游戏 16

微信效果图.png

有下面两种方式可供选择,但是最终还是要用到leftBarButtonItems这个方法。

#define UserMethod1 0UIBarButtonItem*closeItem = [[UIBarButtonItemalloc] initWithTitle:@"关闭"style:UIBarButtonItemStylePlaintarget:selfaction:@selector(closeAction)];if(UserMethod1) {//方法一:self.navigationItem.leftBarButtonItems= @[closeItem];//要求显示默认的返回按钮,但是文字会显示默认的Back,暂时还不知道这个文字怎么改self.navigationItem.leftItemsSupplementBackButton=YES;    }else{//方法二UIButton* leftButton = [UIButtonbuttonWithType:UIButtonTypeSystem];        leftButton.backgroundColor= [UIColorclearColor];        leftButton.frame=CGRectMake(0,0,45,40);        [leftButton setImage:[UIImageimageNamed:@"LeftButton_back_Icon"] forState:UIControlStateNormal];        [leftButton setTitle:@"返回"forState:UIControlStateNormal];        leftButton.tintColor= [UIColorwhiteColor];        leftButton.autoresizesSubviews=YES;        leftButton.contentHorizontalAlignment=UIControlContentHorizontalAlignmentLeft;        leftButton.autoresizingMask=UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleLeftMargin;        [leftButton addTarget:selfaction:@selector(goToBack) forControlEvents:UIControlEventTouchUpInside];UIBarButtonItem* backItem = [[UIBarButtonItemalloc] initWithCustomView:leftButton];self.navigationItem.leftBarButtonItems= @[backItem,closeItem];    }

然后,运行的效果图如下:

澳门新葡京平台游戏 17

在导航栏上添加多个按钮.png

方法一用到了leftItemsSupplementBackButton这个属性,会显示系统默认的返回按钮,但是文字也是显示默认的Back文字,目前还没找到怎么修改这个文字,如果有谁知道,还请不吝赐教;所以我暂时还是建议大家用方法二。相应的还有rightBarButtonItems这个属性,如果要在导航栏右侧展示多个按钮的话,可以设置这个属性。

  1. 在导航栏上添加分段控件

这次,以QQ为例,代码如下:

UISegmentedControl *segControl = [[UISegmentedControl alloc] initWithItems:@[@"消息",@"电话"]];    segControl.tintColor = [UIColor colorWithRed:0.07green:0.72blue:0.96alpha:1];    [segControl setSelectedSegmentIndex:0];    self.navigationItem.titleView = segControl;

代码很简单,就是设置titleView这个属性,当然,你也可以把这个属性设置为你自定义的View。

澳门新葡京平台游戏 18

类似于QQ的导航栏.png

  1. 导航栏全局属性设置

//全局设置导航栏主题- (void)setNavigationControllerAppearance {    [UINavigationBarappearance].barStyle=UIBarStyleBlack;    [[UINavigationBarappearance] setBarTintColor:[UIColorcolorWithWhite:0.1alpha:0.5]];    [[UINavigationBarappearance] setTintColor:[UIColorwhiteColor]];}

全局设置导航栏的好处有两个:一是不用对每个NavigationBar进行设置;二是方便做主题管理,切换主题,只需要更改全局设置即可。

  1. 与导航栏相关的一些开源组件

11.1NJKWebViewProgress- 类似于Safiri加载网页时的进度显示

网页加载进度.png

11.2FDFullscreenPopGesture- 一个丝滑的全屏滑动返回手势

对应的文章介绍可以点这个链接。

丝滑的全屏返回手势.png

最后,奉上Demo的地址:NavigationBarDemo

本文由新葡京8455发布,转载请注明来源

关键词: