Showcase your awesome new app features πŸ“±

Overview

WhatsNewKit Header Logo

Swift 5.0 CI Status Version Carthage Compatible
Platform Documentation Twitter


WhatsNewKit enables you to easily showcase your awesome new app features.
It's designed from the ground up to be fully customized to your needs.


Demo

Features

  • Customization and Configuration to your needs πŸ’ͺ
  • Predefined Themes and Animations 🎬
  • Easily check if your Features have already been presented 🎁
  • Awesome UI 😍

Example

The example Application is an excellent way to see WhatsNewKit in action. You get a brief look of the available configuration options and how they affect the look and feel of the WhatsNewViewController. Simply open the WhatsNewKit.xcodeproj and run the WhatsNewKit-Example scheme.

Example App

Installation

CocoaPods

WhatsNewKit is available through CocoaPods. To install it, simply add the following line to your Podfile:

pod 'WhatsNewKit'

Carthage

Carthage is a decentralized dependency manager that builds your dependencies and provides you with binary frameworks.

To integrate WhatsNewKit into your Xcode project using Carthage, specify it in your Cartfile:

github "SvenTiigi/WhatsNewKit"

Run carthage update --platform iOS to build the framework and drag the built WhatsNewKit.framework into your Xcode project.

On your application targets’ β€œBuild Phases” settings tab, click the β€œ+” icon and choose β€œNew Run Script Phase” and add the Framework path as mentioned in Carthage Getting started Step 4, 5 and 6

Swift Package Manager

To integrate using Apple's Swift Package Manager, add the following as a dependency to your Package.swift:

dependencies: [
    .package(url: "https://github.com/SvenTiigi/WhatsNewKit.git", from: "1.3.0")
]

Manually

If you prefer not to use any of the aforementioned dependency managers, you can integrate WhatsNewKit into your project manually. Simply drag the Sources Folder into your Xcode project.

Usage

The following first usage description shows the easiest way of presenting your new app features with WhatsNewKit.

πŸ‘¨β€πŸ’» Please see the Advanced section for further configuration options and features.

import WhatsNewKit

// Initialize WhatsNew
let whatsNew = WhatsNew(
    // The Title
    title: "WhatsNewKit",
    // The features you want to showcase
    items: [
        WhatsNew.Item(
            title: "Installation",
            subtitle: "You can install WhatsNewKit via CocoaPods or Carthage",
            image: UIImage(named: "installation")
        ),
        WhatsNew.Item(
            title: "Open Source",
            subtitle: "Contributions are very welcome πŸ‘¨β€πŸ’»",
            image: UIImage(named: "openSource")
        )
    ]
)

// Initialize WhatsNewViewController with WhatsNew
let whatsNewViewController = WhatsNewViewController(
    whatsNew: whatsNew
)

// Present it 🀩
self.present(whatsNewViewController, animated: true)

Additionally, you can make use of the WhatsNewVersionStore to show the WhatsNewViewController only once for each version of your app.

// Initialize WhatsNewVersionStore
let versionStore: WhatsNewVersionStore = KeyValueWhatsNewVersionStore()

// Passing a WhatsNewVersionStore to the initializer
// will give you an optional WhatsNewViewController
let whatsNewViewController: WhatsNewViewController? = WhatsNewViewController(
    whatsNew: whatsNew, 
    versionStore: versionStore
)

// Verify WhatsNewViewController is available
guard let viewController = whatsNewViewController else {
    // The user has already seen the WhatsNew-Screen for the current Version of your app
    return
}

// Present WhatsNewViewController
self.present(viewController, animated: true)

πŸ‘¨β€πŸ’» Head over to the WhatsNewVersionStore to learn more.

Advanced

As mentioned before WhatsNewKit can be fully customized to your needs. The Advanced section will explain all configuration possibilities and features of WhatsNewKit in detail. First off it's important to understand the components of the WhatsNewViewController in order to customize the behaviour and UI-Design.

UILayout

WhatsNewViewController.Configuration

The WhatsNewViewController.Configuration struct enables you to customize the WhatsNewViewController components to your needs. The configuration itself can be passed to the initializer of the WhatsNewViewController.

// Initialize default Configuration
var configuration = WhatsNewViewController.Configuration()

// Customize Configuration to your needs
configuration.backgroundColor = .white
configuration.titleView.titleColor = .orange
configuration.itemsView.titleFont = .systemFont(ofSize: 17)
configuration.detailButton?.titleColor = .orange
configuration.completionButton.backgroundColor = .orange
// And many more configuration properties...

// Initialize WhatsNewViewController with custom configuration
let whatsNewViewController = WhatsNewViewController(
    whatsNew: whatsNew, 
    configuration: configuration
)

Theme πŸŒ„

A Theme allows you to group the customization of a WhatsNewViewController.Configuration. WhatsNewKit implemented predefined Themes which are available as static properties both in white and dark mode. Or you create your very own Theme to configure it to your needs.

.darkRed .whiteRed

Theme Dark Red

Theme White Red

// Configuration with predefined Dark Red Theme
let darkRed = WhatsNewViewController.Configuration(
    theme: .darkRed
)

// Apply predefined White Red Theme to Configuration
var configuration = WhatsNewViewController.Configuration()
configuration.apply(theme: .whiteRed)

// Or create your own Theme and initialize a Configuration with your Theme
let myTheme = WhatsNewViewController.Theme { configuration in
    configuration.backgroundColor = .white
    configuration.titleView.titleColor = .orange
    configuration.itemsView.titleFont = .systemFont(ofSize: 17)
    configuration.detailButton?.titleColor = .orange
    configuration.completionButton.backgroundColor = .orange
    // ...
}

// Initialize a Configuration with your Theme
let configuration = WhatsNewViewController.Configuration(
    theme: myTheme
)

For a full overview of the available predefined Themes check out the Example-Application.

iOS 13 Dark-Mode

Use the .red Theme if you wish that a predefined Theme like .darkRed and .whiteRed automatically adapts to the current UserInterfaceStyle.

// Configuration with predefine `red` Theme which auto adapts to the UserInterfaceStyle
// in order to support iOS 13 Dark-Mode
let configuration = WhatsNewViewController.Configuration(
    theme: .red
)

Dark-Mode compatible Themes: .blue, .lightBlue, .orange, .purple, .red, .green

Layout πŸ“

WhatsNewKit comes with three predefined ItemsView.Layouts.

Left Centered Right
Default Layout Centered Layout Right Layout
// Left Layout
configuration.itemsView.layout = .left

// Centered Layout
configuration.itemsView.layout = .centered

// Right Layout
configuration.itemsView.layout = .right

