想第一时间获取我的最新文章,请关注公众号: 技术特工队
【技术特工队】
人因梦想而伟大,因坚持而可贵
想第一时间获取我的最新文章,请关注公众号: 技术特工队
Auto Layout 是苹果公司在iOS6发布的界面布局技术,为了适配不同大小屏幕及屏幕变化而推出的一种技术方案,旨在实现一次编写布局界面UI,自动适应所有屏幕布局,并随着iOS SDK的迭代逐步完善了各种布局API、提供多种使用Auto Layout的布局方式。实际上Auto Layout算法本身并非有Apple发明,Auto Layout源于Cassary约束解析工具包。该算法由Alan Borning、Kim Marriott、Peter Stuckey、Yi Xiao于1997年发布,该算法的主要思想是:将基于约束系统的布局规则(本质上是表示视图布局关系的线性方程组)转化为表示规则的视图几何参数。
传统的布局方式是基于Frame来做UI控件的界面布局的,即设置控件在父视图中的起始坐标点Origin(x,y)和控件的大小Size(width,height),为了精确,我们必须计算每个视图的frame。但布局一旦发生变化,相关frame都需要重新计算。然后这些计算都需要不断的手动动态的去计算,导致一旦有变化,就会需要去维护和调试。
自动缩放的出现在一定程度上减轻了我们的负担。自动缩放规定父视图的frame变化时,视图的frame如何应对。如此一来,简化了布局响应外部变化所需的工作。但是他仅能应对外部父布局的变化,自身大小的变化则无法进行处理。
在 OSX 中有一些列表的需求,这时候需要使用 OSX 中 TableView 来实现,但是这个 TableView 与 Android的 ListView 不太一样。使用还是比较复杂的。下面做一个简单的介绍,
首先需要在布局文件中,拖出一个TableView,并且添加相应的每列的数据源,主要是 使用 TableCellView
, 里面默认的控件有一个TextFiled
和一个ImageView
,如果需要其他控件则需要自己进行自定义进行实现,下一小节会说到。
需要对 TableView 设置一个数据源,需要实现 NSTableViewDataSource
接口, 并对 TableView
设置数据源,如下:
1 | tableView.dataSource = self |
对每行的数据进行渲染处理,设置delegate
和target
代理,并实现 NSTableViewDelegate
接口中如下方法
在 AppDelegate 中,复写applicationShouldTerminate
方法可以达到控制是否点击关闭按钮是否关闭应用的效果,其返回值TerminateReply
有三个值,具体如下:1
2
3
4
5public enum TerminateReply : UInt {
case terminateCancel // 取消掉关闭,等于点击无作用
case terminateNow // 现在直接关闭
case terminateLater // 暂且不关闭
}
在下面的返回值可根据一些条件进行判断,比如有些应用点击关闭按钮是仅将窗口关闭,并最小化应用不退出,则可以根据设置情况进行返回不同的值。1
2
3func applicationShouldTerminate(_ sender: NSApplication) -> NSApplication.TerminateReply {
return .terminateNow
}
在 AppDelegate中 applicationShouldTerminateAfterLastWindowClosed
中的作用为确认是否是等待所有窗口关闭后才关闭整个应用的作用。
1 | func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool { |
OSX 中 NSStackView 使用自动布局(系统的自动布局特性)来根据你的要求管理和对齐一组视图。可以设置为 水平方向,或者垂直方向。如下:1
2stackView.orientation = .horizontal //水平方向
stackView.orientation = .vertical //垂直方向
为stackView 中添加 子view的方式如下:1
stackView.addArrangedSubview(view)
注意: 由于stackView 是继承自 NSView, 所有也会有 addSubview(view)
的方法,但是调用此方法,不会自动扩大 stackView 的宽高,而导致新加的view 显示不出来。
移除子 View 采用如下方式:1
2stackView.removeArrangedSubview(view)
view.removeFromSuperview()
注意:子view从stackView移除后,还必须将子view从父view中移除
最近产品要做一个消息的通知,而且通知是覆盖在 StatusBar 上面的。如果是普通的 UIView 则肯定是不行的,因为 StatusBar 为系统全局性的视图,所以要想覆盖它,则必须为 Statusbar 类型的,那么也就是 UIWindow 了。
这里有三个重要的对象UIScreen,UIWindow,UIView。
- UIScreen对象识别物理屏幕连接到设备
- UIWindow对象提供绘画支持给屏幕
- UIView执行绘画,当窗口要显示内容的时候,UIView绘画出他们的内容并附加到窗口上。
想第一时间获取我的最新文章,请关注公众号: 技术特工队
在开发混合应用中,经常需要 js 与 webview 进行通信,那么官方也提供了一些方法进行消息处理,今天这里介绍一款开源库来更好的解决的 native 与 js 通信的问题,也就是 WebViewJavascriptBridge
pod 'WebViewJavascriptBridge', '~> 6.0'
,然后执行pod install
使 WebViewJavascriptBridge 初始化与 Webview 进行绑定
1 | let bridge: WebViewJavascriptBridge = WebViewJavascriptBridge.init(forWebView: webview) |
在js层中进行注册处理
1 | // 将该方法写入 javascript 中 |
经过上面的步骤,基本的搭建就完成了,下面就是要相互注册调用的函数,以及互相调用的方法。
想第一时间获取我的最新文章,请关注公众号: 技术特工队
App Transport Security Settings
设置Allow Arbitrary Loads
为 true新建一个工程时,需要引用第三方库时,一般实用OPodfile 进行引用,初始化podfile,在项目根目录下执行 pod init
, 之后产生 Podfile,然后在产生的文件中添加依赖,再在根目录下执行如下命令:1
2pod update
pod install
然后项目根目录下会产生.xcworkspace
的文件,这时需要将新建的工程关闭,然后使用双击xcworkspace
来打开项目。后续添加新的库,只需执行 pod install
即可。
如果开发中使用swift 语言,而库还是用oc语言开发的,如要使用oc库则需要添加一个配置bridge文件并配置在xcode中。
项目名+bridge.h
,例如TestDemo-Bridging-Header.h
#import <DevMateKit/DevMateKit.h>
swift Compiler -General
,下面有项为:Object-C Bridging Header
, 双击进入编辑状态,然后将前面新建的.h文件拖到编辑框内,路径会自动填充上(绝对路径),然后重新编译项目即可。想第一时间获取我的最新文章,请关注公众号: 技术特工队
下面为最近使用swift 进行 OSX 开发中,对于一些知识点的总结与汇总,主要是跨行过来,很多内容都不太熟悉,所以这里进行一部分的记录与总结,方便日后的回顾与思考,后续有新的也会继续进行补充。
1 | objc_sync_enter(Obj) |
在上面两句话中间的语句则为同步代码块,Obj 为锁的对象。类似Java中的 synchronized(Obj)1
2
3
4
5
6
7
8//代码块
synchronized(Obj) {
//cide
}
// synchronized 用到方法上
public void synchronized method() {
}
参考:http://swift.gg/2017/09/04/all-about-concurrency-in-swift-1-the-present/
1、在Xib或者StoryBoard中的view间的依赖,都正常但是无法按照我们预期的显示,这时需要检查 约束之间的优先级,通常这部分很容易导致View依赖出现错误,而很难排查。
2、在定义布局时,有图片控件ImageView的时候,默认指定了图片,这时相当于控件的大小是固定的,如果我们想让其铺满父view,设置了相应的约束,但是实际运行中不起作用
原因: ImageView已经有图片,所以默认其图片是固定大小了,也就意味着ImageView是固定的了,所以这时view不会跟随父view铺满全屏,想要以 ImageView 的大小铺满父View,则 ImageView 的优先级则应该要低一些。 在xib中选中相应的ImageView,在约束那找到 Content compression resistance priority,将其优先级进行降低,也就是视图越容易被压缩。
如果在其他需求中ImageView不想被压缩,想要拉伸,而是设置Content Hugging Priority
约束优先级: 在Autolayout中每个约束都有一个优先级, 优先级的范围是1 ~ 1000。创建一个约束,默认的优先级是最高的1000
下面是关于两种属性的解释说明:
想第一时间获取我的最新文章,请关注公众号: 技术特工队
作为程序员经常使用命令行来进行一些文件的处理,比如常见的:git
, vim
,以及不同语言下的一些命令等。那么这么多的命令中,相信你肯定有用过cat
命令用来查看文件的内容,但是这个命令仅仅只能将文本展示出来,并不会很好的辅助我们阅读和理解里面的内容,尤其是文件中内容为 代码时,看起来就特别的痛苦了。那么这篇文章就要介绍更好命令来替代 cat
命令,它就是bat
命令。(不是windows中的那个脚本哟)
bat
是一个语法高亮显示和Git
集成的cat
高级版本,也就是说,bat
有 cat
的所有功能,且已经集成了代码高亮,和git
版本管理的工具,并且会对过长的文件进行自动分页,不会像 cat
一样全部一次打印,先来看张效果图: