IOS培训
美国上市IOS培训机构

400-111-8989

热门课程

IOS Swift实战开发经验总结,IOSSwift开发经验分享

  • 发布:点点点
  • 来源:IOS开发教程
  • 时间:2018-07-26 13:46

由于本人对swift有着独特的爱好,所以在OC写完之后空余的时间也在努力使用swift实现一下,但是中间遇到了不少的问题,就总结了几个重要的地方。

这里只有三个比较麻烦的,后面文章中笔者会陆续更新相关技术总结

swift中没有宏的概念,pch文件也没有OC中这么简单

所以如果我们要定义一个全局变量,比如颜色,一般使用let直接定义

/**

* 颜色定义

*/

let iCocosCommonBgColor = UIColor(red: (215)/255.0, green: (215)/255.0, blue: (215)/255.0, alpha:1.0)

使用字典的方法设置导航栏的主题

在swift中设置导航栏的主题我们同样使用字典实现,但是却和OC大不一样,笔者也是弄了很久才成功,因为之前都只是简单的使用字典,下面就来看看咱们应该怎么做:

1 //获取tabBarItem主题

2 var tabBar : UITabBarItem = UITabBarItem.appearance()

3

4 //设置文字不同状态的颜色

5 let dictNor = NSDictionary(object: UIColor.grayColor(), forKey: NSForegroundColorAttributeName)

6 let dictHigh = NSDictionary(object: UIColor.orangeColor(), forKey: NSForegroundColorAttributeName)

7

8 //设置文字的大小

9 let dictFont = NSDictionary(object: UIFont.systemFontOfSize(12.0), forKey: NSFontAttributeName)

10

11 //使用上面的字典设置主题属性

12 tabBar.setTitleTextAttributes(dictNor as [NSObject : AnyObject], forState: UIControlState.Normal)

13 tabBar.setTitleTextAttributes(dictHigh as [NSObject : AnyObject], forState: UIControlState.Selected)

14

15 tabBar.setTitleTextAttributes(dictFont as [NSObject : AnyObject], forState: UIControlState.Normal)

实现每个子控制器左边返回按钮,还原手势返回功能

1:首先遵守协议

UIGestureRecognizerDelegate

2:设置代理

//设置手势代理

self.interactivePopGestureRecognizer.delegate = self

3:实现push方法

1 //实现push方法,处理后面的业务逻辑

2 override func pushViewController(viewController: UIViewController, animated: Bool) {

3

4 //判断是否是根控制器

5 if self.childViewControllers.count > 0 {

6

7 //如果不是根控制器,则隐藏底部的tabBar

8 viewController.hidesBottomBarWhenPushed = true

9

10 /**

11 * 创建一个按钮,并且设置对应的属性

12 */

13

14 //初始化

15 var btn: UIButton = UIButton.buttonWithType(UIButtonType.Custom) as! UIButton

16

17 //frame

18 btn.frame = CGRectMake(0, 2, 70, 30)

19

20 //设置位子及文字不同状态的颜色

21 btn.setTitle("返回", forState: UIControlState.Normal)

22 btn.setTitleColor(UIColor.grayColor(), forState: UIControlState.Normal)

23 btn.setTitleColor(UIColor.redColor(), forState: UIControlState.Highlighted)

24

25 //设置不同状态的图片

26 btn.setImage(UIImage(named: "navigationButtonReturn"), forState: UIControlState.Normal)

27 btn.setImage(UIImage(named: "navigationButtonReturnClick"), forState: UIControlState.Highlighted)

28

29 //设置内容和图片的边距

30 btn.contentEdgeInsets = UIEdgeInsetsMake(0, -15, 0, 0)

31 btn.imageEdgeInsets = UIEdgeInsetsMake(0, 0, 0, 10)

32

33 //设置每一个子控制器的左边为我们自定义的放回按钮

34 viewController.navigationItem.leftBarButtonItem = UIBarButtonItem(customView: btn)

35

36 //添加点击事件

37 btn.addTarget(self, action: "backClcik", forControlEvents: UIControlEvents.TouchUpInside)

38 }

39

40 //设置全局背景颜色

41 viewController.view.backgroundColor = iCocosCommonBgColor

42

43 //push进入下一个控制器

44 super.pushViewController(viewController, animated: true)

45 }

4:实现返回按钮方法

//点击放回按钮返回到上一个控制器func backClcik() { self.popViewControllerAnimated(true) }

5:实现子控制器的手势返回