☝️ In default the ItemsView layout is set to .left.

ContentMode πŸ“

Setting the ContentMode in the ItemsView Configuration will adjust for how your features are arranged along the axis.

Top Center Fill
ContentMode Top ContentMode Center ContentMode Fill
// ContentMode Top
configuration.itemsView.contentMode = .top

// ContentMode Center
configuration.itemsView.contentMode = .center

// ContentMode Fill
configuration.itemsView.contentMode = .fill

☝️ In default the ItemsView ContentMode is set to top.

Insets

Additionally, if you wish you can modify the layout insets of the WhatsNewViewController components.

// Set TitleView Insets (Default values)
configuration.titleView.insets = UIEdgeInsets(top: 50, left: 20, bottom: 15, right: 20)

// Increase the CompletionButton Bottom Inset 
configuration.completionButton.insets.bottom += 10

ImageSize

In order to define the size of your images for each of your feature you can set an ImageSize on the ItemsView configuration.

// Use the original image size as it is
configuration.itemsView.imageSize = .original

// Use the preferred image size which fits perfectly :)
configuration.itemsView.imageSize = .preferred

// Use a custom height for each image
configuration.itemsView.imageSize = .fixed(height: 25)

☝️ In default the ItemsView ImageSize is set to preferred.

Image Tint-Color

In default WhatsNewKit auto tints the images of each WhatsNew.Item in the given tint color of the configuration. If you wish to disable this functionality simply set autoTintImage to false

// Disable auto tinting images
configuration.itemsView.autoTintImage = false

☝️ In default the ItemsView AutoTintImage is set to true.

Animation 🎬

Animations

You can apply a Animation to all components of the WhatsNewViewController via predefined animation types. In default all Animation properties are nil indicating no animation should be perfomed.

// Set SlideUp Animation to TitleView
configuration.titleView.animation = .slideUp

// Set SlideRight Animation to ItemsView
configuration.itemsView.animation = .slideRight

// Set SlideLeft Animation to DetailButton
configuration.detailButton?.animation = .slideLeft

// Set SlideDown Animation to CompletionButton
configuration.completionButton.animation = .slideDown

If you wish to animate all views with the same type you can do so by simply applying it to the configuration.

// Global Animation-Type for all WhatsNewViewController components
configuration.apply(animation: .fade)

If you wish to define your custom animation, simply set the custom enum and pass an animator closure.

// Custom Animation for DetailButton
configuration.detailButton?.animation = .custom(animator: { (view: UIView, settings: AnimatorSettings) in
    // view: The View to perform animation on
    // settings: Preferred duration and delay
})

Title Mode

In default the TitleView is sticked to the top. If you wish that the TitleView scrolls with the ItemsView you can change the titleMode on the TitleView configuration.

// TitleView scrolls alongside with the ItemsView
configuration.titleView.titleMode = .scrolls

// TitleView is fixed to top
configuration.titleView.titleMode = .fixed

☝️ In default the titleMode is set to .fixed.

Secondary Title Color

By setting a SecondaryColor on the TitleView you can change the color of certain characters.

SecondaryColor

// Set secondary color on TitleView Configuration
configuration.titleView.secondaryColor = .init(
    // The start index
    startIndex: 0,
    // The length of characters
    length: 5,
    // The secondary color to apply 
    color: .whatsNewKitLightBlue
)

☝️ In default the secondaryColor is set to nil.

DetailButton

DetailButton

By setting an DetailButton struct on the WhatsNewViewController.Configuration struct you can customize the title and the corresponding action of the displayed detail button on the WhatsNewViewController. As the DetailButton struct is declared as optional the WhatsNewViewController will only display the button if a DetailButton configuration is available

Action Description
website When the user pressed the detail button a SFSafariViewController with the given URL will be presented
custom After the detail button has been pressed by the user, your custom action will be invoked
// Initialize DetailButton with title and open website at url
let detailButton = WhatsNewViewController.DetailButton(
    title: "Read more", 
    action: .website(url: "https://github.com/SvenTiigi/WhatsNewKit")
)

// Initialize DetailButton with title and custom action
let detailButton = WhatsNewViewController.DetailButton(
    title: "Read more", 
    action: .custom(action: { [weak self] whatsNewViewController in
        // Perform custom action on detail button pressed
    })
)

CompletionButton

CompletionButton

The CompletionButton struct configures the displayed title and the action when the user pressed the completion button on the WhatsNewViewController.

Action Description
dismiss When the user pressed the completion button, the WhatsNewViewController will be dismissed. This is the default value
custom After the completion button has been pressed by the user, your custom action will be invoked
// Initialize CompletionButton with title and dismiss action
let completionButton = WhatsNewViewController.CompletionButton(
    title: "Continue", 
    action: .dismiss
)

// Initialize CompletionButton with title and custom action
let completionButton = WhatsNewViewController.CompletionButton(
    title: "Continue", 
    action: .custom(action: { [weak self] whatsNewViewController in
        // Perform custom action on completion button pressed
    })
)

HapticFeedback πŸ“³

You can enable on both DetailButton and CompletionButton haptic feedback when the user pressed one of these buttons. Either by setting the property or passing it to the initializer.

// Impact Feedback
button.hapticFeedback = .impact(.medium)

// Selection Feedback
button.hapticFeedback = .selection

// Notification Feedback with type
let completionButton = WhatsNewViewController.CompletionButton(
    title: "Continue", 
    action: .dismiss,
    hapticFeedback: .notification(.success)
)

☝️ In default the HapticFeedback is nil indicating no haptic feedback should be executed.

iPad Adjustments

If you wish to modify the layout of the WhatsNewViewController when presenting it on an iPad you can set the padAdjustment closure.

Currently the padAdjustment closure will only look for changed insets property of the WhatsNewViewController.Configuration in order to update the layout. Therefore, changes to any other configuration property will have no effect.

// Set PadAdjustment closure
configuration.padAdjustment = { configuration in
     // Invoke default PadAdjustments (Adjusts Insets for iPad)
     WhatsNewViewController.Configuration.defaultPadAdjustment(&configuration)
     // Adjust TitleView top insets
     configuration.titleView.insets.top = 20
}

☝️ In default the WhatsNewViewController.Configuration.defaultPadAdjustment will be invoked.

WhatsNewVersionStore πŸ’Ύ

WhatsNewVersionStore

If we speak about presenting awesome new app features we have to take care that this kind of UI action only happens once if the user installed the app or opened it after an update. The WhatsNewKit offers a protocol oriented solution for this kind of problem via the WhatsNewVersionStore protocol.

