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

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

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的控件支持复制粘贴快捷键操作。

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


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

你的品牌,价值千万

你的品牌,价值千万

温迪 / 人民邮电出版社 / 2018-7-1 / 49.00元

“大道无术,万法归心。” 不管是互联网、社交媒体,还是 AI 怎样让人眼花缭乱。从“真心”出发塑造的个人品牌,都将带你从容面对任何一种变化的冲击。现代生活变得越来越透明,如果你不懂得如何真实、精准地定位和呈现自己,你的个人品牌在 碎片信息中被误解、被曲解就是一种必然。 本书分四步引导你剖析自己、发现自我,构建可持续的品牌生态系统,策划品牌战略,提升个人呈现力,并在最后带你勾画出一幅完整的个人......一起来看看 《你的品牌,价值千万》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

URL 编码/解码
URL 编码/解码

URL 编码/解码

html转js在线工具
html转js在线工具

html转js在线工具