技术特工队

人因梦想而伟大,因坚持而可贵


  • 首页

  • 归档

  • 分类

  • 标签

  • 关于

  • 公益404

文章首发公众号【技术特工队】

发表于 2020-01-01 | 分类于 Blog | 阅读次数 :
字数统计 : 92 | 阅读时长 : 1 分钟

想第一时间获取我的最新文章,请关注公众号: 技术特工队

【技术特工队】

技术特工队

分享工作中的技术点滴,包含应用层,涉猎系统层,以及新技术的探索、实践,也会涵盖职场分享,生活感悟,趣闻趣事等。但愿我们一起学习,一起成长,一起进步。

OSX AutoLayout原理介绍

发表于 2018-11-06 | 分类于 OSX | 阅读次数 :
字数统计 : 1,944 | 阅读时长 : 7 分钟

想第一时间获取我的最新文章,请关注公众号: 技术特工队

AutoLayout介绍

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 布局

传统的布局方式是基于Frame来做UI控件的界面布局的,即设置控件在父视图中的起始坐标点Origin(x,y)和控件的大小Size(width,height),为了精确,我们必须计算每个视图的frame。但布局一旦发生变化,相关frame都需要重新计算。然后这些计算都需要不断的手动动态的去计算,导致一旦有变化,就会需要去维护和调试。

自动缩放(auto resizing)

自动缩放的出现在一定程度上减轻了我们的负担。自动缩放规定父视图的frame变化时,视图的frame如何应对。如此一来,简化了布局响应外部变化所需的工作。但是他仅能应对外部父布局的变化,自身大小的变化则无法进行处理。

阅读全文 »

OSX 开发知识点汇总(五)

发表于 2018-08-27 | 分类于 OSX | 阅读次数 :
字数统计 : 1,251 | 阅读时长 : 5 分钟

想第一时间获取我的最新文章,请关注公众号: 技术特工队

TableView

在 OSX 中有一些列表的需求,这时候需要使用 OSX 中 TableView 来实现,但是这个 TableView 与 Android的 ListView 不太一样。使用还是比较复杂的。下面做一个简单的介绍,

TableView 的使用

  1. 首先需要在布局文件中,拖出一个TableView,并且添加相应的每列的数据源,主要是 使用 TableCellView, 里面默认的控件有一个TextFiled和一个ImageView,如果需要其他控件则需要自己进行自定义进行实现,下一小节会说到。

  2. 需要对 TableView 设置一个数据源,需要实现 NSTableViewDataSource接口, 并对 TableView 设置数据源,如下:

    1
    2
    3
    4
    5
    6
    7
    tableView.dataSource = self

    extension MainView: NSTableViewDataSource {
    func numberOfRows(in tableView: NSTableView) -> Int {
    return dataSources.count
    }
    }
  3. 对每行的数据进行渲染处理,设置delegate和target代理,并实现 NSTableViewDelegate接口中如下方法

阅读全文 »

OSX 开发知识点汇总(四)

发表于 2018-08-19 | 分类于 OSX | 阅读次数 :
字数统计 : 552 | 阅读时长 : 2 分钟

想第一时间获取我的最新文章,请关注公众号: 技术特工队

OSX 中Window中常用的一些属性

1. applicationShouldTerminate

在 AppDelegate 中,复写applicationShouldTerminate方法可以达到控制是否点击关闭按钮是否关闭应用的效果,其返回值TerminateReply有三个值,具体如下:

1
2
3
4
5
public enum TerminateReply : UInt {
case terminateCancel // 取消掉关闭,等于点击无作用
case terminateNow // 现在直接关闭
case terminateLater // 暂且不关闭
}

在下面的返回值可根据一些条件进行判断,比如有些应用点击关闭按钮是仅将窗口关闭,并最小化应用不退出,则可以根据设置情况进行返回不同的值。

1
2
3
func applicationShouldTerminate(_ sender: NSApplication) -> NSApplication.TerminateReply {
return .terminateNow
}

2. applicationShouldTerminateAfterLastWindowClosed

在 AppDelegate中 applicationShouldTerminateAfterLastWindowClosed中的作用为确认是否是等待所有窗口关闭后才关闭整个应用的作用。