/// WhatsNewVersionStore typealias protocol composition
public typealias WhatsNewVersionStore = WriteableWhatsNewVersionStore & ReadableWhatsNewVersionStore

/// The WriteableWhatsNewVersionStore
public protocol WriteableWhatsNewVersionStore {
    func set(version: WhatsNew.Version)
}

/// The ReadableWhatsNewVersionStore
public protocol ReadableWhatsNewVersionStore {
    func has(version: WhatsNew.Version) -> Bool
}

The WhatsNewViewController will use the APIs of the WhatsNewVersionStore in the following way.

API Description
has(version:) Checks if the Whatsnew.Version is available and will return nil during initialization.
set(version:) The WhatsNew.Version will be set after the CompletionButton has been pressed.

The WhatsNewVersionStore can be passed as an parameter to the initializer. If you do so the initializer will become optional.

// Initialize WhatsNewViewController with WhatsNewVersionStore
let whatsNewViewController: WhatsNewViewController? = WhatsNewViewController(
    whatsNew: whatsNew, 
    versionStore: myVersionStore
)

// Check if WhatsNewViewController is available to present it.
if let controller = whatsNewViewController {
    // Present it as WhatsNewViewController is available 
    // after init with WhatsNewVersionStore
    self.present(controller, animated: true)
} else {
    // WhatsNewViewController is `nil` this Version has already been presented
}

// Or invoke present on the WhatsNewViewController
// to avoid the need of unwrapping the optional
whatsNewViewController?.present(on: self)

☝️ Please keep in mind the WhatsNewViewController initializer will only become optional and checks if the Version has been already presented if you pass a WhatsNewVersionStore object.

Implementation

If you already handled saving user settings in your app to something like Realm, CoreData or UserDefaults you can conform that to the WhatsNewVersionStore.

// Extend your existing App-Logic
extension MyUserSettingsDatabase: WhatsNewVersionStore {
    // Implement me πŸ‘¨β€πŸ’»
}

Predefined Implementations

WhatsNewKit brings along two predefined Implementations of the WhatsNewVersionStore.

KeyValueWhatsNewVersionStore

The KeyValueWhatsNewVersionStore saves and retrieves the WhatsNew.Version via a KeyValueable protocol conform object. UserDefaults and NSUbiquitousKeyValueStore are already conform to that protocol πŸ™Œ

// Local KeyValueStore
let keyValueVersionStore = KeyValueWhatsNewVersionStore(
    keyValueable: UserDefaults.standard
)

// iCloud KeyValueStore
let keyValueVersionStore = KeyValueWhatsNewVersionStore(
    keyValueable: NSUbiquitousKeyValueStore.default
)

// Initialize WhatsNewViewController with KeyValueWhatsNewVersionStore
let whatsNewViewController: WhatsNewViewController? = WhatsNewViewController(
    whatsNew: whatsNew, 
    versionStore: keyValueVersionStore
)
InMemoryWhatsNewVersionStore

The InMemoryWhatsNewVersionStore saves and retrieves the WhatsNew.Version in memory. Perfect for development or testing phase πŸ‘¨β€πŸ’»

// Initialize WhatsNewViewController with InMemoryWhatsNewVersionStore
let whatsNewViewController: WhatsNewViewController? = WhatsNewViewController(
    whatsNew: whatsNew, 
    versionStore: InMemoryWhatsNewVersionStore()
)

WhatsNew.Version

During the initialization of the WhatsNew struct the WhatsNewKit will automatically retrieve the current App-Version via the CFBundleShortVersionString and construct a WhatsNew.Version for you which is used by the WhatsNewVersionStore protocol in order to persist the presented app versions. If you want to manually set the version you can do it like the following example.

// Initialize Version 1.0.0
let version = WhatsNew.Version(
    major: 1,
    minor: 0,
    patch: 0
)

// Use a String literal
let version: WhatsNew.Version = "1.0.0"

// Current Version in Bundle (Default)
let version = WhatsNew.Version.current()

After you initialize a WhatsNew.Version you can pass it to the initializer of a WhatsNew struct.

// Initialize WhatsNew with Title and Items
let whatsNew = WhatsNew(
    version: version,
    title: "WhatsNewKit",
    items: []
)

If you holding multiple WhatsNew structs in an array you can make use of the following two functions to retrieve a WhatsNew struct based on the WhatsNewVersion.

let whatsNews: [WhatsNew] = [...]

// Retrieve WhatsNew from array based on Version 1.0.0
let whatsNewVersion1 = whatsNews.get(byVersion:
    .init(major: 1, minor: 0, patch: 0)
)

// Or retrieve it via String as WhatsNew.Version is
// conform to the ExpressibleByStringLiteral protocol
let whatsNewVersion2 = whatsNews.get(byVersion: "2.0.0")

// If you want the WhatsNew for your current App-Version
// based on the CFBundleShortVersionString from Bundle.main
let currentWhatsNew = whatsNews.get()

Codable WhatsNew

The WhatsNew struct is conform the Codable protocol which allows you to initialize a WhatsNew struct via JSON.

{
    "version": {
        "major": 1,
        "minor": 0,
        "patch": 0
    },
    "title": "WhatsNewKit",
    "items": [
        {
            "title": "Open Source",
            "subtitle": "Contributions are very welcome πŸ‘¨β€πŸ’»",
            "image": "iVBORw0KGgoA..."
        }
    ]
}

The optional image property of the WhatsNew.Item will be decoded and encoded in Base64.

// Encode to JSON
let encoded = try? JSONEncoder().encode(whatsNew)

// Decode from JSON data
let decoded = try? JSONDecoder().decode(WhatsNew.self, from: data)

Featured on

Contributing

Contributions are very welcome πŸ™Œ πŸ€“

Credits

The WhatsNew.Item images (icons8-github, icons8-puzzle, icons8-approval, icons8-picture) which are seen on the screenshots and inside the example application are taken from icons8.com which are licensed under Creative Commons Attribution-NoDerivs 3.0 Unported.

License

