BRHJoyStickView 3.2.0

BRHJoyStickView 3.2.0

Brad Howes 维护。



  • 作者:
  • bradhowes

Build Status Swift 4.2 Swift 5.0 CocoaPods License: MIT

Joystick

一个在 Swift 中提供的自定义 UIView,用于展示简单的摇杆界面。自定义视图由两个 UIImageView 实例组成,一个用于底部,一个用于手柄。当用户移动手柄时,会根据其相对于摇杆底部的位置报告一个值。报告的信息类型取决于已安装的 监视器 类型。

  • JoyStickViewMonitorKind.polar - 报告出包含以下内容的 JoyStickViewPolarReport 实例:
    • 角度 -手柄指向的方向,以度为单位,其中北方/向上为 0°,东方/向右为 90°
    • 位移 -手柄相对于中心移动的距离,范围从 0.0 到 1.0
  • JoyStickViewMonitorKind.xy - 报告出包含以下内容的 JoyStickViewXYReport 实例:
    • x - 从底部中心水平偏移量,其中东方/向右为正值
    • y - 从底部中心垂直偏移量,其中北方/向上为正值

视图支持一个选项(movable),当用户将手柄移动到超过 1.0 的位移时,视图将移动。这当摇杆在应用程序中的初始位置对于用户的拇指来说不是最佳位置时非常有用。双击摇杆将其移回原始位置。

在上面的动画中,有两个摇杆,一个绿色和一个品红色。绿样式的摇杆是 固定的,即使触摸动作会导致超过 1.0 的位移,它也不会移动。然而,品红色摇杆是 可移动的,其底部会跟随触摸动作。对于可移动的摇杆,底部的运动可以可选地限制为 movableBounds 属性中的 CGRect,正如上面的演示动画中所述,其中品红色摇杆不能移动出粉色带。

附加属性

以下是 JoyStickView 的某些可配置功能。

  • handleConstraint -- 可选 CGRect 用于限制手柄可以移动的位置。请参阅示例 playground。
  • baseImage -- 用于摇杆底座的 UIImage。
  • handleImage -- 用于摇杆手柄的 UIImage。
  • baseAlpha -- 摇杆底座的透明度。
  • handleAlpha -- 摇杆手柄的透明度。
  • handleTintColor -- 应用到摇杆图像的可选着色颜色。
  • handleSizeRatio -- 应用于摇杆手柄图像的缩放。请注意,默认值为 0.85,由于历史原因。
  • enableDoubleTapForFrameReset -- 如果 movable 为 true,允许用户双击视图将底座移回原始位置。

发布

  • v3.0.0 -- Swift 5(没有代码更改,仅 Xcode 配置)
  • v2.1.1 -- Swift 4.2

代码

Xcode 工作区包含三个组件。

playground 和应用都依赖于框架中的 JoyStickView UIView。

Xcode playground 代码设置了显示环境,并安装了两个摇杆,一个固定(绿色)和一个可移动(黄色)。两个摇杆都将它们的坐标输出在两个标签中,一个用于角度,另一个用于位移。

文件JoyStickView.swift 定义了游戏手柄视图和行为。它位于JoyStickView 框架内部。在那里您还可以找到一个名为CoreGraphics+Additions.swift 的文件,该文件包含对一些 CoreGraphics 结构体的扩展,允许在JoyStickView 代码中进行一些简化的数学表达式。

默认情况下,JoyStickView 类使用存储在Images 文件夹中的两个图像资源

  • JoyStickBase*.png — 用于游戏手柄底座的图像
  • JoyStickHandle*.png — 用于游戏手柄手柄的图像。注意:此图像将使用 handleTintColor 设置着色

它们为今天的各种 iOS 设备提供了三种分辨率。它们是使用出色的Opacity 应用生成的。Opacity 文档包含在此存储库的Resources 目录中。

要使用自己的图像,只需简单地在您的代码中设置 baseImage 和/或 handleImage 属性,并用您希望使用的 UIImage 替换它们。

文档

请参见代码文档以获取更多信息。

CocoaPods

有一个简单的CocoaPods spec 文件可供使用,您可以通过在您的 Podfile 文件中添加 "BRHJoyStickView" 来添加代码和资源。目前一切基本正常,除非您使用 Interface Builder (IB) 指向图像资源会导致无效的 UImage 结果,因为文件不会在 IB 能找到它们的地方。唯一的解决方案是手动定位这些文件并将它们设置在您的视图加载代码中。以下示例可能会有所帮助

extension Bundle {

    /**
     Locate an inner Bundle generated from CocoaPod packaging.

     - parameter name: the name of the inner resource bundle. This should match the "s.resource_bundle" key or
       one of the "s.resoruce_bundles" keys from the podspec file that defines the CocoPod.
     - returns: the resource Bundle or `self` if resource bundle was not found
    */
    func podResource(name: String) -> Bundle {
        guard let bundleUrl = self.url(forResource: name, withExtension: "bundle") else { return self }
        return Bundle(url: bundleUrl) ?? self
    }
}

然后您在设置代码中需要做的就是

    override func viewDidLoad() {
        super.viewDidLoad()
        let bundle = Bundle(for: JoyStickView.self).podResource(name: "BRHJoyStickView")
        joystick.baseImage = UIImage(named: "FancyBase", in: bundle, compatibleWith: nil)
        joystick.handleImage = UIImage(named: "FancyHandle", in: bundle, compatibleWith: nil)
    }

podResource 方法尝试查找具有特定名称的内部包,如果找不到,则默认为原始包。然后,viewDidLoad 代码将在创建 UIImage 时使用正确的 bundle 对象。