1.在堆上模拟函数调用栈

背景: 在看算法书时候, 很多地方提到要谨防递归的栈溢出问题.

分析: 递归调用时候, 有可能出现非常深的函数调用. 对于每次的函数调用, 都需要将函数体内的局部变量保存在栈上, 如果函数体内包含大量的局部变量, 那么每次递归都会占用大量的栈空间, 非常容易导致栈溢出崩溃.

经过分析发现, 递归的栈溢出主要是局部变量占用太多空间而导致的. 那么我们只要想办法将局部变量封装起来放在堆上, 那么就能减少栈上空间的占用, 从而防止栈溢出.

青蛙跳台阶问题的递归算法如下所示(Swift).

// 定义一个对象, 用来存储局部变量信息
class FakeStack {
var num: Int
init(num: Int) {
self.num = num
} func nextStep() -> Int {
if num == 1 {
return 1
} if num == 2 {
return 2
} return FakeStack(num: num - 1).nextStep() + FakeStack(num: num - 2).nextStep()
}
} //栈上的函数调用
let stepNumber = FakeStack(num: 10).nextStep()
print(stepNumber)

2.去掉WKWebView弹出键盘的ToolBar

原理就是替换原有的WKContentView,在新的NoInputAccessoryView中的inputAccessoryView属性中返回nil。

final class FauxBarHelper: NSObject {
@objc var inputAccessoryView: AnyObject? { return nil } func removeInputAccessoryView(webView: WKWebView) {
var targetView: UIView? = nil for view in webView.scrollView.subviews {
if String(describing: type(of: view)).hasPrefix("WKContent") {
targetView = view
}
} guard let target = targetView else { return } let noInputAccessoryViewClassName = "\(target.superclass!)_NoInputAccessoryView"
var newClass: AnyClass? = NSClassFromString(noInputAccessoryViewClassName)
if newClass == nil {
let targetClass: AnyClass = object_getClass(target)!
newClass = objc_allocateClassPair(targetClass, noInputAccessoryViewClassName.cString(using: String.Encoding.ascii)!, 0)
} let originalMethod = class_getInstanceMethod(FauxBarHelper.self, #selector(getter: FauxBarHelper.inputAccessoryView))
class_addMethod(newClass!.self, #selector(getter: FauxBarHelper.inputAccessoryView), method_getImplementation(originalMethod!), method_getTypeEncoding(originalMethod!))
object_setClass(target, newClass!)
}
}

3.关于HuggingPriority和CompressionResistance

setContentHuggingPriority ==> 抗拉伸-此view不想被拉伸

setContentCompressionResistancePriority ==> 抗压缩-此view不想被压缩

举个例子,当有两个横排的label,当左右label数据都被填满导致label显示文字长度不够的时候,如果左边label设置了setContentCompressionResistancePriority,则系统会尽可能将左边label文字显示全部,从而压缩右边label;如果左边设置setContentHuggingPriority,当左右空间都足够的时候,右边label会被拉伸,而左边label宽度会尽量以显示完全内容的最小宽度显示内容。

参考链接:

https://www.jianshu.com/p/5cf559435eb9

https://www.cnblogs.com/wobuyayi/p/9501391.html

4.项目添加预处理宏定义

添加自定义预处理宏定义意义在于,当你需要beta版本时候你可以为beta版本做特殊的证书配置,环境配置等等。

5.使用自定义字体样式,字体倾斜

不得不说,UIFont提供的字体样式太强大了,虽然我们平时需要用到的并不多,但是如果了解下高级的字体样式配置方式,在遇到各种变态的需求时候才能处乱不惊。这里要说的是如何让字体倾斜一定角度,如下图所示:

实际上,这种效果实现起来非常简单,你只需要配置字体的UIFontDescriptor即可,UIFontDescriptor提供了专门的属性来修改字体的倾角、字体名字、字体大小、文字样式等等。

具体的代码如下所示:

//生成CGAffine对象
let transform = CGAffineTransform(rotationAngle: CGFloat(Double.pi / 8))
//配置UIFontDescriptor.AttributeName.matrix属性
let fontDescriptor = UIFontDescriptor(fontAttributes:
[UIFontDescriptor.AttributeName.matrix: transform])
//生成字体样式
let font = UIFont(descriptor: fontDescriptor, size: 0) //将字体样式配置给UILabel
let label = UILabel()
label.font = font

6.NumberFormatter-保留小数位

很多时候我们需要讲Double类型保留指定位数的小数位,使用NumberFormatter我们可以方便的保留我们需要的小数位数并转换成字符串类型, 示例代码如下所示:

extension Double {
func toString(_ minF: Int = 0, maxF: Int = 10, minI: Int = 1) -> String {
let valueDecimalNumber = NSDecimalNumber(value: self)
let twoDecimalPlacesFormatter = NumberFormatter()
twoDecimalPlacesFormatter.maximumFractionDigits = maxF
twoDecimalPlacesFormatter.minimumFractionDigits = minF
twoDecimalPlacesFormatter.minimumIntegerDigits = minI
return twoDecimalPlacesFormatter.string(from: valueDecimalNumber)!
}
}

如有任何错误, 请不吝赐教.

iOS开发笔记1的更多相关文章

  1. iOS开发笔记7:Text、UI交互细节、两个动画效果等

    Text主要总结UILabel.UITextField.UITextView.UIMenuController以及UIWebView/WKWebView相关的一些问题. UI细节主要总结界面交互开发中 ...

  2. iOS开发笔记-两种单例模式的写法

    iOS开发笔记-两种单例模式的写法   单例模式是开发中最常用的写法之一,iOS的单例模式有两种官方写法,如下: 不使用GCD #import "ServiceManager.h" ...

  3. iOS开发笔记--什么时候调用layoutSubviews

    iOS开发笔记--什么时候调用layoutSubviews 分类: iOS2014-04-22 16:15 610人阅读 评论(0) 收藏 举报 今天在写程序时候遇见layoutSubviews触发时 ...

  4. IOS开发笔记(4)数据离线缓存与读取

    IOS开发笔记(4)数据离线缓存与读取 分类: IOS学习2012-12-06 16:30 7082人阅读 评论(0) 收藏 举报 iosiOSIOS 方法一:一般将服务器第一次返回的数据保存在沙盒里 ...

  5. IOS开发笔记 IOS如何访问通讯录

    IOS开发笔记  IOS如何访问通讯录 其实我是反对这类的需求,你说你读我的隐私,我肯定不愿意的. 幸好ios6.0 以后给了个权限控制.当打开app的时候你可以选择拒绝. 实现方法: [plain] ...

  6. 【Swift】iOS开发笔记(二)

    前言 这个系列主要是一些开发中遇到的坑记录分享,有助于初学者跨过这些坑,攒够 7 条发一篇. 声明  欢迎转载,但请保留文章原始出处:)  博客园:http://www.cnblogs.com 农民伯 ...