WhatsNewKit
Copyright (c) 2020 Sven Tiigi <[email protected]>

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
Comments
  • Don't animate itemsView.

    Don't animate itemsView.

    Hi, I'm MJ.

    First, thank you for your open source.

    I'm using your open source WhatsNewKit. But, I met a problem.

    I want to animate views, but itemsview does not apply animation.

    Below my code. Thank you.

    import Foundation
    import WhatsNewKit
    
    class WhatsNewAppHandler {
      var whatsNewViewController: WhatsNewViewController?
    
      init() {
        let whatsNew = WhatsNew(
          title: "WhatsNewKit",
          items: [
            WhatsNew.Item(
              title: "Installation",
              subtitle: "You can install WhatsNewKit via CocoaPods or Carthage",
              image: UIImage(named: "IAPAds")
            ),
            WhatsNew.Item(
              title: "Open Source",
              subtitle: "Contributions are very welcome πŸ‘¨β€πŸ’»",
              image: UIImage(named: "IAPAds")
            ),
            WhatsNew.Item(
              title: "Installation",
              subtitle: "You can install WhatsNewKit via CocoaPods or Carthage",
              image: UIImage(named: "IAPAds")
            ),
            WhatsNew.Item(
              title: "Installation",
              subtitle: "You can install WhatsNewKit via CocoaPods or Carthage",
              image: UIImage(named: "IAPAds")
            )
          ]
        )
    
        var configuration = WhatsNewViewController.Configuration()
        configuration.completionButton.backgroundColor = Color.Blue
        configuration.apply(animation: .slideUp)
    
        whatsNewViewController = WhatsNewViewController(
          whatsNew: whatsNew,
          configuration: configuration
        )
      }
    
      func showsWhatsNewApp(presentViewController: UIViewController) {
    
        if let whatsNewViewController = self.whatsNewViewController {
          whatsNewViewController.modalTransitionStyle = .coverVertical
          whatsNewViewController.modalPresentationStyle = .overFullScreen
          presentViewController.present(whatsNewViewController, animated: true)
        }
      }
    }
    
    bug help wanted 
    opened by mjkoo711 12
  • Title is overpowering with phones in landscape mode

    Title is overpowering with phones in landscape mode

    WhatsNewKit Environment

    • WhatsNewKit version: 1.3.1
    • Xcode version: 11.3.1 (11C504)
    • Swift version: 5
    • macOS version running Xcode: 10.15.3 (19D76)
    • Dependency manager (SPM, Carthage, CocoaPods, Manually): Manual? I'm using the example project

    What did you do?

    • Built & Ran the example project
    • Rotated iPhone to landscape
    • Scrolled through the changelog

    What did you expect to happen?

    • I thought perhaps the title would pan with the content so it wasn't so obstructive. Kind of like how "large titles" for navigation controllers work

    What happened instead?

    • Title remained the same size and viewing the content was quite difficult.

    Perhaps this could be a general improvement to pan the title like how the "large titles" work in navigation controllers? I'm not sure if there was a reasoning behind making it static? I've attached a screenshot of the layout in landscape mode below

    image

    enhancement 
    opened by TimAEllis 7
  • How to fix Layout Error while using WhatsNewKit Library in Swift 5?

    How to fix Layout Error while using WhatsNewKit Library in Swift 5?

    opened by christophriepe 6
  • Prevent the WhatsNew Screen from appearing more than once

    Prevent the WhatsNew Screen from appearing more than once

    WhatsNewKit Environment

    • WhatsNewKit version: WhatsNewKit 2.0.2
    • Xcode version:13.3.1
    • Swift version: 5 with SwiftUI 3
    • macOS version running Xcode: macOS Monterey Version 12.3.1
    • Dependency manager (SPM, Manually): SPM

    What did you do?

    I added the WhatsNew package and used the code for automatic and the WhatsNew Screen appeared as expected.

    What did you expect to happen?

    I expected the screen to only present once, but when the app was restarted it appeared again.

    What happened instead?

    Every time the app is restarted the whatsnew screen appears.

    How do I get the whatsnew screen to appear only once, and not on subsequent restarts of the app until another new version of the app is released and the user updates the app from the App Store ? Thx

    help wanted 
    opened by DogandElk 5
  • WhatsNew.Text from NSAttributedString Availability Issue

    WhatsNew.Text from NSAttributedString Availability Issue

    WhatsNewKit Environment

    • WhatsNewKit version: 2.1
    • Xcode version: 13.2.1
    • Swift version: 5
    • macOS version running Xcode: 11.6.2
    • Dependency manager (SPM, Manually): SPM

    What did you do?

    Try to create an instance of WhatsNew.Text from a NSAttributedString with iOS deployment target 14.0:

    WhatsNew.Text(NSAttributedString())
    

    What did you expect to happen?

    No build error. NSAttributedString should be available on iOS 3.2+.

    What happened instead?

    '(init(_:)' is only available in iOS 15.0 or newer

    question 
    opened by iosdeveloper 5
  •  iPad Adjustments not work

    iPad Adjustments not work

    WhatsNewKit Environment

    • WhatsNewKit version: 1.3.7
    • Xcode version: 12.0.1
    • Swift version: 5.0
    • macOS version running Xcode: 10.15.7
    • Dependency manager (SPM, Carthage, CocoaPods, Manually): SPM

    What did you do?

    I've added this code for ipad adjustments:

    configuration.padAdjustment = { configuration in
    
                configuration.titleView.insets.top = 25.0
                configuration.detailButton = nil
    
                configuration.itemsView.insets.top = -20.0
                configuration.itemsView.insets.left = 5.0
                configuration.itemsView.insets.right = 7.0
                configuration.itemsView.insets.bottom = 5.0
    
                configuration.completionButton.insets.bottom = 17.0
    
                WhatsNewViewController.Configuration.defaultPadAdjustment(&configuration)
            }
    

    but it doesn't works. For example the detail button is still visible.

    bug 
    opened by furiosFast 5
  • Swipe gesture to dismiss doesn't work reliably

    Swipe gesture to dismiss doesn't work reliably

    WhatsNewKit Environment

    • WhatsNewKit version: 1.3.5
    • Xcode version: 11.6
    • Swift version: 5
    • macOS version running Xcode: 10.15.5
    • Dependency manager (SPM, Carthage, CocoaPods, Manually): SPM or standalone

    What did you do?

    Build and run WhatsNewKit-Example

    Tap "Present" button

    Put finger on the ItemsView and drag down

    What did you expect to happen?

    The WhatsNew panel should begin dismiss animation and follow the finger's movement

    What happened instead?

    The WhatsNew panel doesn't move at all 90% of the times. Sometimes it begins moving late after the gesture has moved a considerable amount of space. Rarely it begins immediately and follows the gesture.

    bug 
    opened by francosolerio 5
  • Colors do not respond to runtime changes to device Dark Mode setting

    Colors do not respond to runtime changes to device Dark Mode setting

    WhatsNewKit Environment

    • WhatsNewKit version: 1.3.1
    • Xcode version: 11.1
    • Swift version: 5
    • macOS version running Xcode: 10.15.1
    • Dependency manager (Carthage, CocoaPods, Manually): CocoaPods

    What did you do?

    β„Ή

    • Configured completion button background colour with my own custom UIColor instance supporting Dark Appearance
    • Change the device Dark appearance setting in Simulator via Settings & Xcode Environment Overrides

    What did you expect to happen?

    β„Ή Colours to update to the corresponding dark/light appearance shade

    What happened instead?

    β„Ή Completion button background colour remained in the colour it was initialised with.

    bug 
    opened by feodormak 5
  • Animations & iOS 13

    Animations & iOS 13

    WhatsNewKit Environment

    • WhatsNewKit version: 1.2.0
    • Xcode version: Version 11.0 (11A420a)
    • Swift version: 5
    • macOS version running Xcode: 10.14.6
    • Dependency manager (Carthage, CocoaPods, Manually): CocoaPods

    What did you do?

    In the iOS 13 beta, the animations in WhatsNewKit don't show (due to changes in 13 and how push screens are rendered)

    What did you expect to happen?

    using: self.present(whatsNewViewController, animated: true)

    in 12x - animations are fine in 13x - animations do not render

    using: self.navigationController?.pushViewController(whatsNewViewController, animated: true) in 13x - animations are fine, but "back" is displayed at top of whatsNewViewController

    bug 
    opened by jminutaglio 5
  • CompletionButton Height

    CompletionButton Height

    It would be nice to be able to set the height of the completion button. If the goal of this project was to be consistent with the welcome screens that were added to Apple's own apps then the completion button is way too tall.

    enhancement 
    opened by zboralski 5
  • Squished layout on iPad in multitasking

    Squished layout on iPad in multitasking

    WhatsNewKit Environment

    • iOS version: 14.0
    • WhatsNewKit version: 1.3.6
    • Xcode version: 12.0
    • Swift version: 5.0
    • macOS version running Xcode: 10.15.6
    • Dependency manager (SPM, Carthage, CocoaPods, Manually): SPM

    What did you do?

    Displaying the WhatsNew view with default layout values on iPad in multitasking

    What did you expect to happen?

    The layout should consider the trait collection

    What happened instead?

    The layout is being squished

    `private func showWhatsNew() { // Initialize WhatsNew let versionStore: WhatsNewVersionStore = KeyValueWhatsNewVersionStore()

        var configuration = WhatsNewViewController.Configuration(
            theme: .default
        )
        configuration.tintColor = UIColor(named: "someTintColor")!
        configuration.itemsView.imageSize = .preferred
        
        let whatsNew = WhatsNew(
            // The Title
            title: SSKLocalizedString("STR_WHATS_NEW"),
            // The features you want to showcase
            items: [
                WhatsNew.Item(
                    title: "XYZ",
                    subtitle: "Blah blah",
                    image: UIImage(systemName: "bolt.fill")
                ),
                ...,
                ...,
            ]
        )
    
        // Initialize WhatsNewViewController with WhatsNew
        if let whatsNewViewController = WhatsNewViewController(
            whatsNew: whatsNew,
            configuration: configuration,
            versionStore: versionStore) {
            self.present(whatsNewViewController, animated: true)
        }
    }`
    

    ipad-layout

    bug 
    opened by lvandal 4
  • [iPad] Default primary action does not dismiss the WhatsNewViewController

    [iPad] Default primary action does not dismiss the WhatsNewViewController

    WhatsNewKit Environment

    • WhatsNewKit version: 2.0.2 using UIKit
    • Xcode version: 13.3
    • Swift version: 5+
    • macOS version running Xcode: 12.4
    • Dependency manager (SPM, Manually): SPM

    What did you do?

    on iPad, the continue button (primary action) does not dismiss. Works fine on iPhone.

    What did you expect to happen?

    The WhatsNewVC should dismiss

    What happened instead?

    As a workaround, I used the 'onDismiss' completion to dismiss the controller

    bug 
    opened by john-work-ios 2
