Giter Club home page Giter Club logo

swiftuijoystick's Introduction

SwiftUIJoystick ๐Ÿ•น๏ธ

A customizable Joystick made with SwiftUI

Create your own Base and Thumb/Handle view using SwiftUI

SPM CocoaPods License: MIT

Features

  • Customizable background and thumb/foreground
  • Normal Joystick Example
  • Locking Joystick Example
  • Polar or XY Coordinates

View these examples to see how to make your own Joystick!

(View Code Example) (View Code Example) (View Code Example)

๐Ÿ“ฒ How to Install ๐Ÿ•น๏ธ

Swift Package Manager SPM

Add this repository's URL https://github.com/michael94ellis/SwiftUIJoystick

Cocoapods

Add this line to your podfile pod SwiftUIJoystick

๐Ÿ›  How to use

Example Code:

Ready to Copy, Paste, and Use (after install with SPM or Pods)

// An example Joystick
// Copy this example and modify it

import SwiftUI
import SwiftUIJoystick

public struct Joystick: View {
    
    /// The monitor object to observe the user input on the Joystick in XY or Polar coordinates
    @ObservedObject public var joystickMonitor: JoystickMonitor
    /// The width or diameter in which the Joystick will report values
    ///  For example: 100 will provide 0-100, with (50,50) being the origin
    private let dragDiameter: CGFloat
    /// Can be `.rect` or `.circle`
    /// Rect will allow the user to access the four corners
    /// Circle will limit Joystick it's radius determined by `dragDiameter / 2`
    private let shape: JoystickShape
    
    public init(monitor: JoystickMonitor, width: CGFloat, shape: JoystickShape = .rect) {
        self.joystickMonitor = monitor
        self.dragDiameter = width
        self.shape = shape
    }
    
    public var body: some View {
        VStack{
            JoystickBuilder(
                monitor: self.joystickMonitor,
                width: self.dragDiameter,
                shape: .rect,
                background: {
                    // Example Background
                    RoundedRectangle(cornerRadius: 8).fill(Color.red.opacity(0.5))
                },
                foreground: {
                    // Example Thumb
                    Circle().fill(Color.black)
                },
                locksInPlace: false)
        }
    }
}

๐Ÿ›  How to customize

Start by making a JoystickMonitor

You can subscribe to changes

Use a JoystickBuilder to build your own Joystick Controls' Background/Base and Thumb/Foreground views

Setup a Joystick Monitor

Setup the observer JoystickMonitor and width of the joystick

@StateObject private var monitor = JoystickMonitor(width: 100)
private let draggableDiameter: CGFloat = 100

Option 1

Create the Joystick using the Joystick Builder

Joystick Builder applies the joystickGestureRecognizer

JoystickBuilder(
    monitor: self.joystickMonitor,
    width: self.draggableDiameter,
    shape: .rect,
    background: {
        // Example Background
        RoundedRectangle(cornerRadius: 8).fill(Color.red.opacity(0.5))
    },
    foreground: {
        // Example Thumb
        Circle().fill(Color.black)
    },
    locksInPlace: false)

Option 2

Create your own Joystick tracking View with the JoystickRecognizer

Apply the joystickGestureRecognizer to any of your views to receive updates on the monitor

YourView()
    .joystickGestureRecognizer(monitor: self.joystickMonitor, 
                               width: self.width, 
                               shape: self.controlShape,
                               locksInPlace: self.locksInPlace)

Parameters

parameter type description default
monitor JoyStickMonitor ObservableObect that publishes the Joystick control's XY and Polar coordinates no
width CGFloat The width or diameter of the Joystick control no
Output values will be from 0-width
shape JostickShape The shape of the Joystick's hitbox area, rectangluar or circular Valid input: .rect or .circle no
background some View Any View type input can be put here to create a background for the Joystick no
foreground some View A View for the thumb or foreground of the Joystick no
locksInPlace Bool A bool to determine if the Joystick resets back to the center when release no

๐Ÿ‘จโ€๐Ÿ’ป Contributions

All issue reports, feature requests, pull requests and GitHub stars are welcomed and much appreciated. I would enjoy fixing or adding anything you need!

To make a contribution, I would help you if you ask, or

  1. Fork this repo
  2. Make your changes and test
  3. Update readme as neded and add yourself to Authors section
  4. Make a Pull Request
  5. After merge update podspec version and project version appropriately (Major/Minor/Patch paradigm)
  6. Push changes
  7. Create new version tag to match podspec and project version
  8. Update pods repo, run this command in the package directory 'pod trunk push SwiftUIJoystick.podspec'

โœ๏ธ Authors

Created By: Michael Ellis - https://www.michaelrobertellis.com/

Inspired by Bradhowes Joystick for Swift, I had used this previously but I switched to pure SwiftUI

https://github.com/bradhowes/Joystick

A Big Thanks To Steven.Lin c941010623 - https://github.com/c941010623

๐Ÿ“ƒ License

SwiftUIJoystick is available under the MIT license. See the LICENSE file for more info

swiftuijoystick's People

Contributors

c941010623 avatar michael94ellis avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar

swiftuijoystick's Issues

Multi-touch interference

When I use the Demo,

I hold the left hand with my left hand and click on the rectangle with my right hand,

then the center point will stop.

summary:
If there is a click event in the rectangle while moving, the center point will stop.

Can't add Swift Package on GUI

We can search but we can't add.

Screen Shot 2022-09-25 at 15 35 09

It can be added by writing directly in the package file.

.package(url: "https://github.com/michael94ellis/SwiftUIJoystick", "1.5.0"..<"2.0.0")

Release tag is stopped on an older version.

Screen Shot 2022-09-25 at 15 41 19

Please add the newest release tag on your github :)

shape: .circle has BUG in SwiftUI and iOS 15

when use

JoystickBuilder(
                monitor: self.joystickMonitor,
                width: self.dragDiameter,
                shape: .circle,
                background: {
                    Circle().fill(Color.blue.opacity(0.9))
                        .frame(width: dragDiameter, height: dragDiameter)
                },
                foreground: {
                    Circle().fill(Color.black)
                        .frame(width: dragDiameter / 4, height: dragDiameter / 4)
                },
                locksInPlace: false)

then then location point is error

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.