Git Product home page Git Product logo

showtime's Introduction

It's ShowTime! 🎥

ShowTime is the simplest and best way to display all your taps and gestures on screen. Perfect for that demo, presentation or video!

All you need to add that extra polish your demos is to add the Swift package dependency to your app target, you don't even need to import ShowTime if you don't want to change any of the options!

ShowTime can be configured to show the actual number of taps performed. Apple Pencil events are ignored by default but this can be configured.

ShowTime works as soon as your app runs, with no setup required, but is also highly configurable if you don't like the defaults.

ShowTime works with single- and multi-window setups out-the-box, without the need to subclass or set a UIWindow.

Check out How it works.

It takes less than a minute to install ShowTime, consider using it when you're sharing or recording your screen through QuickTime or AirPlay to help give your viewers extra context.

By default, the size of the visual touches are 44pt; this mirrors Apple's guidelines for minimum hit size for buttons on iOS. You're free to change this, of course!

Showing your gestures during demos gives your audience a much clearer context on what's happening on your device. Try ShowTime for your next demo, it's super easy to set up!

ADDED BONUS: Adding ShowTime to your app in debug mode will show taps and gestures in your XCUI automation tests while the tests run!

ShowTime

Installation

Swift Package Manager

  • Step 1: In Xcode 11+, add https://github.com/KaneCheshire/ShowTime.git to the list of Swift Package dependencies, see here for more information.
  • Step 2: There is no step 2, ShowTime works as soon as you launch your app, but you can configure it if you wish!

Cocoapods

NOTE: I won't be supporting Cocoapods for future updates, but for for now the podspec will remain in the repo with the last released version for Cocoapods. You can always install the latest ShowTime.swift manually if you want newer updates but can't use Swift Package Manager yet.

  • Step 1: Add pod 'ShowTime' to your Podfile and run pod update in Terminal.
  • Step 2: There is no step 2, ShowTime works as soon as you launch your app, but you can configure it if you wish!

Manual

  • Step 1: Drop ShowTime.swift into your project or copy the contents of it where ever you like.

Usage