//根据上面遵守的协议和设置的代理,在这个方法中设置子控制器可以实现点手势返回功能func gestureRecognizerShouldBegin(gestureRecognizer: UIGestureRecognizer) ->Bool {returnself.childViewControllers.count >0} }

swift控制器切换

关于控制器的切换swift喝Objective—C中并没有太多的区别(这里只说两种,其他的在下面的文章中会介绍到),最大的也就是布尔值的写法

Objective—C:YES和NO

swift:true和false

下面来看看两者的实现

OC版

模态方式

[self presentViewController:vc animated:YES completion:nil]; [self dismissViewControllerAnimated:YES completion:nil];

push方式

[self.navigationController pushViewController:vc animated:YES]; [self.navigationController popViewControllerAnimated:YES];

Swift版

模态方式

self.presentViewController(vc, animated:true, completion: nil) self.dismissViewControllerAnimated(true, completion: nil)

push方式

self.navigationController?.pushViewController(vc, animated:true) self.navigationController?.popViewControllerAnimated(true)

一、常规主题色使用点

应用在发布前都会对其主题色进行设置,以统一应用的风格(可能有多套主题)。在主题色设置上有几个方面,如下:

1.TabBar部分,设置图片高亮、文本高度颜色

2.NavigationBar部分,设置导航栏颜色及字体颜色

3.应用标签等,设置字体的颜色

4.应用图片主题色

主题色的设置点,大体从上面四个方面着手,图片的主题色我们可通过图片更换的方式进行处理。而通过代码来处理的1-3条,有着不同的处理方法。大家常规处理方法如下:

步骤一:变化分离

1.利用Swift扩展语法扩展UIColor,将应用主题色在扩展中统一处理(适合单一主题色)

2.将主题色的配置写入文件中,由相应逻辑进行解析。此方法将主题色逻辑封装成主题色管理类(适合多套主题)

步骤二:离散使用上步封装的类

1.在任何使用主题色的地方,使用扩展中的UIColor方法来设置,一般包括背景色,文字颜色等

这里给出UIColor的扩展

