Tag: xcode

SKCameraNode和Xcode调试视图层次结构

当我刚刚开始SpriteKit之旅时,我确实发现了许多问题。 当然,最常见的原因是我缺乏对Swift和Apple框架的经验,因此寻找解决方案可以帮助我学习和发展。 有时我会遇到不必要的事情,就像我前一天进入Xcode的Debug View Hierarchy 。 当涉及到SpriteKit , SKCameraNode和当前版本的Xcode v9.3.1中的调试器时,我确实遇到了一些特殊的行为。 我设置了一个非常基本的SpriteKit项目,以清楚地显示行为。 在这里,我们在SpriteKit编辑器中只有8个精灵。 正如我们所期望的,运行该应用程序将为我们提供与编辑器中完全相同的视图。 因此,让我们在运行应用程序时输入视图调试器,瞧,我们在调试器中也获得了完全相同的视图,就像在应用程序和编辑器中一样。 到目前为止,到目前为止,我们现在将SKCameraNode添加到场景中并再次执行相同的测试。 添加了SKCameraNode并再次运行该应用程序后,我们仍然可以获得预期的结果。 相机会看到我们定义的场景,并且应用程序中的视图正确。 因此,让我们再次输入Debug View Hierarchy … 哇! 这不是我期望的。 运行该应用程序时的视图是正确的,与编辑器中的视图相同,但是在调试器中获得的视图是不同的。 该视图似乎偏移了半个屏幕。 在将摄像机添加到场景(包括在开始新项目时添加到默认SpriteKit场景)后,就会始终发生这种情况。 通过SpritKit编辑器添加相机,或者以编程方式通过代码添加相机,这没有什么区别。 我发现通过将场景的锚点从默认值(0.5, 0.5) 0.5,0.5 (0.5, 0.5)更改为(0, 0)解决此问题,然后调试视图可以与SKCameraNode一起使用。 更改锚点会使调试器在使用相机时按预期显示视图,但除非场景的锚点(0,0)对我而言似乎不正确,否则无法将调试视图与SpriteKit和SKCameraNode一起使用,或成为预期的行为。 我希望调试器在运行应用程序时显示与我看到的视图相同的视图,无论我在场景中使用的锚点是什么。 这是Xcode v9.3.1中的错误吗? 还是我错过了什么? 最初于 2018 年5月16日 发布在 code.bitbebop.com 。

教程:与Xcode 9和Fastlane的持续集成

服务器上的Xcode 下载并运行Xcode 9 打开Xcode Preferences,选择Server&Bots选项卡,然后将切换开关更改为on。 您到达“选择集成用户”的地步。 对于更简单的教程,我将选择具有登录用户权限的同一用户帐户, 具有admin特权 。我的用户为“ jenkins”。 另外,对于本教程,请为任何安全提示选择“始终允许”。 您可能会收到一条消息“为Xcode Server集成用户启用了屏幕锁定”。 您应该在System Preferences > Security & Privacy 中将其禁用 。 如果一切顺利,您应该看到类似下图的内容。

TIL:应对开发环境问题