  7. 菜鸟手下的iOS开发笔记(swift)

    在阳春4月的一天晨会上,有一个老板和蔼的对他的一个菜鸟手下说:“你既然会Android,那你能不能开发iOS?” 不是说好的要外包的吗?内心跌宕,但是表面淡定的菜鸟手下弱弱的回道:“可以试试”. 第二 ...

  8. iOS开发笔记4:HTTP网络通信及网络编程

    这一篇主要总结iOS开发中进行HTTP通信及数据上传下载用到的方法.网络编程中常用的有第三方类库AFNetworking或者iOS7开始新推出的NSURLSession,还有NSURLSession的 ...

  9. iOS开发笔记系列-基础1(数据类型与表达式)

    学习iOS开发快两年了,去年完成MagViewer之后就因为公司的其他业务繁重,除了维护这个应用之外,只是断断续续地自己做一些实验开发,没有再发布新的应用,这里想整理一下学习过程中的笔记,以便加深印象 ...

  10. 【IOS开发笔记03-视图相关】简单计算器的实现

    UIView 经过前几天的快速学习,我们初步了解的IOS开发的一些知识,中间因为拉的太急,忽略了很多基础知识点,这些知识点单独拿出来学习太过枯燥,我们在今后的项目中再逐步补齐,今天我们来学习APP视图 ...

随机推荐

  1. DI,依赖注入,给对象赋值 ,get,set,list,set,map,properties对象赋值

  2. Thread的几种方法的使用

    1:setPriority() 设置线程的优先级,从1 到10.   5是默认的.  1是最低优先级. 10是最高优先级 public class MyThread01 implements Runn ...

  3. js判断浏览器的类型

    我们很多时候都需要判断浏览器,下面就是一些常用的判断 var ua = navigator.userAgent.toLowerCase(); //用来判断移动端类型 var isWeixin = /M ...

  4. UE4网络功能相关笔记

    RepNotity的作用 把变量设置成RepNotify除了像C#语言中的"属性"一样,提供一个改变变量时调用一个函数的机会以外,其真正重要的作用其实是应对网通同步延迟问题. 一定 ...

  5. SpringBoot学习-第一章

    1.SpringBoot入门 开发环境:JDK1.8 开发工具:IDEA2017.3.1 1.简介: Spring Boot让我们的Spring应用变的更轻量化.比如:你可以仅仅依靠一个Java类来运 ...

  6. optistruct如何将多个约束置于一个约束集合中

    建立load_col,卡片设置SPCADD.

  7. Oracle Flashback Transaction Query with Oracle Flashback Version Query

    Oracle Flashback Transaction Query with Oracle Flashback Version Query In this example, a database a ...

  8. SQLite入门语句之约束

    一.SQLite约束之NOT NULL 确保某列不能有 NULL 值.默认情况下,列可以保存 NULL 值.如果您不想某列有 NULL 值,那么需要在该列上定义此约束,指定在该列上不允许 NULL 值 ...

  9. pyspark 学习笔记

    from pyspark.sql import SparkSession spark = SparkSession \ .builder \ .appName("Python Spark S ...

  10. 35 怎么优化join

    35 怎么优化join 上一篇介绍了join的两种算法:nlj和bnl create table t1(id int primary key, a int, b int, index(a)); cre ...