Releases(2.0.4)
  • 2.0.4(Dec 1, 2022)

    What's Changed

    • Group features in VoiceOver by @AndrewBennet in https://github.com/SvenTiigi/WhatsNewKit/pull/62
    • master branch has been renamed to main

    Full Changelog: https://github.com/SvenTiigi/WhatsNewKit/compare/2.0.3...2.0.4

    Source code(tar.gz)
    Source code(zip)
  • 2.0.3(Aug 30, 2022)

    What's Changed

    • Added image alignment by @DmitryBespalov in https://github.com/SvenTiigi/WhatsNewKit/pull/59

    New Contributors

    • @DmitryBespalov made their first contribution in https://github.com/SvenTiigi/WhatsNewKit/pull/59

    Full Changelog: https://github.com/SvenTiigi/WhatsNewKit/compare/2.0.2...2.0.3

    Source code(tar.gz)
    Source code(zip)
  • 2.0.2(Apr 26, 2022)

    What's Changed

    • Fix extension signatures by @phjs in https://github.com/SvenTiigi/WhatsNewKit/pull/55

    New Contributors

    • @phjs made their first contribution in https://github.com/SvenTiigi/WhatsNewKit/pull/55

    Full Changelog: https://github.com/SvenTiigi/WhatsNewKit/compare/2.0.1...2.0.2

    Source code(tar.gz)
    Source code(zip)
  • 2.0.1(Jan 9, 2022)

    What's Changed

    • Fix issue 52 – prevent vertical collapsing of text on iOS 14 by @AndrewBennet in https://github.com/SvenTiigi/WhatsNewKit/pull/53

    Full Changelog: https://github.com/SvenTiigi/WhatsNewKit/compare/2.0.0...2.0.1

    Source code(tar.gz)
    Source code(zip)
  • 2.0.0(Jan 6, 2022)

    WhatsNewKit Version 2.0.0

    WhatsNewKit Version 2.0.0 has been completely rewritten in SwiftUI. You can now easily present your new features in SwiftUI, UIKit and AppKit.

    import SwiftUI
    import WhatsNewKit
    
    struct ContentView: View {
       
       var body: some View {
           NavigationView {
               // ...
           }
           .whatsNewSheet()
       }
       
    }
    

    Breaking Changes

    The new version 2.0.0 of WhatsNewKit introduces major breaking changes. Please see the updated README.md to learn more about the new API.

    CocoaPods (Deprecated)

    This version drops the support for CocoaPods.

    The Swift Package Manager is now the preferred way of integrating WhatsNewKit to your project.

    dependencies: [
        .package(url: "https://github.com/SvenTiigi/WhatsNewKit.git", from: "2.0.0")
    ]
    

    Changelog

    Full Changelog: https://github.com/SvenTiigi/WhatsNewKit/compare/1.3.7...2.0.0

    Source code(tar.gz)
    Source code(zip)
  • 1.3.7(Oct 17, 2020)

  • 1.3.6(Sep 14, 2020)

  • 1.3.5(Jul 28, 2020)

    Bug fix

    Fixed a bug where the comparison of two WhatsNew.Version instances might ended up in a wrong result (PR https://github.com/SvenTiigi/WhatsNewKit/pull/43)

    Source code(tar.gz)
    Source code(zip)
  • 1.3.4(Jun 17, 2020)

    Bug fix

    • Fixed: Aspect ratio not preserved when using fixed imageSize (https://github.com/SvenTiigi/WhatsNewKit/issues/41) | PR from @AndrewBennet (https://github.com/SvenTiigi/WhatsNewKit/pull/42)
    Source code(tar.gz)
    Source code(zip)
  • 1.3.3(May 2, 2020)

    Bug fix

    Fixed a bug (https://github.com/SvenTiigi/WhatsNewKit/pull/40) which caused the following Xcode output when changing/updating the CompletionButton background color

    CGContextSetFillColorWithColor: invalid context 0x0. If you want to see the backtrace, please set CG_CONTEXT_SHOW_BACKTRACE environmental variable.
    CGContextGetCompositeOperation: invalid context 0x0. If you want to see the backtrace, please set CG_CONTEXT_SHOW_BACKTRACE environmental variable.
    CGContextSetCompositeOperation: invalid context 0x0. If you want to see the backtrace, please set CG_CONTEXT_SHOW_BACKTRACE environmental variable.
    CGContextFillRects: invalid context 0x0. If you want to see the backtrace, please set CG_CONTEXT_SHOW_BACKTRACE environmental variable.
    CGContextSetCompositeOperation: invalid context 0x0. If you want to see the backtrace, please set CG_CONTEXT_SHOW_BACKTRACE environmental variable.
    
    Source code(tar.gz)
    Source code(zip)
  • 1.3.2(Apr 11, 2020)

    Title Mode | PR from @Fudge0952 (https://github.com/SvenTiigi/WhatsNewKit/pull/38)

    In default the TitleView is sticked to the top. If you wish that the TitleView scrolls with the ItemsView you can change the titleMode on the TitleView configuration.

    // TitleView scrolls alongside with the ItemsView
    configuration.titleView.titleMode = .scrolls
    
    // TitleView is fixed to top
    configuration.titleView.titleMode = .fixed
    

    ☝️ In default the titleMode is set to .fixed.

    Hide Status-Bar (https://github.com/SvenTiigi/WhatsNewKit/issues/35)

    This version adds the option to hide the status bar.

    // Hide Status-Bar
    configuration.prefersStatusBarHidden =  true
    

    ☝️ In default prefersStatusBarHidden is set to false.

    Source code(tar.gz)
    Source code(zip)
  • 1.3.1(Nov 2, 2019)

    Dark-Mode Theme Support

    Added support for Dark-Mode when using a predefined Theme (https://github.com/SvenTiigi/WhatsNewKit/issues/29, https://github.com/SvenTiigi/WhatsNewKit/pull/30)

    Use the .red Theme if you wish that a predefined Theme like .darkRed and .whiteRed automatically adapts to the current UserInterfaceStyle.

    // Configuration with predefine `red` Theme which auto adapts to the UserInterfaceStyle
    // in order to support iOS 13 Dark-Mode
    let configuration = WhatsNewViewController.Configuration(
        theme: .red
    )
    

    Right Layout

    Added right layout (https://github.com/SvenTiigi/WhatsNewKit/pull/28)

    WhatsNewKit comes with three predefined ItemsView.Layouts.

    | Left | Centered | Right | | ------------- | ------------- | ------------- | | Default Layout | Centered Layout | Right Layout |

    // Left Layout
    configuration.itemsView.layout = .left
    
    // Centered Layout
    configuration.itemsView.layout = .centered
    
    // Right Layout
    configuration.itemsView.layout = .right
    

    ☝️ In default the ItemsView layout is set to .left.

    Source code(tar.gz)
    Source code(zip)
  • 1.3.0(Sep 19, 2019)

    iOS 13 Support

    • Layout improvements to match iOS 13 style (https://github.com/SvenTiigi/WhatsNewKit/issues/25).
    • Fixed a problem under iOS 13 where animations are not triggered when presented modally (https://github.com/SvenTiigi/WhatsNewKit/issues/26).
    • Fixed a bug under iOS 13 where contentMode was no correctly displayed (https://github.com/SvenTiigi/WhatsNewKit/issues/24).
    • WhatsNew.Version now gets stored even if the WhatsNewViewController modal presentation is cancelled via a slide down under iOS13
    Source code(tar.gz)
    Source code(zip)
  • 1.2.0(Jul 2, 2019)

  • 1.1.9(Apr 24, 2019)

    ItemsView animation bug fix

    Fixed a bug where the ItemsView has not been correctly animated (https://github.com/SvenTiigi/WhatsNewKit/issues/20)

    Source code(tar.gz)
    Source code(zip)
  • 1.1.8(Apr 2, 2019)

  • 1.1.7(Feb 11, 2019)

    iOS 9 Minimum Deployment Target

    The minimum deployment target has been lowered from iOS 10.0 to iOS 9.0

    ContentMode

    Setting the ContentMode in the ItemsView Configuration will adjust for how your features are arranged along the axis.

    | Top | Center | Fill | | ------------- | ------------- | ------------- | | ContentMode Top | ContentMode Center | ContentMode Fill

    // ContentMode Top
    configuration.itemsView.contentMode = .top
    
    // ContentMode Center
    configuration.itemsView.contentMode = .center
    
    // ContentMode Fill
    configuration.itemsView.contentMode = .fill
    

    ☝️ In default the ItemsView ContentMode is set to top.

    Source code(tar.gz)
    Source code(zip)
  • 1.1.6(Feb 2, 2019)

    Layout Insets

    If you wish you can modify the layout insets of the WhatsNewViewController components.

    // Set TitleView Insets (Default values)
    configuration.titleView.insets = UIEdgeInsets(top: 50, left: 20, bottom: 15, right: 20)
    
    // Increase the CompletionButton Bottom Inset 
    configuration.completionButton.insets.bottom += 10
    

    iPad Adjustments

    If you wish to modify the WhatsNewViewController.Configuration when presenting it on an iPad you can set the padAdjustment closure.

    // Set PadAdjustment closure
    configuration.padAdjustment = { configuration in
         // Adjust TitleView FontSize
         configuration.titleView.titleFont = .systemFont(ofSize: 45, weight: .bold)
         // Invoke default PadAdjustments (Adjusts Insets for iPad)
         WhatsNewViewController.Configuration.defaultPadAdjustment(&configuration)
    }
    

    ☝️ In default the WhatsNewViewController.Configuration.defaultPadAdjustment will be invoked.

    Source code(tar.gz)
    Source code(zip)
  • 1.1.5(Dec 14, 2018)

    Bug Fix

    This release fixes a bug which cause a problem when saving or retrieving the presented Version via a WhatsNewVersionStore (Issue https://github.com/SvenTiigi/WhatsNewKit/issues/14)

    Source code(tar.gz)
    Source code(zip)
  • 1.1.4(Dec 14, 2018)

    ImageSize

    In order to define the size of your images for each of your feature you can set an ImageSize on the ItemsView configuration.

    // Use the original image size as it is
    configuration.itemsView.imageSize = .original
    
    // Use the preferred image size which fits perfectly :)
    configuration.itemsView.imageSize = .preferred
    
    // Use a custom height for each image
    configuration.itemsView.imageSize = .fixed(height: 25)
    

    ☝️ By default the ItemsView ImageSize is set to preferred.

    Secondary Title Color

    By setting a SecondaryColor on the TitleView you can change the color of certain characters.

    SecondaryColor
    // Set secondary color on TitleView Configuration
    configuration.titleView.secondaryColor = .init(
        // The start index
        startIndex: 0,
        // The length of characters
        length: 5,
        // The secondary color to apply 
        color: .whatsNewKitLightBlue
    )
    

    ☝️ By default the secondaryColor is set to nil.

    Apply TextColor

    From now on you can apply a text color globally on a configuration instead of change the TitleView and ItemsView text color manually.

    // Before:
    configuration.titleView.titleColor = .black
    configuration.itemsView.titleColor = .black
    configuration.itemsView.subtitleColor = .black
    
    // Now:
    configuration.apply(textColor: .black)
    
    Source code(tar.gz)
    Source code(zip)
  • 1.1.3(Oct 20, 2018)

    Layout

    In this Version WhatsNewKit has the ability to change the layout from default to centered (https://github.com/SvenTiigi/WhatsNewKit/issues/6).

    | Default | Centered | | ------------- | ------------- | | | | | The default layout shows an image on the left side and the text on the right side. | The centered layout aligns the image as well as the text in center. |

    /// Default Layout
    configuration.itemsView.layout = .default
    
    // Centered Layout
    configuration.itemsView.layout = .centered
    

    ☝️ By default the ItemsView layout is set to default.

    New Example Application

    The WhatsNewKit Example Application has been completely refactored and comes with a beautiful new UI.

    Source code(tar.gz)
    Source code(zip)
  • 1.1.2(Sep 18, 2018)

    Swift 4.2 compatibility

    Added Xcode 10 and Swift 4.2 compatibility

    KeyValueWhatsNewVersionStore Default Argument

    The KeyValueable initializer parameter of the KeyValueWhatsNewVersionStore is now set with UserDefaults.standard

    LightBlue Theme

    A light blue theme like in the Apple Stocks App is now available.

    let whiteLightBlueConfiguration = WhatsNewViewController.Configuration(theme: .whiteLightBlue)
    let darkLightBlueConfiguration = WhatsNewViewController.Configuration(theme: .darkLightBlue)
    
    Source code(tar.gz)
    Source code(zip)
  • 1.1.1(Jun 11, 2018)

    HapticFeedback

    From now on you can specify the UIImpactFeedbackStyle when using HapticFeedback.impact

    button.hapticFeedback = .impact(.light)
    button.hapticFeedback = .impact(.medium)
    button.hapticFeedback = .impact(.heavy)
    

    Fixed KeyValueWhatsNewVersionStore issue

    Fixed an issue when using KeyValueWhatsNewVersionStore with UserDefaults or NSUbiquitousKeyValueStore.

    Source code(tar.gz)
    Source code(zip)
  • 1.1.0(Jun 7, 2018)

    Merged Configuration and Theme

    Version 1.1.0 simplifies the customization by merging the Theme properties in the corresponding configuration properties.

    // Initialize default Configuration
    var configuration = WhatsNewViewController.Configuration()
    
    // Customize Configuration to your needs
    configuration.backgroundColor = .white
    configuration.titleView.titleColor = .orange
    configuration.itemsView.titleFont = .systemFont(ofSize: 17)
    configuration.detailButton.titleColor = .orange
    configuration.completionButton.backgroundColor = .orange
    // And many more configuration properties...
    

    The predefined Themes can also be applied globally to the Configuration

    // Configuration with predefined Dark Red Theme
    let darkRed = WhatsNewViewController.Configuration(
        theme: .darkRed
    )
    
    // Apply predefined White Red Theme to Configuration
    var configuration = WhatsNewViewController.Configuration()
    configuration.apply(theme: .whiteRed)
    
    // Or create your own Theme and initialize a Configuration with your Theme
    let myTheme = WhatsNewViewController.Theme { configuration in
        // Apply customizations ...
    }
    let configuration = WhatsNewViewController.Configuration(
        theme: myTheme
    )
    

    Animation on all Components

    In this release you can now apply an Animation to all components of the WhatsNewViewController.

    // Set SlideUp Animation to TitleView
    configuration.titleView.animation = .slideUp
    
    // Set SlideRight Animation to ItemsView
    configuration.itemsView.animation = .slideRight
    
    // Set SlideLeft Animation to DetailButton
    configuration.detailButton.animation = .slideLeft
    
    // Set SlideDown Animation to CompletionButton
    configuration.completionButton.animation = .slideDown
    

    If you wish to animate all views with the same type you can do so by simply applying it to the configuration.

    // Global Animation-Type for all WhatsNewViewController components
    configuration.apply(animation: .fade)
    

    If you wish to define your custom animation, simply set the custom enum and pass an animator closure.

    // Custom Animation for DetailButton
    configuration.detailButton.animation = .custom(animator: { [weak self] (view: UIView, settings: AnimatorSettings) in
        // view: The View to perform animation on
        // settings: Preferred duration and delay
    })
    
    Source code(tar.gz)
    Source code(zip)
  • 1.0.2(Jun 2, 2018)

    HapticFeedback

    You can enable on both DetailButton and CompletionButton haptic feedback when the user pressed one of these buttons. Either by setting the property or passing it to the initializer.

    // Impact Feedback
    button.hapticFeedback = .impact
    
    // Selection Feedback
    button.hapticFeedback = .selection
    
    // Notification Feedback with type
    let completionButton = WhatsNewViewController.CompletionButton(
        title: "Continue", 
        action: .dismiss,
        hapticFeedback: .notification(.success)
    )
    

    ☝️ In default the HapticFeedback is nil indicating no haptic feedback should be executed.

    Source code(tar.gz)
    Source code(zip)
  • 1.0.1(May 27, 2018)

    KeyValueWhatsNewVersionStore

    This release removed the predefined implementation UserDefaultsWhatsNewVersionStore of WhatsNewVersionStore and introduces a KeyValueWhatsNewVersionStore. You can initialize a KeyValueWhatsNewVersionStore by passing a KeyValueable conform object. WhatsNewKit implemented the KeyValueable protocol already for UserDefaults and NSUbiquitousKeyValueStore.

    // Local KeyValueStore
    let keyValueVersionStore = KeyValueWhatsNewVersionStore(
        keyValueable: UserDefaults.standard
    )
    
    // iCloud KeyValueStore
    let keyValueVersionStore = KeyValueWhatsNewVersionStore(
        keyValueable: NSUbiquitousKeyValueStore.default
    )
    
    // Initialize WhatsNewViewController with KeyValueWhatsNewVersionStore
    let whatsNewViewController: WhatsNewViewController? = WhatsNewViewController(
        whatsNew: whatsNew, 
        versionStore: keyValueVersionStore
    )
    

    Theme and Configuration structure

    The WhatsNewViewController.Theme and WhatsNewViewController.Configuration structure has been improved via one level nesting instead of two and three level extension nesting which causes problems during a pod lib lint (Swift Bug: SR-631)

    Source code(tar.gz)
    Source code(zip)
  • 1.0.0(May 26, 2018)

Owner
Sven Tiigi
iOS Engineer @opwoco
Sven Tiigi
Awesome tool for create tutorial walkthrough or coach tour

AwesomeSpotlightView is a nice and simple library for iOS written on Swift 5. It's highly customizable and easy-to-use tool. Works perfectly for tutor

Alexander Shoshiashvili 309 Jan 5, 2023
SuggestionsKit is a framework for iOS that was created in order to provide developers with the opportunity to educate users on various features of applications.

SuggestionsKit is a framework for iOS that was created in order to provide developers with the opportunity to educate users

Ilya 63 Nov 30, 2022
A simple and attractive AlertView to onboard your users in your amazing world.

AlertOnboarding A simple and attractive AlertView to onboard your users in your amazing world. PRESENTATION This AlertOnboarding was inspired by this

Boisney Philippe 832 Jan 8, 2023
BWWalkthrough is a simple library that helps you build custom walkthroughs for your iOS App

What is BWWalkthrough? BWWalkthrough (BWWT) is a class that helps you create Walkthroughs for your iOS Apps. It differs from other similar classes in

Yari @bitwaker 2.8k Jan 4, 2023
OnboardKit - Customizable user onboarding for your UIKit app in Swift

OnboardKit Customizable user onboarding for your UIKit app in Swift Requirements Swift 5.0 Xcode 10 iOS 11.0+ Installation Carthage github "NikolaKire

Nikola Kirev 470 Dec 23, 2022
SwiftyWalkthrough is a library for creating great walkthrough experiences in your apps, written in Swift.

SwiftyWalkthrough is a library for creating great walkthrough experiences in your apps, written in Swift. You can use the library to allow users to navigate and explore your app, step by step, in a predefined way controlled by you.

Rui Costa 370 Nov 24, 2022
ColorMix-by-IUKit - colorMix app by Intro to app development in Swift

colorMix-by-IUKit colorMix app by "Intro to app development in Swift" In this ap

null 0 Feb 11, 2022
A super-charged version of MYIntroductionView for building custom app introductions and tutorials.

MYBlurIntroductionView #####NOTICE: As of February 4th, Apple has begun to ban new app submissions using the common blurring method (UIToolbar hack) f

Matthew York 1.5k Dec 23, 2022
A nice tutorial like the one introduced in the Path 3.X App

ICETutorial Welcome to ICETutorial. This small project is an implementation of the newly tutorial introduced by the Path 3.X app. Very simple and effi

Icepat 798 Jun 30, 2022
A simple keyframe-based animation framework for UIKit. Perfect for scrolling app intros.

Jazz Hands is a simple keyframe-based animation framework for UIKit. Animations can be controlled via gestures, scroll views, KVO, or ReactiveCocoa. J

IFTTT 6.4k Dec 28, 2022
A simple keyframe-based animation framework for iOS, written in Swift. Perfect for scrolling app intros.

RazzleDazzle is a simple AutoLayout-friendly keyframe animation framework for iOS, written in Swift. Perfect for scrolling app intros. RazzleDazzle gr

IFTTT 3.4k Jan 1, 2023
Show overlay and info on app components

SwiftyOverlay App Intro / Instruction component to show data over app UI at run time! Easy to use, Animated and Customizable. Supported Components are

Saeid 80 Aug 29, 2022
Showcase your awesome new app features πŸ“±

WhatsNewKit enables you to easily showcase your awesome new app features. It's designed from the ground up to be fully customized to your needs. Featu

Sven Tiigi 2.8k Jan 3, 2023
Showcase new features after an app update similar to Pages, Numbers and Keynote.

WhatsNew Description WhatsNew automatically displays a short description of the new features when users update your app. This is similar to what happe

Patrick Balestra 1.5k Jan 4, 2023
Discover new programming concepts and more new SwiftUI 2 features in this section

Africa-Zoo One thing is sure, we will discover new programming concepts and more new SwiftUI 2 features in this section. TOPICS ARE COVERED: JSON with

Noye Samuel 2 Nov 8, 2022
ActionCable is a new WebSockets server being released with Rails 5 which makes it easy to add real-time features to your app

ActionCable is a new WebSockets server being released with Rails 5 which makes it easy to add real-time features to your app. This S

Daniel Rhodes 160 Mar 13, 2022
A platform to showcase your side projects/apps

A platform to discuss/showcase your side projects What is this? Inspired by this twitter thread Indie Apps Showcases is a platform for indie app devel

An Tran 25 Dec 27, 2022
Create an easy to peek SwiftUI View to showcase your own data, catalog, images, or anything you'd like.

Create an easy to peek SwiftUI View to showcase your own data, catalog, images, or anything you'd like.

Peter Larson 17 Jun 27, 2022
✨ An elegant way to guide your beloved users in iOS apps - Material Showcase.

Material Showcase for iOS An elegant and beautiful tap showcase view for iOS apps based on Material Design Guidelines. Requirement iOS 10.0+ Swift 4.2

Aromajoin 349 Dec 5, 2022
Resume-app - A simple iOS app to showcase Swift development skills using Xcode

resume-app A simple iOS app to showcase Swift development skills using Xcode. Pr

AJ Rivera 0 Jan 12, 2022