Tag: macos

比较NSCollectionView和UICollectionView#1

在将应用程序从iOS移植到macOS时,可以比较相似之处并移植代码。 自2015年使用OSX El Capitan 10.11(现称为macOS)以来,NSCollectionView已改进为现代API,看起来很像iOS的同级产品。 但是,仍有一些细微的更改,您需要进行研究才能注意到。 我将在以后的帖子中写这些。 这次,我将从内容容器的核心元素开始。 在macOS中,它称为NSCollectionViewItem。 在iOS中,您将找到它作为UICollectionViewCell。 内容容器的性质 为了指出这两个容器的基本原理,应从其祖先开始。 继承树如下所示: NSCollectionViewItem> NSViewController UICollectionViewCell> UICollectionReusableView> UIView 在macOS环境中,容器是一个控制器,它像其他View Controller一样具有一堆生命周期方法。 但是,在iOS中,它是一种视图,可以包含元素的子视图。 查看层次结构 为了继续上一点,默认情况下NSCollectionViewItem没有视图。 必须以编程方式或使用Interface Builder创建视图。 您可以在YouTube视频中了解有关如何构建此基础的更多信息。 在iOS中,它要简单得多。 假设您正在使用Interface Builder构建内容,只需将组件拖动到创建UICollectionViewCell附带的视图中即可 。 此外, UICollectionViewCell还具有一些访问视图的默认属性。 contentView-创建随附的默认视图 backgroundView —(可选)显示在单元格其他内容后面的视图 selectedBackgroundView —(可选)选择单元格时在背景视图上方显示的视图 在下一篇文章中,我将讨论准备此内容容器的区别。 参考文献 NSCollectionViewItem 项目是集合视图显示的最常见的元素类型,每个集合视图都必须位于… developer.apple.com UICollectionViewCell – UIKit | Apple开发人员文档 当一个数据项位于集合视图中时,UICollectionViewCell对象将显示该数据项的内容。developer.apple.com

在Jenkins中设置分布式体系结构(运行iOS / Mac OS构建)

在本文中,我们将设置Jenkins以运行iOS / Mac OS构建。 目标 众所周知,我们需要Apple硬件才能运行Mac / iOS版本。 如果您在Linux机器上托管Jenkins CI服务器,则该服务器无法运行Mac / iOS 建立。 因此,我们需要创建一个分布式系统(主/从架构),以便从服务器能够运行Mac / iOS 建立。 Master →Linux Server(托管Jenkins的远程计算机) 从站 →Mac(在其中构建项目) 设定 下载Jenkins并在远程计算机上托管。 在浏览器中输入詹金斯地址,您将看到以下屏幕: 登录后,您可以看到仪表板。 在Jenkins中配置从节点 转到Jenkins→管理Jenkins→管理节点 单击新节点→添加节点名称→检查永久代理→按确定 将远程根目录添加到/ Jenkins (稍后我们将在从属节点中创建此目录)。 选择启动方法: 通过Java Web Start启动代理 →单击保存。 如果未显示该选项,则需要在Jenkins中添加TCP端口。 为JNLP代理管理Jenkins>配置全局安全性> TCP端口。 添加一个静态端口。 (启用防火墙中的端口 ) 您可以看到处于断开状态的新创建的代理 单击节点以查看启动方法 在詹金斯中连接主从 首先,在从站中创建一个工作目录/ Jenkins 。 这将是Jenkins将放置所有项目文件的目录,并且必须与Jenkins中的Node中指定的远程根目录匹配(请参见图: 在Jenkins中设置新节点 )。 打开您的mac终端并点击命令 cd / […]

用于iOS / macOS开发的拖动手势识别器(具有初始位置)

