OSX 开发知识点汇总(一)
栏目: Objective-C · 发布时间: 6年前
内容简介:下面为最近使用swift 进行 OSX 开发中,对于一些知识点的总结与汇总,主要是跨行过来,很多内容都不太熟悉,所以这里进行一部分的记录与总结,方便日后的回顾与思考,后续有新的也会继续进行补充。在上面两句话中间的语句则为同步代码块,Obj 为锁的对象。类似Java中的 synchronized(Obj)参考:
下面为最近使用swift 进行 OSX 开发中,对于一些知识点的总结与汇总,主要是跨行过来,很多内容都不太熟悉,所以这里进行一部分的记录与总结,方便日后的回顾与思考,后续有新的也会继续进行补充。
swift 代码同步块
objc_sync_enter(Obj) //code objc_sync_exit(Obj)
在上面两句话中间的语句则为同步代码块,Obj 为锁的对象。类似 Java 中的 synchronized(Obj)
//代码块 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/58b3d97c8d6d810057f5b647osx中监听窗口大小及状态的变化
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 方法。
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 方法
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的控件支持复制粘贴快捷键操作。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- 前端知识点汇总
- Java知识点汇总
- OSX 开发知识点汇总(五)
- ES6面试、复习干货知识点汇总(全)
- Android复习资料——Java知识点汇总(一)
- Android复习资料——Android知识点汇总(一)
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。