Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/leonardocardoso/nfdownloadbutton

Revamped Download Button. It's kinda a reverse engineering of Netflix's app download button.
https://github.com/leonardocardoso/nfdownloadbutton

animation button download ios objective-c swift ui

Last synced: 1 day ago
JSON representation

Revamped Download Button. It's kinda a reverse engineering of Netflix's app download button.

Awesome Lists containing this project

README

        

## NFDownloadButton

| || | |
|:-:|:-:|:-:|:-:|
| ![iOS](Images/iOS.gif) | ![watchOS](Images/watchOS.gif) | ![tvOS](Images/tvOS.gif) | ![macOS](Images/macOS.gif) |

[![Platform](https://img.shields.io/badge/platform-iOS-orange.svg)](https://github.com/LeonardoCardoso/NFDownloadButton#requirements-and-details)
[![CocoaPods](https://img.shields.io/badge/pod-v0.0.6-red.svg)](https://github.com/LeonardoCardoso/NFDownloadButton#cocoapods)
[![Carthage Compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg)](https://github.com/LeonardoCardoso/NFDownloadButton#carthage)

> Revamped Download Button

- [Requirements](#requirements)
- [Installation](#installation)
- [Usage](#usage)
- [License](#license)

## Requirements

- iOS 8.0+
- Swift 4.2+
- Xcode 10.0+

## Installation

### CocoaPods

[CocoaPods](http://cocoapods.org) is a dependency manager for Cocoa projects. You can install it with the following command:

```bash
$ gem install cocoapods
```

> CocoaPods 1.1.0+ is required to build NFDownloadButton 0.0.6+.

To integrate NFDownloadButton into your Xcode project using CocoaPods, specify it in your `Podfile`:

```ruby
source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '8.0'
use_frameworks!

pod 'NFDownloadButton', '~> 0.0.6'
```

Then, run the following command:

```bash
$ pod install
```

### Carthage

[Carthage](https://github.com/Carthage/Carthage) is a decentralized dependency manager that automates the process of adding frameworks to your Cocoa application.

You can install Carthage with [Homebrew](http://brew.sh/) using the following command:

```bash
$ brew update
$ brew install carthage
```

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

```ogdl
github "LeonardoCardoso/NFDownloadButton" ~> 0.0.6
```

### Manually

If you prefer not to use either of the aforementioned dependency managers, you can integrate NFDownloadButton into your project manually.

## Usage

You can use a `NFDownloadButton` on [Storyboards](#storyboard) or, if you want to do it programatically, you can create it just like you create a UIButton:

```swift
let downloadButton = NFDownloadButton(frame: CGRect(x: 0, y: 0, width: 50, height: 50))
self.parentView.addSubview(downloadButton)
```

`NFDownloadButton` has four states:

| State 1: To Download | State 2: Will Download | State 3: Ready to Download | State 4: Downloaded |
|:-:|:-:|:-:|:-:|
| ![first](Images/first.gif) | ![second](Images/second.gif) | ![third](Images/third.gif) | ![fourth](Images/fourth.gif) |

You can switch between states by just doing as following:

```swift
self.downloadButton.downloadState = .toDownload || .willDownload || .readyToDownload || .downloaded
```

When the button is in `.readyToDownload` state, the button will wait for your to upload its progress. You can do it like this:

```swift
self.downloadButton.downloadPercent = 0.5
```
When this value reaches 1.0, then `downloadState` is automatically changed to `.downloaded`.

### Downloaded by default

You can select the button as downloaded by default. All states will be overridden by `Downloaded` state and no animation will be performed. To do so, just add `isDownloaded` in its constructor, or set it up whenever you want.

```swift
NFDownloadButton(frame: CGRect(x: 0, y: 0, width: 50, height: 50), isDownloaded: true)
```
```swift
downloadButton.isDownloaded = true
```

### Style

`NFDownloadButton` has four different styles of devices: `iOS`, `watchOS`, `tvOS`, `macOS`. Thus you can customize your final result. This option is only available on constructor.

```swift
NFDownloadButton(frame: CGRect(x: 0, y: 0, width: 50, height: 50), isDownloaded: true,
style: .iOS)
```
| iOS | watchOS | tvOS | macOS |
|:-:|:-:|:-:|:-:|
| ![iOS](Images/iOS.png) | ![watchOS](Images/watchOS.png) | ![tvOS](Images/tvOS.png) | ![macOS](Images/macOS.png) |

### Palette

You also can customize the colors of the button on its constructor.

```swift
NFDownloadButton(
frame: wrapView.frame,
isDownloaded: true,
style: .iOS,
palette: Palette(
initialColor: UIColor?,
rippleColor: UIColor?,
buttonBackgroundColor: UIColor?,
downloadColor: UIColor?,
deviceColor: UIColor?
)
)
```

![palette](Images/palette.png)

### Delegate

You can watch changes of state by implementing the protocol:

```swift
protocol NFDownloadButtonDelegate {

func stateChanged(button: NFDownloadButton, newState: NFDownloadButtonState)

}
```

### Storyboard

Last but not least, you can customize `NFDownloadButton` properties right from Interface Builder or Storyboards.

![storyboard](Images/storyboard.png)

## License

NFDownloadButton is released under the MIT license. See [LICENSE](https://github.com/LeonardoCardoso/NFDownloadButton/blob/master/LICENSE) for details.

### Follow me for the latest updates