在Watch App中创buildWKInterfaceImage的进度圈

我正在尝试为我的应用的Apple Watch版本创build一个进度圈。 我知道我们不能使用UIViews(这将使事情变得如此简单!),所以我正在寻找替代品。

基本上,我想创build一个这样的原型:

在这里输入图像说明

我希望做的事情的方式是将背景图层添加为正常的WKInterfaceImage,然后将顶部的进度箭头/线添加为WKInterfaceImage,该WKInterfaceImage根据计算的百分比围绕圆圈旋转。

我有这样的基本计算百分比,我正在寻找的是一些帮助旋转箭头的math代码。

有谁知道这是否可能,如果有的话,谁能帮我一把吗? 我没有试图在应用程序运行时更新该圈子; 它只是需要更新时,手表应用程序启动对应的iOS版本。

谢谢!

另一个解决scheme是创build100张照片,每个数字你有一个框架。 因此,您可以使用“startAnimatingWithImagesInRange:duration:repeatCount”方法显示animation。

问题是很难定制每个帧。 有人想到这个问题,并创造了一个发电机。 你可以通过这个名字find它:

径向条形图生成器

这个链接可以帮助你自定义框架: http : //hmaidasani.github.io/RadialChartImageGenerator/

你也有同样的样品在git链接上。 对于具有单个弧形框架的100帧,您可以在磁盘上获得大约1,8 MB的空间。

从watchOS 3开始,可以使用SpriteKit。

SKShapeNode可以绘制形状,因此可以创build径向环。

  1. 在故事板中添加一个WKInterfaceSKScene到你的界面控制器,并通过sockets连接它。
  2. 在接口控制器的唤醒方法中进行设置

     override func awake(withContext context: Any?) { super.awake(withContext: context) scene = SKScene(size: CGSize(width: 100, height: 100)) scene.scaleMode = .aspectFit interfaceScene.presentScene(scene) } 
  3. 创build一个形状节点并将其添加到场景中

     let fraction: CGFloat = 0.75 let path = UIBezierPath(arcCenter: .zero, radius: 50, startAngle: 0, endAngle: 2 * .pi * fraction, clockwise: true).cgPath let shapeNode = SKShapeNode(path: path) shapeNode.strokeColor = .blue shapeNode.fillColor = .clear shapeNode.lineWidth = 4 shapeNode.lineCap = .round shapeNode.position = CGPoint(x: scene.size.width / 2, y: scene.size.height / 2) scene.addChild(shapeNode) 

例

在iOS上可用的大部分内容在WatchKit中尚不存在(尚)。 特别是,你想要做的件事情几乎是不可能的。 (一会儿有一丝希望)。 特别是,你不能旋转图像。 或者说,您可以旋转图像,但必须在手机上进行,然后在运行时将该图像传递给手表。 此外,你不能轻易地合成图像 – 但是,有办法做到这一点。

一种方法是按照您想要的方式构build整个旋转的合成图像,并使用[WKInterfaceButton setBackgroundImage:]将最终数据传递给button。 不幸的是,你可能会发现模拟器的速度很慢,很可能在实际的手表上效果不佳。 很难知道,因为我们没有一个,但这是通过蓝牙发送图像。 所以你不会得到stream畅的animation或者很好的响应时间。

更好的方法是在手表上破解你的方式。 这依赖于两个技巧:一个,将组与背景图像分组在一起。 二,使用 – [WKInterfaceImage startAnimatingWithImagesInRange:duration:repeatCount:]。

对于第一个技巧,将一个组放入布局,然后在其中放置另一个组,然后(可能)在其中放置一个button。 然后使用 – [WKInterfaceGroup setBackgroundImage:]和图像将复合在一起。 确保你使用适当的透明度等

对于第二个技巧,请参考官方文档 – 实际上,您需要一系列图像,每个可能的旋转值都需要一个,正如erdekhayser所说。 现在,这看起来可能太过分了,而且可能不切实际(不是)。 这实际上是苹果公司build议创build纺纱厂之类的东西 – 至less目前来说。 而且,是的,这可能意味着生成360个不同的图像,虽然由于屏幕较小,我的build议是每3 – 5度左右(没有人能够区分)。

希望这可以帮助。

WKInterface类不能被子类化。 因此,自定义控件是不可能的。

另外,animation也是有限的。 为了创build一个animation,你必须把每一个帧存储为一个图像。 然后,您可以在WatchKit应用程序中看到一个图像视图,循环显示这些图像。

将图像存储在监视目标的Images.xcassets文件夹中,并尝试根据活动完成百分比来改变框架。

一个额外的注意事项:有100个图像将不会有效,因为每个WatchKit应用程序只有有限的空间,它可以占用的空间(我相信是20MB,但我不知道)。 也许每5%就有一个图像。

没有人发布代码? 这里是! 请享用:

1)在这里创build图像: http : //hmaidasani.github.io/RadialChartImageGenerator/

2)拖拽一个select器到您的视图控制器,并链接到一些viewController.swift文件。 将Picker样式设置为右侧出现的菜单上的“Sequence”(序列)。

3)将此代码添加到viewController.swift,并将select器连接到IBOutlet和IBAction:

 import WatchKit import Foundation class PickerViewController: WKInterfaceController { override func awakeWithContext(context: AnyObject?) { super.awakeWithContext(context) } @IBOutlet var itemPicker: WKInterfacePicker! override func willActivate() { super.willActivate() let pickerItems: [WKPickerItem] = (0...100).map { let pickerItem = WKPickerItem() pickerItem.contentImage = WKImage(imageName: "singleArc\($0).png") return pickerItem } itemPicker.setItems(pickerItems) } @IBAction func pickerSelectedItemChanged(value: Int) { NSLog("Sequence Picker: \(value) selected.") } override func didDeactivate() { super.didDeactivate() } } 

不,不可能在手表套件上创build这个自定义的圆形,因为UIView不适用于手表套件。

只有你的问题的解决scheme是你必须把每个帧的100个图像…并确保图像的大小小于20 MB。 因为手表应用程序的大小高达20 MB