ShowTime works out of the box (you don't even need to import ShowTime in any file), but you can customise it to turn it on or off, change the colour of the taps, plus lots more options.

There's lots of options to play with which helps ShowTime work with your app's character and theme during demos.

Here's a list of options:

// Defines when and if ShowTime is enabled.
//
// Possible values are:
// - .always
// - .never
// - .debugOnly
//
// `.always` by default,
ShowTime.enabled: ShowTime.Enabled


// The fill (background) color of a visual touch.
// When set to `.auto`, ShowTime automatically uses the stroke color with a 50% alpha.
// This makes it super quick to change ShowTime to fit in better with your brand.
// `.auto` by default.
ShowTime.fillColor: UIColor

// The colour of the stroke (outline) of a visual touch.
// "Twitter blue" by default.
ShowTime.strokeColor: UIColor

// The width (thickness) of the stroke around a visual touch.
// 3pt by default.
ShowTime.strokeWidth: CGFloat

// The size of a visual touch.
// 44x44pt by default.
ShowTime.size: CGSize

// The style of animation  to use when a visual touch disappears.
//
// Possible values are:
// - .standard (Slightly scaled down and faded out)
// - .scaleDown (Completely scaled down with no fade)
// - .scaleUp (Scaled up and faded out)
// - .custom (Provide your own custom animation block)
//
// `.standard` by default.
ShowTime.disappearAnimation: ShowTime.Animation

// The delay, in seconds, before the visual touch disappears after a touch ends.
// `0.2` by default.
ShowTime.disappearDelay: TimeInterval

// Whether visual touches should indicate a multiple tap (i.e. show a number 2 for a double tap).
// `false` by default.
ShowTime.shouldShowMultipleTapCount: Bool

// The colour of the text to use when showing multiple tap counts.
// `.black` by default.
ShowTime.multipleTapCountTextColor: UIColor

// The font of the text to use when showing multiple tap counts.
// `.systemFont(ofSize: 17, weight: .bold)` by default.
ShowTime.multipleTapCountTextFont: UIFont

// Whether visual touches should visually show how much force is applied.
// `true` by default (show off that amazing tech!).
ShowTime.shouldShowForce: Bool

// Whether touch events from Apple Pencil are ignored.
// `true` by default.
ShowTime.shouldIgnoreApplePencilEvents: Bool

How it works

ShowTime is a one-size-fits-all solution to showing your taps and gestures while showing off your hard work in demos and videos. ShowTime works with both conventional single-window apps, as well as multi-window apps.

To achieve this, ShowTime uses method swizzling. Method swizzling is only possible with the Objective-C runtime, so will only work with Swift types that inherit from NSObject. That's okay, because UIWindow does inherit from NSObject, so ShowTime can swizzle the sendEvent(_:) method.

Swizzling is just a friendly term used for swapping out the default implementation of a method and replacing it with your own (which calls the default implementation, a bit like calling a super implementation of a class), so that you have more control over what happens with that method without having to subclass. The benefit – but also danger – of this is that all objects instantiated will use the new implementation, so swizzling should be used wisely and sparingly, especially in production code.

ShowTime swizzles the sendEvent(_:) method on UIWindow, intercepts the event and then lets UIWindow carry on with sending the event. By intercepting that event and extracting the UITouches out of it, ShowTime displays those touches visually on whatever window is receiving sendEvent(_:).

Useful info

Why don't I need to import ShowTime to get it to work?

ShowTime automagically swizzles functions which doesn't require the framework to be imported with import ShowTime, it just requires installing the code somewhere in a target (via Swift Package Manager, Cocoapods, or manually copying the code). The only time you'll need to import the framework is if you want to play around with the configuration. If you're wondering how the swizzling happens automatically, ShowTime overrides UIWindow's layer property and performs the initial swizzling setup there. So the first time a UIWindow's layer property is accessed, the swizzle happens automatically.

Can I use this in production?

Yes, I've never seen any weird crashes but it's never been stress tested, so to do so is at your own risk.

Why would I want to show the number of multiple taps?

People watching a demo of your app don't know exactly what your fingers are doing, especially if it's a screen recording or over Zoom, so showing how many times you've tapped on a specific part of the screen really helps people understand the gestures you're carrying out.

Double tapping makes sense if you're watching someone's hands, but often this can be easily missed if you're watching it on a screen. Showing the number of multiple taps by setting ShowTime.shouldShowMultipleTapCount to true shows a number inside the tap itself, clearly demonstrating to your audience that you just tapped twice (or more) in succession in the same place.

Why don't Apple Pencil events show by default?

I'm guessing that most of the time, if you're demoing using an Apple Pencil then you're demoing drawing or something similar, so you wouldn't want a touch to display at that location. You can easily disable this behaviour if you need touch events to show for Apple Pencil interactions.

Can I have a different colour tap per-screen rather than per-app?

This is possible, you'd just need to set the colour in viewDidLoad or viewDidAppear(_:) in the screens you want to change the colour of the taps on. It adds a small layer of complexity, but certainly possible.

Author

Kane Cheshire, @KaneCheshire

License

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

showtime's People

Contributors

artemisia-absynthium avatar atrinh0 avatar azatz avatar kanecheshire avatar maxxfrazer avatar trellick 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  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  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  avatar  avatar  avatar  avatar  avatar  avatar

showtime's Issues

Show taps in a SFSafariViewController

Hi, how can I visualize taps in a SFSafariViewController that is presented programmatically from another view controller? Will I have to use WKWebView instead?

Swift Compiler Error: Type 'UIFontWeight' (aka 'CGFloat') has no member 'bold'

This is compiling for iOS 9.0 as target, on Xcode 9.2. In a React Native (0.53) project. I installed manually by dropping ShowTime.swift into my project.

Type 'UIFontWeight' (aka 'CGFloat') has no member 'bold'

screenshot 2018-03-21 12 22 59

Solution: https://stackoverflow.com/questions/31771679/uifont-how-to-get-system-thin-font

I can compile by changing the line to end with weight: UIFontWeightBold. I don't do Swift development so I'm not going to say whether this is a correct fix for PR.

Objectvie-c

Hello, how can i use this framework in my objective-c project ? if possible

`Method Swizzling` on .never

Hello,
This is more of an observation from our team than a bug but

  public static var enabled: ShowTime.Enabled = .never {
    didSet {
      UIWindow.swizzle()
    }
  }

essentially swizzles an event irrespective of .enabled value even if its never. Shouldn't UIWindow.swizzle() only on .debugOnly and .always?

iOS 13.4 support

Hi! Could you fix some warnings to support latest iOS 13.4? Thanks

Disabled ShowTime should not slow down the app

I use ShowTime in one app and i really like the visual user interactions. It is very helpful for demoing features and reporting bugs via screen recordings.

The app detects if it runs on an internal test device or not (by looking for an installed other non public app which enables test mode even on release builds) and uses for non-test devices
ShowTime.enabled = EnabledNever
and i expected it would then use close to zero CPU time in this case.

I run into performance issues with the app and analysed it with Instruments. I found ShowTime using more than 24% of all the app's CPU time even when disabled:

284.00 ms 24.2% @objc UIWindow.swizzled_sendEvent(_:) ShowTime
283.00 ms 24.1% UlWindow.swizzled sendEvent(:) ShowTime

image

Can i fix this by myself?

Crash on iOS 16.1

I've seen this crash on my device since iOS 16.1. I can trigger the issue by deleting a row in a List backed by CoreData in SwiftUI.

Screenshot 2022-09-17 at 12 48 39

Feature Request: Automatic mode

It would be awesome if there was a mode that automatically enabled ShowTime if there was an external screen connected or a screen recording started. It seems like you could do this via observing the following Notifications:

UIScreen.didConnectNotification
UIScreen.capturedDidChangeNotification

extension UIWindow and use swizzling

Thanks for you work, but i see some problems in youre solutions.

private class func swizzle() { // `initialize()` removed in Swift 4

It's bad practice to make extension UIWindow and use swizzling to intercept methods. You can potentially create serious problems for your application even though ShowTime can be turned off. ShowTime.enabled = never will ignored with youre code.

Also always is not good for default value, beacuse turn on should be explicit action.

@objc public static var enabled: Enabled = .always

Where do I change the settings?

Thanks for this great tool @KaneCheshire !

I am working on a react native project and pulled in ShowTime using CocoaPods.
I would like to disable ShowTime by default and only enable it for recording videos.
What I don't understand is: where do I change the settings/where does the config file (?) go?
Maybe, I am the only one, but maybe it makes sense to add this info to the readme.

Sorry for the n00b question!

Thank you!
Cheers
Tim

"Reference to class property 'enabled' is not concurrency-safe because it involves shared mutable state" with Strict Concurrency Checking = Complete

Hello,

I tried enabling Complete Strict Concurrency Checking in Xcode 14.1 (in the Build Settings of my target) and a warning appeared on the line where I was setting ShowTime.enabled.

In particular my code is:

AppDelegate.swift

func applicationDidBecomeActive(_ application: UIApplication) {
    ShowTime.enabled = ...
    ...
}

Please find a minimal sample project attached, it's entirely SwiftUI so no AppDelegate but the behavior is the same.
ShowTimeTest.zip

Thank you.

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.