1
2
3
func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool {
return true
}
阅读全文 »

OSX 开发知识点汇总(三)

发表于 2018-08-12 | 分类于 OSX | 阅读次数 :
字数统计 : 1,535 | 阅读时长 : 6 分钟

想第一时间获取我的最新文章,请关注公众号: 技术特工队

NSStackView

OSX 中 NSStackView 使用自动布局(系统的自动布局特性)来根据你的要求管理和对齐一组视图。可以设置为 水平方向,或者垂直方向。如下:

1
2
stackView.orientation = .horizontal //水平方向
stackView.orientation = .vertical //垂直方向

添加子view

为stackView 中添加 子view的方式如下:

1
stackView.addArrangedSubview(view)

注意: 由于stackView 是继承自 NSView, 所有也会有 addSubview(view) 的方法,但是调用此方法,不会自动扩大 stackView 的宽高,而导致新加的view 显示不出来。

移除子view

移除子 View 采用如下方式:

1
2
stackView.removeArrangedSubview(view) 
view.removeFromSuperview()

注意:子view从stackView移除后,还必须将子view从父view中移除

阅读全文 »

iOS UIWindow 覆盖 StatusBar

发表于 2018-08-05 | 分类于 iOS | 阅读次数 :
字数统计 : 1,168 | 阅读时长 : 5 分钟

最近产品要做一个消息的通知,而且通知是覆盖在 StatusBar 上面的。如果是普通的 UIView 则肯定是不行的,因为 StatusBar 为系统全局性的视图,所以要想覆盖它,则必须为 Statusbar 类型的,那么也就是 UIWindow 了。

UIWindow 的基础介绍

  • UIWindow是一种特殊的UIView,通常在一个app中至少会有一个UIWindow。
  • iOS程序启动完毕后,创建的第一个视图控件就是UIWindow,接着创建控制器的View,最后将控制器的View添加到UIWindow上,于是控制器的View就显示在屏幕上了。
  • 一个iOS程序之所以能显示在屏幕上,完全是因为它有UIWindow,也就是说,没有UIWindow就看不到任何UI界面。
  • 状态栏和键盘都是特殊的UIWindow。

这里有三个重要的对象UIScreen,UIWindow,UIView。

  1. UIScreen对象识别物理屏幕连接到设备
  2. UIWindow对象提供绘画支持给屏幕
  3. UIView执行绘画,当窗口要显示内容的时候,UIView绘画出他们的内容并附加到窗口上。
阅读全文 »

OSX webview 与 native 通信简单介绍

发表于 2018-07-29 | 分类于 OSX | 阅读次数 :
字数统计 : 798 | 阅读时长 : 3 分钟

想第一时间获取我的最新文章,请关注公众号: 技术特工队

在开发混合应用中,经常需要 js 与 webview 进行通信,那么官方也提供了一些方法进行消息处理,今天这里介绍一款开源库来更好的解决的 native 与 js 通信的问题,也就是 WebViewJavascriptBridge

基本配置使用

  1. 在 Podfile 文件中添加库稳健配置pod 'WebViewJavascriptBridge', '~> 6.0',然后执行pod install
  2. 使 WebViewJavascriptBridge 初始化与 Webview 进行绑定

    1
    let bridge: WebViewJavascriptBridge = WebViewJavascriptBridge.init(forWebView: webview)
  3. 在js层中进行注册处理

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    // 将该方法写入 javascript 中
    function setupWebViewJavascriptBridge(callback) {
    if (window.WebViewJavascriptBridge) { return callback(WebViewJavascriptBridge); }
    if (window.WVJBCallbacks) { return window.WVJBCallbacks.push(callback); }
    window.WVJBCallbacks = [callback];
    var WVJBIframe = document.createElement('iframe');
    WVJBIframe.style.display = 'none';
    WVJBIframe.src = 'https://__bridge_loaded__';
    document.documentElement.appendChild(WVJBIframe);
    setTimeout(function() { document.documentElement.removeChild(WVJBIframe) }, 0)
    }
  4. 经过上面的步骤,基本的搭建就完成了,下面就是要相互注册调用的函数,以及互相调用的方法。

  5. native 层注册方法供 js 调用,以及 native 层调用的js方法。
