iOS开发笔记1
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的更多相关文章
- iOS开发笔记7:Text、UI交互细节、两个动画效果等
Text主要总结UILabel.UITextField.UITextView.UIMenuController以及UIWebView/WKWebView相关的一些问题. UI细节主要总结界面交互开发中 ...
- iOS开发笔记-两种单例模式的写法
iOS开发笔记-两种单例模式的写法 单例模式是开发中最常用的写法之一,iOS的单例模式有两种官方写法,如下: 不使用GCD #import "ServiceManager.h" ...
- iOS开发笔记--什么时候调用layoutSubviews
iOS开发笔记--什么时候调用layoutSubviews 分类: iOS2014-04-22 16:15 610人阅读 评论(0) 收藏 举报 今天在写程序时候遇见layoutSubviews触发时 ...
- IOS开发笔记(4)数据离线缓存与读取
IOS开发笔记(4)数据离线缓存与读取 分类: IOS学习2012-12-06 16:30 7082人阅读 评论(0) 收藏 举报 iosiOSIOS 方法一:一般将服务器第一次返回的数据保存在沙盒里 ...
- IOS开发笔记 IOS如何访问通讯录
IOS开发笔记 IOS如何访问通讯录 其实我是反对这类的需求,你说你读我的隐私,我肯定不愿意的. 幸好ios6.0 以后给了个权限控制.当打开app的时候你可以选择拒绝. 实现方法: [plain] ...
- 【Swift】iOS开发笔记(二)
前言 这个系列主要是一些开发中遇到的坑记录分享,有助于初学者跨过这些坑,攒够 7 条发一篇. 声明 欢迎转载,但请保留文章原始出处:) 博客园:http://www.cnblogs.com 农民伯 ...
- 菜鸟手下的iOS开发笔记(swift)
在阳春4月的一天晨会上,有一个老板和蔼的对他的一个菜鸟手下说:“你既然会Android,那你能不能开发iOS?” 不是说好的要外包的吗?内心跌宕,但是表面淡定的菜鸟手下弱弱的回道:“可以试试”. 第二 ...
- iOS开发笔记4:HTTP网络通信及网络编程
这一篇主要总结iOS开发中进行HTTP通信及数据上传下载用到的方法.网络编程中常用的有第三方类库AFNetworking或者iOS7开始新推出的NSURLSession,还有NSURLSession的 ...
- iOS开发笔记系列-基础1(数据类型与表达式)
学习iOS开发快两年了,去年完成MagViewer之后就因为公司的其他业务繁重,除了维护这个应用之外,只是断断续续地自己做一些实验开发,没有再发布新的应用,这里想整理一下学习过程中的笔记,以便加深印象 ...
- 【IOS开发笔记03-视图相关】简单计算器的实现
UIView 经过前几天的快速学习,我们初步了解的IOS开发的一些知识,中间因为拉的太急,忽略了很多基础知识点,这些知识点单独拿出来学习太过枯燥,我们在今后的项目中再逐步补齐,今天我们来学习APP视图 ...
随机推荐
- 【bzoj3277&&3474】串
*题目描述: 字符串是oi界常考的问题.现在给定你n个字符串,询问每个字符串有多少子串(不包括空串)是所有n个字符串中至少k个字符串的子串(注意包括本身). *输入: 第一行两个整数n,k.接下来n行 ...
- 【BZOJ1521】Est(单调队列优化DP)
题意:From https://www.cnblogs.com/CXCXCXC/p/4725249.html 思路:本身就两维状态了,把问题关键s[i][j]写成二维比一维好写多了 #include& ...
- ios8来了,屏幕更大,准备好使用 iOS Auto Layout了吗?
引言: Auto Layout是iOS6发布后引入的一个全新的布局特性,其目的是弥补以往autoresizing在布局方面的不足之处,以及未来面对更多尺寸适配时界面布局可以更好的适应. 要完全掌握Au ...
- VXcode学习
1.安装中文包(chinese) 2.打开控制面板ctrl+shift+p
- Web开发系列【1】实用的网页布局(PC端)
在熟悉那些常用的软件.工具后,我们正式开始开发,在前期准备工作之后,我们要做的事情是写页面,也就是网页布局.在w3c.菜鸟.慕课网等等网站上都有基础的 HTML+CSS 知识讲解,在初期学习中,跟着教 ...
- error: ‘xxx’ does not name a type
error: ‘TPlanMgr’ does not name a type 两个头文件相互应用会导致一个头文件你的类型无定义问题.
- The Linux usage model for device tree data
Linux and the Device Tree The Linux usage model for device tree data Author: Grant Likely grant.like ...
- mooc-IDEA 使用界面--001
IntelliJ IDEA 快捷键应用小结 1.Ctrl+E : 打开最近所有浏览过的文件 2.Ctrl+Shift+E :打开最近所有编辑修改过的文件 3.ctrl+shift+Backspace ...
- C++ 全面刨析使用指针方法 _new _delete
指针 #include<iostream> using namespace std; int main() { ; int* pn;//声明 int* pn = &avr;//初始 ...
- 关于微信授权和unionid 的获取思路。
1.首先根据appid 获取到预授权码的code string Appid = "******";//appid.由于网页授权与js-jdk使用不同微信,所以暂时独立于此处. st ...