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


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

查看所有标签

猜你喜欢:

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

Blockchain Basics

Blockchain Basics

Daniel Drescher / Apress / 2017-3-16 / USD 20.99

In 25 concise steps, you will learn the basics of blockchain technology. No mathematical formulas, program code, or computer science jargon are used. No previous knowledge in computer science, mathema......一起来看看 《Blockchain Basics》 这本书的介绍吧!

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

各进制数互转换器

MD5 加密
MD5 加密

MD5 加密工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具