阅读全文 »

OSX 开发知识点汇总(二)

发表于 2018-07-29 | 分类于 OSX | 阅读次数 :
字数统计 : 428 | 阅读时长 : 2 分钟

想第一时间获取我的最新文章,请关注公众号: 技术特工队

在OSX使用网络请求时,如果使用的为http请求,需要进行两步操作,

  • 1.启动沙盒
    需要在APP需要启动沙盒具体为:
    target -> Capabilities -> App Sandbox 将Outgoing Connenctions 沟选上。
  • 2.在项目Info.Plist 中添加设置
    添加App Transport Security Settings 设置Allow Arbitrary Loads 为 true

为OSX项目添加Podfile

新建一个工程时,需要引用第三方库时,一般实用OPodfile 进行引用,初始化podfile,在项目根目录下执行 pod init, 之后产生 Podfile,然后在产生的文件中添加依赖,再在根目录下执行如下命令:

1
2
pod update
pod install

然后项目根目录下会产生.xcworkspace 的文件,这时需要将新建的工程关闭,然后使用双击xcworkspace来打开项目。后续添加新的库,只需执行 pod install即可。

swift 引用 oc 库桥接

如果开发中使用swift 语言,而库还是用oc语言开发的,如要使用oc库则需要添加一个配置bridge文件并配置在xcode中。

  1. 首先在项目文件名下面新建一个 .h 的文件,文件名一般为项目名+bridge.h,例如TestDemo-Bridging-Header.h
  2. 在该 .h 的文件中添加引入 oc 库的头文件,例如#import <DevMateKit/DevMateKit.h>
  3. 选中项目根目录,进入项目设置,选中 target 选项,找到swift Compiler -General,下面有项为:Object-C Bridging Header, 双击进入编辑状态,然后将前面新建的.h文件拖到编辑框内,路径会自动填充上(绝对路径),然后重新编译项目即可。

OSX 开发知识点汇总(一)

发表于 2018-07-22 | 分类于 OSX | 阅读次数 :
字数统计 : 1,607 | 阅读时长 : 7 分钟

想第一时间获取我的最新文章,请关注公众号: 技术特工队

下面为最近使用swift 进行 OSX 开发中,对于一些知识点的总结与汇总,主要是跨行过来,很多内容都不太熟悉,所以这里进行一部分的记录与总结,方便日后的回顾与思考,后续有新的也会继续进行补充。

swift 代码同步块

1
2
3
objc_sync_enter(Obj)
//code
objc_sync_exit(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/

swift 布局约束

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

下面是关于两种属性的解释说明:

阅读全文 »

比 cat 更好用的命令了解一下?

发表于 2018-05-20 | 分类于 Tools | 阅读次数 :
字数统计 : 615 | 阅读时长 : 2 分钟

想第一时间获取我的最新文章,请关注公众号: 技术特工队

作为程序员经常使用命令行来进行一些文件的处理,比如常见的:git, vim ,以及不同语言下的一些命令等。那么这么多的命令中,相信你肯定有用过cat命令用来查看文件的内容,但是这个命令仅仅只能将文本展示出来,并不会很好的辅助我们阅读和理解里面的内容,尤其是文件中内容为 代码时,看起来就特别的痛苦了。那么这篇文章就要介绍更好命令来替代 cat命令,它就是bat命令。(不是windows中的那个脚本哟)

bat介绍

bat 是一个语法高亮显示和Git集成的cat高级版本,也就是说,bat 有 cat的所有功能,且已经集成了代码高亮,和git版本管理的工具,并且会对过长的文件进行自动分页,不会像 cat 一样全部一次打印,先来看张效果图:

阅读全文 »
12…5
WangXin

WangXin

当你的成功欲望足以和呼吸的欲望相媲美的时候你就会成功。

50 日志
12 分类
37 标签
RSS
微信 github weibo
友情链接
  • CSDN Blog
  • 干货集中营
  • 算法之道
  • 程序猿圈
  • 双龙IOS
  • 华润IOS
  • Lee的笔记本
© 2018 WangXin
由 Hexo 强力驱动
主题 - NexT.Mist
Hosted by Coding Pages
本站访客数 人次 本站总访问量 次