众所周知,在计算机上使用鼠标时,按下鼠标按钮会发生拖动操作,然后移动设备,最后释放按钮。 这是连续且精确的操作。 在iOS中,我们使用了(不太精确的)触摸,但是有时我们确实希望在开始,移动以及最终结束触摸时对拖动操作做出类似的反应。 UIPanGestureRecognizer本身可以很好地识别此类拖动操作,只是当其达到开始状态时,用户已经稍微移动了触摸,并且我们不再知道初始位置-没有locationInViewWhenTouchesBegan属性-而我们需要它来准确计算坐标增量以响应拖动操作。 (以一种预期的方式,因为我们不希望在第一次触摸开始时立即开始平移操作,因为我们正在等待用户是否真正想平移或执行其他操作。) 更新:虽然这很烦人,但它也是NSPanGestureRecognizer在macOS Cocoa开发中与鼠标事件一起工作的方式,只是很难看到那里的行为。 要解决该问题,您需要开始用鼠标从元素可拖动区域的限制向该元素外部的空间拖动。 为了解决这个问题(至少在今天),我们需要自己专门化识别器类,在实际开始触摸时读取并保留视图中的位置,并改用专门化。 请注意下面的内容,我们为此目的如何定义一个初始位置视图属性。 (不过,如果要在框架之外使用它们,则需要将类和属性公开 。) 导入UIKit.UIGestureRecognizerSubclass class DraggingPanGestureRecognizer:UIPanGestureRecognizer { var locationInViewWhenDraggingStarted = CGPoint.zero 覆盖func touchesBegan(_ touches:设置,事件:UIEvent){ super.touchesBegan(touches,with:event) locationInViewWhenDragStarted =位置(在:视图中) } } 最后,这是显示如何使用新服务的客户端代码: @IBAction函数泛(_识别器:DraggingPanGestureRecognizer){ 切换识别器状态{ 案例。开始: 让点= ogniser.locationInViewWhenDraggingStarted beginDragging ( 位于 :点) 情况已更改: 让点= identifier.location(在:ognitor.view) ContinueDragging ( 到 :point) … } } 和/或,如果您需要类似的实现来进行macOS开发(例如),即从NSPanGestureRecognizer继承,这里我们再做一次(但请注意,客户端代码与上面的代码完全相同,因此在下面不再赘述): 导入AppKit类DraggingPanGestureRecognizer: NSPanGestureRecognizer { var locationInViewWhenDraggingStarted = […]

隐藏窗口,而不是单击关闭按钮时将其关闭

开发单个窗口式,非基于文档的Cocoa应用程序时出现问题。 也就是说,当用户单击窗口上的关闭按钮时,它将关闭,但是无法将其恢复。 为了解决这个问题,我们应该“隐藏”窗口,而不是在用户尝试关闭窗口时将其关闭。 Xcode模板的最新版本针对单个窗口应用程序使用情节提要和窗口控制器,除其窗口控制器外,无法将窗口的委托连接到其他对象。 因此,这给了我们两个选择:1.子类化NSWindowController; 2.用代码将窗口的委托连接到目标对象,例如一个NSViewController对象。 解决方案1.子类化NSWindowController 创建一个新的NSWindowController子类,并在头文件中添加协议一致性(如果使用Swift,则不这样): 目标C: @interface VCWindowController:NSWindowController @结束 在实现文件中: #import“ VCWindowController.h” @interface VCWindowController() @结束 @implementation VCWindowController -(void)windowDidLoad { [super windowDidLoad]; //实现此方法以处理从其nib文件加载窗口控制器的窗口之后的所有初始化。 } -(BOOL)windowShouldClose:(id)sender { [NSApp hide:nil]; 返回否; } @结束 迅速: 进口可可 VCWindowController类:NSWindowController,NSWindowDelegate { 是否需要初始化?(编码器:NSCoder){ super.init(编码器:编码器) } func windowShouldClose(sender:AnyObject)-> Bool { NSApp.hide(无) 返回假 } } 创建类后,现在可以将代码连接到窗口。 一种。 将窗口控制器设置为自定义NSWindowController子类: b。 右键单击Window,将“代理”连接到Window Controller对象: 现在构建并运行您的应用程序,单击“关闭”按钮将仅隐藏您的应用程序,而不是关闭它。 […]

为XCode项目安装Cocoa Pods

在这篇文章中,我将展示如何为Xcode项目安装Cocoa Pods 。 Cocoa Pods是Swift和Objective-C Cocoa项目的依赖项经理 。 安装 在安装XCode时,您还将获得gem ( RubyGems , Ruby包管理器 )。 此命令允许您安装Xcode的Cocoa Pods,而无需任何额外配置。 执行以下命令 sudo gem install cocoapods 在获取依赖包列表之后,您可以使用可可豆荚调用命令pod 。 但是,每个命令都必须在 Xcode项目的 根文件夹中执行 : pod init :在Xcode项目文件夹中创建一个空的初始PodFile 。 pod install :安装PodFile定义的PodFile 使用Cocoa Pods命令行 照常创建Xcode应用程序。 然后,在安装Cocoa Pods之后,您可以创建执行pod init的初始PodFile 在应用程序的根文件夹中。 之后,您将获得一个PodFile像这样: #取消注释下一行以定义项目的全局平台 #platform:ios,’9.0′ 定位 “我的应用名称” #如果您不使用Swift并且不想使用动态框架,请注释下一行 use_frameworks ! #我的应用名称荚 结束 如果您想添加一些Pod,例如Google Maps iOS SDK组件,则可以将其添加到target部分: […]

了解Apple的二进制属性列表格式

标记字节有时足以完全识别一个对象。 例如,空值的标记等于零,布尔值的标记为0(如果为false),如果标记为0,则为0x09(如果为true)。 所有其他对象都可以通过其4个最高有效位来唯一标识(从现在开始,我将使用最左和最右的术语代替MSB和LSB)。 例如,整数的最左4位是0001(0x1),而对于字符串,它们是0110(0x5)。 剩下的最右边的4位表示大小信息,即,此类型的实际值将在标记之后占用多少字节。 在某些情况下,如果对象足够小,则会立即在最右边的4位中对大小进行编码。 例如,ASCII字符串“ Hello”将被编码为0x55,然后将跟随实际的字符值。 在其他情况下,填充标记(0x0F)与对象标记进行“或”运算,表示下一个字节在实际值字节之前编码大小信息。 更具体地说,如果标记的最右4位等于1111(0xF),则下一个字节将具有以下结构: 其最左边的4位等于0001(0x1) 它的最右边的4位告诉我们编码对象大小需要多少字节。 如果最右边的4位包含值x ,则大小将需要pow(2,x)字节 然后,跟随pow(2,x)个字节,应该以大字节序读取该字节,以提供对象的实际大小。 之后,将遵循对象的实际值。 例如,字符串“ This is a long string”包含21个ASCII字符。 标记为0x5F,后跟字节0x10 (因为pow(2,0)= 1,并且1个字节足以编码值21),然后是0x15 (十六进制的十进制21),然后是21个字符其他。 对应于诸如整数,实数,字符串之类的对象的标记紧随其后的是代表其实际值的多字节序列(例如,如上所述的单个字符串字符)。 但是,并非总是如此。 对于对象容器,例如数组和字典,标记字节后跟对象引用 只是偏移表的偏移量(请参阅下一节)。 这样的偏移量是object_ref_size 由bplist尾部确定的长字节,从偏移量表的开头开始计数。 因此,容器元素只是大小为object_ref_size的引用,它指向偏移表中的某个位置,该位置本身就是offset_table_offset_size 字节长,指向对象表,特别是指向与单个对象相对应的标记。 下一节中的示例将消除所有混淆。 此技术将实际的多层结构平面化,并允许所有对象具有固定的大小。 因此,我们始终知道,值0xA5的标记后面是5 * object_ref_size字节。 这种间接级别也允许基本的压缩形式。 当容器的值完全相同时,它们可能指向相同的偏移表偏移量。 容器示例: 0xA5 — 5个元素的数组。 在标记后没有立即找到这5个元素的值。 相反,在标记之后,我们找到5个对象引用,它们充当偏移表的偏移量。 遵循这些引用后,可以在对象表中找到其各自的字节标记的偏移量,在该表中可以找到实际值(或者如果标记再次是容器,则遵循相同的过程)。 0xAF 0x10 0x0F —由15个元素组成的数组(与上面相同,但是现在大小信息不适合4位)。 随后是15个对象引用。 0xD6 —由6个键值对组成的字典。 […]

งร้าง柜台บน触控栏

窗口— Helloอของที่เราทำไว้ครั้งที่แล้วา您好,TouchBar…แต่ที่เพิ่มว่าคือ其他项目 视图控制器Contentน内容视图控制器ขอข窗口จะมีTouchBarอีกอันเป็นของตัวเองซึ่งจะมีปุ่ม2ปุ่มกับLabel 1อันเพื่อทำเป็นCounter 其他项目—ตัวBar Bar Bar Bar edืืืposed Touch Touch Touch Touch NSTouchBarItem Touch Touch Touch Touch ItemหหBar Item Item Bar Touch Bar Bar Res Res Res Resั้Res Barาตัวต่อามาใส่ตรงนั้นให้แต่ถ้าไม่มีระบบจะเอาTouchBarตัวต่อไปมาใส่แทนเลย (พูดง่ายProxyตัวอถ้าไม่ใส่otherItemsProxyตัว您好,TouchBarของ窗口จะโดน替换ด้วยTouchBarของView Controllerเลยนั้นเอง) รายละเอียดเพิ่มเติมอ่านได้จากลิ้งค์ได้ล่าง NSTouchBar 在受支持的MacBook Pro型号上,键盘上方的触摸栏显示了来自… developer.apple.com 的NSTouchBar类的实例。 otherริ่มแก้โค็ดอันเก่าของเราโดยการเพิ่ม。otherItemProxyไปในWindowController.swift 柜台ใคนให้ลงไปดูล่างสุด 4.ใส่计数器ให้กับ视图ในViewController TouchนในTouchBar在Barากดในตัวเลขใอแเพิ่มด้วยไปด้วอTouch Touchยนไปด้วย中 ใส่LabelไปใาไปในViewของViewControllerในIBแล้วก็bindมันซะก็จบละ จบแล้ว…สำหรับ源代码ดูได้ในGithubใน分支机构计数器 n3tr / CounterTouchBar 通过在GitHub上创建一个帐户为CounterTouchBar开发做出贡献。 github.com Dribbble API应用商店NSScrubber TouchBarไม่ขึ้น,标签Labelใส่แล้วาใส่แล้วTouchBarขViewControllerหายไป เกิดาเกิดTouchBarของViewControllerที่เราสร้างไม่แสดงซึ่งผมก็เจอปัญหานี้เหมือนกันโดยกรณีที่ผมเจอคือ makeTouchBarแล้วใช้ได้ […]

NSView和CALayer

我最近在构建macOS应用时遇到了动画问题。 我无法正确显示转换后的图层。 事情变得很时髦。 因此,我决定花一些时间再次阅读文档。 它带给我以下几点: 查看编程指南 核心动画编程指南 他们有这样的关系: NSView位于AppKit Framework内部,它可以成为层支持的视图,并添加硬件支持以渲染图形。 重要学习 使用CALayer后,视觉效果将由硬件渲染。 也就是说,纯NSView由CPU处理 与UIView相比,NSView具有翻转的坐标系。 NSView中的点(0,0)指向左下角 AppKit和NSView无法提供简单的方法来制作内容动画 实际上,Core Animation在macOS和iOS上是相同的。 但是,大多数iOS用户会使用UIView进行动画处理 核心动画利用keyPath定义要进行动画处理的内容 CATransaction可用于显式设置多个属性的动画 动画完成后,动画属性仍将保持原始值,因此视觉效果将在动画结束时跳回 在动画代码之后将动画属性设置为最终值 在设置锚点和其他转换之前,将子视图添加到视图层次结构 CATransform本身是一个值,而不是动画。 进行设置,图层将转换为该特定值。 我已经完成了一个示例项目,以通过沿x轴进行3D变换来展示上述知识。 harryworld / RenderedImageView RenderedImageView –学习CALayer github.com

macOS Mojave — MacStadium用户需要了解的内容

macOS Mojave最近被大肆宣传(如果没有别的,Apple知道营销)。 尽管主要面向消费者的发行版(暗模式!),但引擎盖下的许多性能和稳定性方面的改进也使MacStadium客户满意。 MacStadium工程师已经对Mojave进行了全面测试,并且正如预期的那样,没有发现延迟或数据包丢失问题。 一旦他们对Mojave的安全性和稳定性进行了全面审查,并且我们的内部审查完成了,我们将为新Mac部署提供macOS Mojave作为“即时激活”选项。 这通常与新OS的X.1版本相对应。 欢迎客户自行承担升级和风险,但是在采用任何新操作系统时,我们建议您谨慎行事。 升级时,MacStadium建议: 如果您运行的是macOS Server,请确保查看Mojave随附的更改,因为其中的某些更改可能会严重:https://www.macworld.com/article/3253104/operating-systems/apple-cuts-macos-server -features.html 在开始更新之前,如果可能,请通过克隆计算机来备份数据。 如果需要,它比Time Machine更干净,更快速地还原。 更新时,请保持连接状态,以便您可以与需要注意的所有提示进行交互。 请注意,更新可能需要30–60分钟。 完成更新并重新启动系统后,请确认电源和睡眠计划选择。 如果您希望通过远程重启获得帮助,请在安装过程中向support@macstadium.com发送电子邮件以获取帮助。 即使在Mac上也要注意,早期的OS版本仍然可能存在错误和安全问题。 有关开发人员的新增功能的更多信息,请参见以下内容: macOS Mojave 10.14发行说明 https://developer.apple.com/documentation/macos_release_notes/macos_mojave_10_14_release_notes macOS SDK的新功能 https://developer.apple.com/macos/whats-new/ ‍ 最初发布在 blog.macstadium.com上 。

从灵感到生产,第1部分

最后但并非最不重要的一点是,我们有时间做我们以前无法做到的事情,适当地讨论事情,而无需感到压力。 我可以继续下去,当您节省的是时间时,可能性无穷无尽。 时间是值得信赖的绝佳货币。 建立iOS Foundation并在选择的框架中添加约定可以帮助我们减少在客户端项目之间进行切换时的上下文切换量。 如果您希望拥有协作文化,那么这至关重要。 由于实现之间的转换很容易,因此提供帮助的动机就越来越大。 它们越相似,上下文切换就越容易。 我们首先担心基金会会引入限制,从而降低团队的整体幸福感。 它确实要付出代价:自由选择或跳跃任何新事物。 就是说,基础并不是一成不变的,它应该像所有实施一样,成为始终应受到质疑,修订和改进的指南。 在选择新技术并引入影响整个团队的新依赖项时,它应该可以帮助您清醒。 建立牢固的基础需要花费时间,并且需要进行大量讨论,您可能会发现您在所有事情上均未达成共识,但是我敢打赌,您和您的团队都会为已经被定义为潜规则的事情感到惊讶。 当然,并不是所有人都会对所有决定感到满意,这就是民主的来龙去脉。我们使用赞成或反对的态度投票,如果多数票通过,那么就应该解决。 话虽如此,仅仅是因为某些东西没有被基金会接受并不意味着它不能被使用。 核心基础只是定义了转到工具的工具,如果该工具达不到标准,请问自己“可以改进吗?”。 如果是,那么这是进行开源开发的绝佳机会。 如果没有,也许我们需要完全不同的东西。 如果工具真的是通用的,并且从长远来看是属于基础的,那么随着时间的流逝,过多的否定也应该成为指导。 基金会最终比我们原先想象的要多得多,不仅仅是问题。 这是我们讨论团队前进方向的论坛。 即使我们基础上的活动放慢了速度,也并不意味着它不起作用。 相反,我认为事实恰恰相反。 随着摩擦的减少和结论的真实性,我们认为我们未来的自我会发现能够查明为什么,如何以及何时到达自己的位置会很有用。 如前所述,回顾过去可能是前进的最佳方式,但请记住,对过去的选择要仁慈,即使最终选择是错误的。 相反,拥抱并祝贺自己做出了选择。 我们仍然将Slack用作沟通的主要工具,但是一旦我们进入涉及做出会影响运营的决策的讨论时,我们就会将其移至基础,以便每个人都有时间参与。 最初,我想在一篇文章中总结所有内容,很快我发现一次开会的内容太多了,因此我决定将其分为四个部分。 这是“ 从灵感到生产” 的第一部分, 不要担心开发人员,即将到来的文章中将有一些代码片段。 您可以在Twitter @ zenangst和GitHub @zenangst上找到我 。