天道酬勤,学无止境

swift

How to properly test against certain values in NSEventModifierFlags via Swift?

问题 回答1 override func flagsChanged(with event: NSEvent) { if event.modifierFlags.contains(.shift) { // shift pressed } if event.modifierFlags.contains(.shift) == false { // shift released } }

2022-05-17 03:30:50    分类:技术分享    swift   macos   cocoa

Check if Timer is running

问题 我一直在尝试用计时器重新填充游戏生命,但是每当我离开视图并返回时,计时器就会重复并变得更快。 我试图用Timer?.isValid函数来解决这个问题,以便仅在计时器无效时运行计时器,因此它永远不会重复,但它似乎无法在 if 语句中检查计时器是否无效。 这是我到目前为止一直在使用的 if 语句: if (myTimer?.isValid){ } else{ //start timer } 任何帮助将不胜感激,谢谢。 回答1 var timer : Timer? func startTimer() { if timer == nil { timer = Timer.scheduledTimer... } } func stopTimer() { if timer != nil { timer!.invalidate() timer = nil } } 回答2

2022-05-17 03:30:29    分类:技术分享    ios   swift   xcode   swift3   nstimer

Counting coloured pixels on the GPU - Theory

问题 我有一个 128 x 128 像素的图像。 它被分解成一个 8 x 8 的网格。 每个网格块包含 16 x 16 像素。 要求 我想计算我的图像包含多少黑色像素。 直截了当的方法: 我可以通过逐行、逐列、检查整个图像并检查像素是否为黑色来做到这一点。 GPU方式 ...但我想知道如果使用 GPU,我可以将图像分解成块/块并计算每个块中的所有像素,然后对结果求和。 例如: 如果您查看图像的左上角: 第一个块,“A1”(A 行,第 1 列)包含一个 16 x 16 像素的网格,我通过手动计算它们知道,有 16 个黑色像素。 第二块:'A2',(A 行,第 2 列)包含一个 16 x 16 像素的网格,我通过手动计算它们知道,有 62 个黑色像素。 此示例的所有其他块都是空白/空的。 如果我通过我的程序运行我的图像,我应该得到答案:16 + 62 = 78 黑色像素。 推理 据我了解,GPU 可以并行处理大量数据,有效地在跨多个 GPU 线程的大量数据上运行小程序。 我不担心速度/性能,我只想知道这是否是 GPU 可以/可以做的事情? 回答1 事实上,通用 GPU(例如 Apple 设备中从 A8 开始的 GPU)不仅能够解决此类并行数据处理问题,而且还旨在解决此类问题。 Apple 在其平台中引入了使用 Metal 的数据并行处理,并且通过一些简单的代码,您可以使用 GPU

2022-05-17 03:00:11    分类:技术分享    swift   parallel-processing   gpu   computer-science

Firebase: Provided bucket does not match the Storage bucket of the current instance in Swift

问题 我有以下代码: let storageRef = FIRStorage().reference(forURL: "gs://slugbug-....appspot.com") // dots intentional let imageRef = storageRef.child("testImage.jpg") 但是应用程序崩溃了,我收到以下消息: 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“提供的存储桶:slugbug-....appspot.com 与当前实例的存储存储桶不匹配:(null)” 即使我使用 let storageRef = FIRStorage().reference() 桶为零。 为什么? 回答1 我想出了解决方案: 我将代码更改为: let storageRef = FIRStorage().reference(forURL: "gs://slugbug-....appspot.com") 到: let storageRef = FIRStorage.storage().reference(forURL: "gs://slugbug-....appspot.com") ...一个非常微妙但令人讨厌的错误 回答2 您缺少.storage() 。 检查你的线路。 它应该是: let storageRef

2022-05-17 02:47:25    分类:技术分享    ios   swift   firebase   firebase-storage

move navigationBar's left and right barButtonItem's vertically upwards

问题 我试图将导航栏的左右 barButtonItem 垂直向上移动,但没有成功。 我可以设法向上移动标题视图,但对 barButtonItem 使用相同的方法并没有做任何事情。 我想要达到的效果是在 safari 的 Bookmarks 页面上使用的: 我希望在没有任何导航栏子类的情况下实现这一点,这样我就可以保持半透明。 我的方法是直接在 IB 中为 leftBarButtonItem、Title 和 rightBarButtonItem 将 UIView 添加到导航栏。 这适用于标题,我可以添加标题和分段控件。 问题是当我添加左右 barButtonItem 时,我无法将它们垂直移动到分段控件上方。 我正在使用以下代码尝试在 viewDidLoad() 中垂直移动 barButtonItem: self.navigationItem.rightBarButtonItem?.setBackgroundVerticalPositionAdjustment(-15, for: UIBarMetrics.defaultPrompt) self.navigationItem.rightBarButtonItem?.setBackgroundVerticalPositionAdjustment(-15, for: UIBarMetrics.compactPrompt)

2022-05-17 02:13:03    分类:技术分享    ios   swift   uinavigationbar   uinavigationitem

Upgrading Firebase broke my iOS project

问题 我希望我从来没有更新过我的 pod,整个项目充满了错误,一个特定的错误在下面的照片中,我无法修复它,我已经准备好将我的应用程序提交到 App Store 现在看起来一切毁了。 最重要的是,它让我删除了一堆选项。 func uploadData(user: User) { let changeRequest = user.createProfileChangeRequest() changeRequest.displayName = self.nameUser.text! changeRequest.commitChanges(completion: nil) let imageRef = self.userStorage.child("\(user.uid).jpg") let data = UIImageJPEGRepresentation(self.imageView.image!, 0.5) let uploadTask = imageRef.put(data!, metadata: nil, completion: { (metadata, err) in if err != nil { print(err!.localizedDescription) } imageRef.downloadURL(completion: { (url, er) in if er !=

2022-05-17 00:47:20    分类:技术分享    ios   swift   xcode   firebase   cocoapods

Firebase push notification action

问题 我刚刚用 swift 3 构建了我的第一个应用程序。Firebase 运行良好,我正在我的设备上接收通知。 我想要做的是在用户单击通知时设置操作。 我想使用特定的产品 ID(从后端发送)发送到特定的 ProductViewController。 如果用户已登录,则继续使用 ProductViewController,如果未登录,则留在登录屏幕上。 AppDelegate.swift 代码: class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterDelegate, FIRMessagingDelegate { var window: UIWindow? func applicationReceivedRemoteMessage(_ remoteMessage: FIRMessagingRemoteMessage) { print(remoteMessage.appData) } func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { //

2022-05-17 00:38:09    分类:技术分享    ios   swift   firebase   notifications

How to instantiate SKSpriteNode spritekit swift 3

问题 回答1 这是非常基本的,但您需要: 为子弹创建一个新的精灵将子弹放置在与船相同的位置使子弹移动到屏幕顶部然后消失。 例如 let bullet = SKSPriteNode(ImageNames: "bullet.png") bullet.position = ship.position bullet.zPosition = ship.zPosition - 1 // Bullet is under the ship let bulletMove = SKAction.moveTo(y: frame.size.height, duration: 2) let bulletRemove = SKAction.removeFromParent() addChild(bullet) bullet.run(SKAction.sequence([bulletMove, bulletRemove])

2022-05-16 22:58:14    分类:技术分享    swift   button   sprite-kit   skspritenode   objectinstantiation

CABasicAnimation on CAShapeLayer not working for path change

问题 我这里有一个进度方法: func progress(incremented : CGFloat){ if incremented <= self.bounds.width{ self.progressLayer.removeFromSuperlayer() let originBezierPathProg = UIBezierPath(roundedRect: CGRect(x:0, y:0, width:0, height:self.bounds.height) , cornerRadius: self.viewCornerRadius) originBezierPathProg.close() let newBezierPathProg = UIBezierPath(roundedRect: CGRect(x:0, y:0, width:incremented, height:self.bounds.height) , cornerRadius: self.viewCornerRadius) bezierPathProg.close() self.progressLayer.path = originBezierPathProg.cgPath self.borderLayer.addSublayer(self.progressLayer) let animation =

2022-05-16 22:42:08    分类:技术分享    ios   swift   animation

PromiseKit cancel a promise

问题 如何取消尚未履行或拒绝的承诺? PromiseKit 的文档讨论了取消承诺,但我找不到如何执行此操作的具体示例。 鉴于: currentOperation = client.load(skip: skip, query: nil) currentOperation!.then { (items) in self.processItems(items: items, skip: skip, query: query) }.catch { (error) in print("failed to load items - just retrying") self.loadIfNeeded(skip: skip, query: query, onlyInStock: onlyInStock) } 如果查询更改(用户在搜索栏中输入一些文本)我想取消并丢弃currentOperation ,开始一个新的承诺。 回答1 为了取消一个承诺,你必须使用任何符合CancellableError协议的错误类型来拒绝它。 这样,任何将policy参数设置为allErrorsExceptCancellation的 catch 块都会让错误通过。 如果你需要一个 CancellablePromise,你可以继承 Promise 并实现一个 cancel() 函数

2022-05-16 22:36:10    分类:技术分享    ios   swift   promisekit