1extension UIColor {23//主题色4classfunc applicationMainColor() ->UIColor {5returnUIColor(red:238/255, green:64/255, blue:86/255, alpha:1)6}78//第二主题色9classfunc applicationSecondColor() ->UIColor {10returnUIColor.lightGrayColor()11}1213//警告颜色14classfunc applicationWarningColor() ->UIColor {15returnUIColor(red:0.1, green:1, blue:0, alpha:1)16}1718//链接颜色19classfunc applicationLinkColor() ->UIColor {20returnUIColor(red:59/255, green:89/255, blue:152/255, alpha:1)21}2223}

二、TabBar主题色设置

很多应用中,默认情况下都使用了TabBar控件,但是TabBar主题色等设置根据使用情况的不同,设置起来也不一样。代码创建比较灵活,更改主题色比较容易。而使用了Xib/Storyboard也是有办法做统一处理的,如下,迭代更改TabBar默认字体颜色

1func configTabBar() {2let items =self.tabBar.items3foriteminitemsas[UITabBarItem] {4let dic = NSDictionary(object: UIColor.applicationMainColor(),5forKey: NSForegroundColorAttributeName)6item.setTitleTextAttributes(dic,7forState: UIControlState.Selected)8}9}

设置TabBar图片及文字默认选中颜色

self.tabBar.selectedImageTintColor = UIColor.applicationMainColor()

Tips注意事项

Changing this property’s value provides visual feedback in the user interface, including the running of any associated animations. The selected item displays the tab bar item’s selectedImage image, using the tab bar’s selectedImageTintColor value. To prevent system coloring of an item, provide images using the UIImageRenderingModeAlwaysOriginal rendering mode.

在一些情况,正常状态为白色图片时,真机测试时,白色图片会出现偏色(显示结果为灰色),这是因为系统默认着色导致的,在创建UITabBarItem时,可通过使用UIImageRenderingModeAlwaysOriginal避免。示例代码如下:

1let imageNormal = UIImage(contentsOfFile:"imageNormal")?.2imageWithRenderingMode(UIImageRenderingMode.AlwaysOriginal)3let imageSelected = UIImage(contentsOfFile:"imageSelected")4let tabBarItem = UITabBarItem(title:"title",5image: imageNormal,6selectedImage: imageSelected)

三、一劳永逸,利用Hook原理通设NavigationBar颜色

iOS应用中,NavigationBar十分常用,它的使用主要包括以下两个场景

1.代码直接构建

2.Xib/Storyboard构建

如果是纯代码构建的时候,比较简单,直接使用UIColor的扩展来设置颜色。实际项目中,有些界面是通过Xib/Storyboard来创建的,有些是代码写的,但这也难不到大家,使用继承。创建一个继承自UINavigationController的子类,通过这个子类来统一设置主题色。然后告诉项目中的所有人,强制使用UINavigationController子类,包括Xib/Storyboard等。问题是旧项目怎么办,这种强制要求可以工作,有没有一个更好的办法,让所有人正常使用UINavigationController,而在神不知鬼不觉的情况下,通设所有NavigationBar呢? 先上代码,再解释

1.创建一个UIViewController的扩展

1extension UIViewController {2func viewDidLoadForChangeTitleColor() {3self.viewDidLoadForChangeTitleColor()4ifself.isKindOfClass(UINavigationController.classForCoder()) {5self.changeNavigationBarTextColor(selfasUINavigationController)6}7}89func changeNavigationBarTextColor(navController: UINavigationController) {10let nav = navControllerasUINavigationController11let dic = NSDictionary(object: UIColor.applicationMainColor(),12forKey:NSForegroundColorAttributeName)13nav.navigationBar.titleTextAttributes =dic14nav.navigationBar.barTintColor =UIColor.applicationSecondColor()15nav.navigationBar.tintColor =UIColor.applicationMainColor()1617}1819}

2.编写用于Hook的工具类

1func swizzlingMethod(clzz: AnyClass, #oldSelector: Selector, #newSelector: Selector) {2let oldMethod =class_getInstanceMethod(clzz, oldSelector)3let newMethod =class_getInstanceMethod(clzz, newSelector)4method_exchangeImplementations(oldMethod, newMethod)5}

3.在AppDelegate中调用

1func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: NSDictionary?) ->Bool {2swizzlingMethod(UIViewController.self,3oldSelector:"viewDidLoad",4newSelector:"viewDidLoadForChangeTitleColor")5//do others6returntrue7}

4.原理说明

在程序入口处,通过运行时机制,动态的替换UIViewController的周期方法viewDidLoad为我们指定的方法viewDidLoadForChangeTitleColor。在viewDidLoadChangeTitleColor中,需要做两件事:

调用原来的viewDidLoad方法

执行修改主题色相关代码

1.如何调用原来的viewDidLoad方法

在AppDelegate中,通过调用方法swizzlingMethod我们将viewDidLoad与viewDidLoadForChangeTitleColor方法体进行了替换,原理如下图:

从上面的图可以看出,当在viewDidLoadForChangeTitleColor中执行:

self.viewDidLoadForChangeTitleColor()

是不会造成循环调用,反而是调用了我们期望执行的viewDidLoad方法体。

四、Xib/Storyboard的处理

一些在Xib/Storyboard中设置的主题色,比如文本颜色,按钮的高亮颜色等,该如何处理呢,以UILabel为例,建立扩展

1extension UILabel {2var colorString: String {3set(newValue) {4switchnewValue {5case"main":6self.textColor =UIColor.applicationMainColor()7case"second":8self.textColor =UIColor.applicationSecondColor()9case"warning":10self.textColor =UIColor.applicationWarningColor()11default:12self.textColor =UIColor.applicationSecondColor()13}14}15get{16returnself.colorString17}18}19}

在Xib/Storyboard的查检器中进行编辑,如下图:

4.总结

1.只有一套主题时,上面的方法可以直接复制使用,在更换主题时,只需要更换相应图片及修改UIColor的扩展类

2.在有多套主题,用户可以自由切换主题时,可以按文章中的Hook机制,对viewWillAppear进行劫持,也可以轻松实现主题的改变

4}56func cacheGetString(key: String) ->String{7var userInfo =NSUserDefaults()8var tmpSign =userInfo.stringForKey(key)9returntmpSign!10}

经典错误

一:可选类型错误

tipBtn.setTitle("添加表情:\(self.textField?.text)", forState: UIControlState.Normal)

解决办法

tipBtn.setTitle("添加表情:\(self.textField!.text)", forState: UIControlState.Normal)

二:可选链

提示插入

插入子后��提示删除

这个时候只需使用显示就可以

预约申请免费试听课

上一篇: iOS runtime 方法交换教程
下一篇:开发一款IOS APP需要哪些步骤,IOS APP开发流程

IOS库开发知识点总结和归纳

IOS Swift实战开发经验总结,IOSSwift开发经验分享

IOS设计 - 一款APP从设计稿到切图过程概述

2017年IOS开发者账号申请以及邓白氏码的申请教程经验

选择城市和中心
贵州省

广西省

海南省