在开发过程中,不可避免地需要对开发环境进行一些更改。 例如,更新Xcode,更新您的Cocoapods版本,集成新的依赖项。 它似乎常常很棒,例如……可能出什么问题了?! 然后突然间,您尝试运行您的项目,并且似乎无关的错误浮出水面,这些是您之前从未见过且不知道如何解决的。 当这些事情发生时,我有两个问题要问自己: 我该如何解决? 为什么会这样呢? 我的直觉通常是先回答第一个问题。 我只是不想再被阻止,我只想修复它并继续前进。 但是……我内心深处知道,后一个问题更为重要,也很难回答。 因此,例如,我遇到了很多错误,在这种情况下,我似乎能够解决一个错误,然后又出现另一个错误。 pods are integrated into targets that do not have the same Swift version Duplicate interface definition for class ‘Mixpanel’ ADiOSUtilities required by Vida (Swift 3.0), VidaTests (Swift 3.0.1), EarlGreyVidaTests (Swift 3.0 ) ADiOSUtilities required by Vida (Swift 3.0), VidaTests (Swift 3.0.1), EarlGreyVidaTests (Swift 3.0 […]

在混合应用程序中将React Native从0.39.0升级到0.42.3

在Tido,我们以一种非典型的方式使用React Native。 它最初是一个纯iOS应用程序(Swift + Objective-C),然后我们慢慢开始将React Native组件嵌入现有视图中。 结果,我们的项目结构是非标准的-意味着我们没有典型的/ ios和/ android文件夹,并且某些自动化工具(例如:react-native-git-upgrade)可能永远无法使用我们的项目。 因此,我们继续进行“手动升级”。 快进了4个痛苦的日子,我们终于成功了(星期五下午4点!)。 有关此过程的信息很少,特别是对于非标准项目。 尝试了很多事情。 我们经历了每个GitHub问题和每个似乎与远程相关的StackOverflow问题。 没有成功 但是,我们认为我们设法简化了升级所需的步骤。 而且我们已经成功地重复了几次该过程。 希望这可以对某人有所帮助。 注意:当我们第一次将React Native集成到项目中时,完全有可能“奇怪”地进行设置。 可能导致不必要的痛苦。 我们欢迎任何意见/建议/建议! 1.清理您的节点依赖项 我们发现rm -rf ./node_modules可以解决很多问题,因此我们从这里开始。 2.清理您的构建文件夹 这里主要学习 。 在任何情况下,都不要在升级过程中信任Xcode缓存。 在很多情况下,我们认为它可以正常工作,只是清理了构建文件夹,并在后续构建中出现了故障。 Xcode中的快捷方式是Option-Shift-Command-K 3.关闭Xcode。 当对外部文件更改做出反应时,Xcode似乎并没有表现出一致的行为。 因此在关闭Xcode的情况下更改文件似乎更安全。 4.手动编辑您的节点依赖性 我们手动执行此操作,以便可以创建一个真正干净的node_modules目录。 更新您的package.json以使用react-native@0.42.3 5.重新安装您的节点依赖项 npm install 6.编辑Podfile以包括桥接到本机的依赖项 在下面的Podfile摘录中,我们必须添加第Podfile行: 10.将React添加到方案中的构建步骤 打开Product菜单,转到Scheme -> Manage Schemes然后双击所需的项目目标。 选择Build方案,并将React.framework步骤添加到方案中作为第一项,然后取消选中Parallelize builds : 11.修复本地引用(即:使用引号将导入转换为使用尖括号)。 在我们的案例中,我们需要在“ bridge”文件中进行更改(即:声明用于在Native / […]

指数

您可以在这里找到我最新的macOS App Development Series中的所有剧集。 每个链接将带您到嵌入视频的匹配文章。 搭建舞台 第1集。 故事板(2018年1月7日) 第2集。 自动版面配置(2018年1月21日) 第3集。 NSCollectionView 2018 ( 2018年1月28日) 做得更好 这里有一个主题列表,我将在接下来的几集中介绍这些主题。 NSCollectionView NSTableView 菜单栏 分割视图控制器 NSButton 自动版面 NSOutlineView 拖放 核心数据 下载 文件管理器 可可豆 迦太基 迅捷软件包管理器 感谢收看! 😎 如果喜欢,请测试 5秒钟内 可以击打 👏多少次。 这是出色的 指尖测试 ,可以帮助其他人看到故事。 如果您对任何主题感兴趣,请在下面给我留言。 在此处 查找上一个系列 。

Swift中的内存管理:调试问题

这是最后一篇文章,是有关Swift中的内存管理的三篇文章系列。 如果您不熟悉Swift中的内存管理,第一篇文章将介绍所有内容! 相反,如果您正在寻找常见问题,则可以在此处阅读第二篇文章。 Xcode提供了两种开箱即用的工具来调试复杂的保留周期: 内存图调试器 内存泄漏仪 第一个更加用户友好,但有时可能会忽略应用程序中的某些问题。 本文将展示如何同时使用它们,以及何时使用它们。 我还将分享另一个“技术”,在这里我称之为“分而治之”,但这实际上是找到特别难以捉摸的保留周期的最后手段。 让我们来看一个简单的例子,一个视图控制器意外地通过委托保留了自己: 让我们启动Memory Graph Debugger,看看它有什么要说的。 当应用程序正在运行时,可以在Xcode底部的工具栏中使用Memory Graph Debugger。 它有2条线连接的3个点: 启动后,请确保您位于右侧的标签(右侧第二个标签)中: 它将在左面板中显示该应用程序中当前存在的所有对象(数量很多!)。 Memory Graph Debugger有时很方便,但是即使对于诸如此类的简单泄漏,它也无法正确检测到它。 如果您知道某个对象没有在适当的时候被释放(例如,通过在deinit放置一个断点并观察到没有停止的地方)。 在底角,您可以输入搜索词并使用您感兴趣的对象进行过滤-这是我们的ViewController : 单击它会显示引用ViewController : 在这里,我们可以观察到MyView属性强烈引用了ViewController : 如预期的那样,使用weak引用( weak var delegate: MyViewDelegate? )解决了该问题,并且ViewController得到了正确的释放。 泄漏仪器是比Memory Graph Debugger更高级的工具。 但是,尽管功能更强大,但也更难使用。 使用与上述相同的示例,使用“泄漏仪器”运行该应用程序将得到以下结果: 泄漏检测工具记录在应用程序中创建和删除的每个对象的内存使用情况和引用计数 。 给定对象的实例,仪器可以让您知道何时创建对象,何时释放对象(如果有的话)以及何时增加或减少其引用计数。 例如,给定我们之前的ViewController实例,如果我们寻找它: 然后我们可以选择它,然后点击它旁边的小箭头: 该视图将过渡到另一个包含该类型的所有已释放实例和活动实例的视图: 在这里,我们可以看到我们只有一个实例,并且它仍然存在-肯定在那里发生了事情! 如果再追溯一次,我们将访问该实例的引用计数历史记录,然后由您确定为什么其引用计数从未达到0。 该工具较难使用的原因之一是可能有成千上万的引用计数更改。 默认情况下,仪器将尝试将保留/释放分组在一起,这可能会导致非时间顺序的参考计数更改。 如果您希望按时间顺序进行更改,请务必在开始时选择“按时间”。 您也可以通过单击“未配对”来取消对更改的配对。 单击一行将在发生时显示其完整堆栈跟踪,从而使您能够确定发生的位置和时间。 通常,您将在自己的代码中查找问题,因此您应假定“ Responsible […]

调试UIViewAlertForUnsatisfiableConstraints

作为iOS平台上的应用程序开发人员,我经常遇到如下约束警告, 无法同时满足约束条件。 以下列表中至少有一个约束是您不想要的约束。 尝试以下操作: (1)查看每个约束,并尝试找出不期望的约束; (2)查找添加了一个或多个不必要约束的代码并进行修复。 ( “” “, ” “, ” “, ” <“,” “ ”, “ “, ” “ ) 将尝试通过以下方式恢复 打破约束 在UIViewAlertForUnsatisfiableConstraints上创建一个符号断点,以在调试器中捕获该断点。 当我看到此类问题时,我们立即使用UIViewAlertForUnsatisfiableConstraints设置了符号断点。 当我再次运行该应用程序以重现该问题时,Xcode将在上述约束警告处停止。 现在如何处理指针和汇编代码? 经过研究,我找到了一些调试此断点的解决方案。 如果您看到上面的图像,您会看到%rbp,%rsp,%rbx,%r15等字符串。这些属性保存视图和约束的地址,这是约束问题背后的原因。 我们可以在Xcode控制台中打印它们,以查看有关此内容的更多详细信息。 我通常从打印rbx开始,因为根据我的经验,它通常是NSArray ,其中包含该问题涉及的所有视图和约束。 打开Xcode控制台并执行以下命令。 po $ rbx 以上结果看起来与警告消息完全一样,因此,我们可以如何处理它。 三想记住这里, 程序执行在断点处停止 您具有约束问题所涉及的所有视图的内存地址。 LLDB使您可以在运行时评估obj-c表达式 如果查看po $ rbx命令的结果,可以看到view的内存地址。 例如UIView:0x7f94ff5b3c70 我通常会为某些视图提供外观并继续执行程序。 使用从上一个打印命令获得的内存地址,在Xcode控制台中执行以下命令。 ex [(UIView *)0x7f94ff5b3890 setBackgroundColor:[UIColor greenColor]] ex [(UIView […]

Swift 4:更快交付iOS项目的提示

在担任iOS开发人员近两年后,我考虑过构建代码块,这将有助于我更快地开发任何项目。 这些代码块将满足最常见的要求,例如:导航,网络层,自定义字体,颜色等。使用这些代码块将为您节省一些时间和精力。 自定义字体 当您写label.font = UIFont(name: “foo”, size: 12)! 每次您要使用字体时,您都会遇到打字错误,并且如果字体已更改,将花费更多时间编辑代码。 相反,您可以利用扩展功能。 延期: 用法示例: label.font = UIFont.foo(size: 12) 色彩 每次需要使用时都要设置彩色RGB值,这将导致一些类似于自定义字体的困难。 同样,我们可以使用扩展! 延期: 用法示例: label.color = UIColor.foo就是这样! 通知中心名称 为了避免在使用通知名称时出现拼写错误,您可以创建一个扩展来保存项目中的所有名称: 延期: 用法示例: NotificationCenter.default.post(name: .foo, object: nil) 查看控制器名称 以编程方式在视图之间导航时,通常将需要目标视图控制器名称。 再次! 为了避免输入错误并避免冗余代码,我们使用扩展名。 延期: 用法示例: self.window?rootViewController = UIStoryboard.main.foo 弦乐 字符串与很多事情有关! 其中很多,您将需要在一个项目中多次使用。 我准备了一些有用的代码,但是您可以添加任何东西以满足您的需求。 延期: 用法示例: 让urlString =“ https://medium.com” urlString.openURL() https://medium.com” urlString.openURL() 快讯 […]

标签字体大小的自适应技巧

解决方案1: 我发现了使控件大小自适应的好技巧,感谢Saurav Chandra的这一技巧,它将为Android添加诸如CGFloat类型的“ dp”单元: But note : 您可以根据屏幕的设计分辨率将320替换为所需的值。以下是根据电话可以替换为320的值: iPhone 6、7、8 Plus-414 iPhone 6、7、8,X-375 并且只需要在大小后附加.dp即可,它会适应设备。 问题2 但是,如果我们使用Storyboard进行设计(大多数iOS开发者都这样做),那么我们将面临另一个问题,我们需要为应用程序中的每个标签制作插座以对其进行修改,这真的很困难,所以这很困难。是解决方案吗? 好的,我们可以使用外观更改应用程序中所有标签的字体,在StackOverflow上检查以下答案: 如何使用Swift默认设置UILabel字体和大小 我发现UISegmentedControl像这样更改字体和大小:UISegmentedControl.appearance()。setTitleTextAttributes… stackoverflow.com 解决方案2 现在,我们将组合所有解决方案: 因此,您将在UILabel扩展中添加新属性,该属性将通过将其字体大小乘以CGFloat的“ dp”属性来修改其font属性,不要忘了在AppDelegate中添加UILabel外观行以获得效果。 希望这个技巧可以在您即将推出的应用中为您提供帮助。 感谢您阅读🙂。 检查我的应用程序 Bokhary-短语键盘 。

C ++ Lambdas的成功和错误回调

今天,我们将快速介绍如何使用Modern C ++ lambda实现成功和错误回调。 在我的应用程序中实现应用程序内购买客户端时,我不得不进行一些HTTP调用以检索各种文件/数据。 我决定将系统相关的iOS / macOS代码包装在一个简单的HTTP类中,并使用两个额外的模板化参数作为成功/失败回调。 这是向类提供两个半匿名lambda的一种非常简单的方法。 让我们从类/包装器定义开始: HTTPRequest类。 如您所见,它混合了Objective-C ++和块 现在,这是一个简单的帮助器函数,用于创建新的HTTPRequest: MakeHTTPRequest负责转发和创建 现在让我们看一个真实的例子: 该课程非常简单,缺少一些内容,但是您可以理解。 Lambda在不同的场景中绝对是非常有用的,而且自Xcode开始支持C ++ 11以来,我就发现自己严重依赖它们。 干杯!