OSX 开发知识点汇总(一)

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

下面为最近使用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

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

Content Hugging Priority: 该优先级表示一个控件抗被拉伸的优先级。优先级越高,越不容易被拉伸,默认是250。

Content Compression Resistance Priority: 该优先级和上面那个优先级相对应,表示一个控件抗压缩的优先级。优先级越高,越不容易被压缩,默认是750

下面是第二种解释说法:

Content Hugging Priority: 直译成中文就是“内容拥抱优先级”,从字面意思上来看就是两个视图,谁的“内容拥抱优先级”高,谁就优先环绕其内容。稍后我们会根据一些示例进行介绍。

Content Compression Resistance Priority: 该优先级直译成中文就是“内容压缩阻力优先级”。也就是视图的“内容压缩阻力优先级”越大,那么该视图中的内容越难被压缩。而该优先级小的视图,则内容优先被压缩。稍后我们也会通过相应的实例来看一下这个优先级的具体表现。

参考链接:
https://www.cnblogs.com/ludashi/p/7373051.html
https://juejin.im/entry/58b3d97c8d6d810057f5b647

osx中监听窗口大小及状态的变化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
NotificationCenter.default.addObserver(self, selector: #selector(self.enterFullScreen), name: NSWindow.willEnterFullScreenNotification, object: nil)

NotificationCenter.default.addObserver(self, selector: #selector(self.exitFullScreen), name: NSWindow.willExitFullScreenNotification, object: nil)

NotificationCenter.default.addObserver(self, selector: #selector(self.didResizeChanged), name: NSWindow.didResizeNotification, object: nil)


@objc dynamic func enterFullScreen() {
print("窗口将进入全屏")
}

@objc dynamic func exitFullScreen() {
print("窗口将退出全屏")
}

@objc dynamic func didResizeChanged() {
print("窗口大小变化")
}

// 取消监听:
NotificationCenter.default.removeObserver(self)

当然在还有其他的 NSWindow.***Notification 类型的通知,按需监听,并进行处理。

使用 Masonry 如何删掉约束

Masonry 是在ios与osx开发中 autolayout 进行动态布局约束不可或缺的一个好帮手,可以描述为可视化的语言去描述约束的情况。对于开发非常的方便。

对于删除动态约束可使用 MASConstraint 的 uninstall 方法。

1
2
3
4
5
6
7
8
9
10
11
12
var constraint: MASConstraint? 

// 设置约束,并赋值
view.remakeConstraints{ maker in
constraint = maker?.width.equal()(self)
}

// 删除约束
constraint?.uninstall()

//当然也可以使用 install添加约束
constraint?.install()

RxSwift 中debounce 与 throttle 的区别

下面是官方的意思

  • Throttle: the original function be called at most once per specified period.
  • Debounce: the original function be called after the caller stops calling the decorated function after a specified period.

下面为我个人的理解,及使用场景

  • throttle : 一般会指定一个时间值,在这个时间里,最多只执行一次,比如常见开发中避免狂点 button,需要对点击时间进行控制的, 就可以使用来指定
  • debounce: 指定的一个时间值内,没有新消息触发,则返回最后一个值,如果指定事件内有新消息触发,则取消旧消息,直到没有新消息来在执行后面的操作,这种应用场景在,数据不断变化时,可以对中间的数据变化不做处理,直到指定时间不再变化时在进行以最后一次的数据进行刷新。

参考链接: https://medium.com/@dkhuong291/throttle-vs-debounce-in-rxswift-86f8b303d5d4

OSX 上NSTextField 支持复制粘贴

在mac os 上开发,去掉了应用的edit menu后导致后续的 NSTextField 无法直接使用 command + c或者 command + v 进行复制粘贴。所以想要支持的化,需要复写 performKeyEquivalent 方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
private let commandKey = NSEvent.ModifierFlags.command.rawValue
private let commandShiftKey = NSEvent.ModifierFlags.command.rawValue | NSEvent.ModifierFlags.shift.rawValue
// 在 NSTextField 子类中进行复写 performKeyEquivalent 方法。
override func performKeyEquivalent(with event: NSEvent) -> Bool {
if event.type == NSEvent.EventType.keyDown {
if (event.modifierFlags.rawValue & NSEvent.ModifierFlags.deviceIndependentFlagsMask.rawValue) == commandKey {
switch event.charactersIgnoringModifiers! {
case "x":
if NSApp.sendAction(#selector(NSText.cut(_:)), to:nil, from:self) { return true }
case "c":
if NSApp.sendAction(#selector(NSText.copy(_:)), to:nil, from:self) { return true }
case "v":
if NSApp.sendAction(#selector(NSText.paste(_:)), to:nil, from:self) { return true }
case "z":
if NSApp.sendAction(Selector(("undo:")), to:nil, from:self) { return true }
case "a":
if NSApp.sendAction(#selector(NSResponder.selectAll(_:)), to:nil, from:self) { return true }
default:
break
}
}
else if (event.modifierFlags.rawValue & NSEvent.ModifierFlags.deviceIndependentFlagsMask.rawValue) == commandShiftKey {
if event.charactersIgnoringModifiers == "Z" {
if NSApp.sendAction(Selector(("redo:")), to:nil, from:self) { return true }
}
}
}
return super.performKeyEquivalent(with: event)
}

添加上上面的复写方法后,即可对NSTextField的控件支持复制粘贴快捷键操作。

参考:https://stackoverflow.com/questions/970707/cocoa-keyboard-shortcuts-in-dialog-without-an-edit-menu/3746058

WangXin wechat
欢迎订阅我的微信公众号,第一时间获取最新文章!
坚持原创技术分享,您的支持将鼓励我继续创作!