43

OSX 开发知识点汇总(一)

 5 years ago
source link: http://www.wxtlife.com/2018/07/22/osx-dev-summary-1/?amp%3Butm_medium=referral
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK