• Stars
    star
    238
  • Rank 169,306 (Top 4 %)
  • Language
    Swift
  • License
    MIT License
  • Created over 6 years ago
  • Updated almost 4 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

A simpler way to implement gradients on iOS.

Slope

Flat is out, so let's make depth easy.


Pod Version Swift Version License MIT Plaform

Gradients are coming back in style, so let's party like it's 1989 again.

Use them for backgrounds, use them for UI elements, use them to make yourself happy.


The built in CAGradientLayer API is overly complex, doesn't work with auto layout, and is very fiddly.

Using Slope is simple.

Simple is better than complex!

Let's build a gradient view like above:

import Slope

let gradientView = GradientView()
gradientView.gradient = UniformGradient(colors: [.darkGray, .lightGray])

There is no step 2. You now have a UIView subclass that you can add to your screen.

Let's build the save button above:

We're going to make it a little nicer by adding a highlighting effect when you touch down.

final class GradientButton: UIControl {

    let titleLabel: UILabel = {
        let label = UILabel()
        label.textColor = UIColor.white
        label.font = UIFont.systemFont(ofSize: 24.0)
        label.textAlignment = .center

        return label
    }()

    override var tintColor: UIColor! {
        didSet {
            self.backgroundColor = self.tintColor
            self.highlightedColor = self.tintColor.darkened(byPercentage: 0.1)
            
            let lightGreen = #colorLiteral(red: 0, green: 0.8235294118, blue: 0.5764705882, alpha: 1)
            self.backgroundGradientView.gradient = PercentageGradient(baseColor: lightGreen, percentage: 0.06)
        }
    }

    private let backgroundGradientView = GradientView()

    private var highlightedColor: UIColor?

    // MARK: Initializers

    override init(frame: CGRect) {
        super.init(frame: frame)

        self.setup()
    }

    @available(*, unavailable)
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    // MARK: Touch down effects

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        super.touchesBegan(touches, with: event)

        self.backgroundColor = self.highlightedColor
        self.backgroundGradientView.tintColor = self.highlightedColor ?? self.tintColor
    }

    override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
        super.touchesEnded(touches, with: event)

        self.backgroundColor = self.tintColor
        self.backgroundGradientView.tintColor = self.tintColor
    }

    override func touchesCancelled(_ touches: Set<UITouch>, with event: UIEvent?) {
        super.touchesCancelled(touches, with: event)

        self.backgroundColor = self.tintColor
        self.backgroundGradientView.tintColor = self.tintColor
    }
}

private extension GradientButton {

    func setup() {
        self.addSubview(self.backgroundGradientView)
        self.backgroundGradientView.pinToSuperview()

        self.addSubview(self.titleLabel)

        self.setupConstraints()
    }

    func setupConstraints() {
        self.backgroundGradientView.translatesAutoresizingMaskIntoConstraints = false

        let backgroundConstraints = [
            self.backgroundGradientView.leadingAnchor.constraint(equalTo: self.leadingAnchor),
            self.backgroundGradientView.trailingAnchor.constraint(equalTo: self.trailingAnchor),
            self.backgroundGradientView.topAnchor.constraint(equalTo: self.topAnchor),
            self.backgroundGradientView.bottomAnchor.constraint(equalTo: self.bottomAnchor)
        ]
        
        NSLayoutConstraint.activate(backgroundConstraints)

        self.titleLabel.translatesAutoresizingMaskIntoConstraints = false

        let titleLabelConstraints = [
            self.titleLabel.leadingAnchor.constraint(equalTo: self.leadingAnchor),
            self.titleLabel.trailingAnchor.constraint(equalTo: self.trailingAnchor),
            self.titleLabel.topAnchor.constraint(equalTo: self.topAnchor),
            self.titleLabel.bottomAnchor.constraint(equalTo: self.bottomAnchor)
        ]
        
        NSLayoutConstraint.activate(titleLabelConstraints)
    }

}

And voilà, a beautiful gradient button with highlighting that you can reuse across your app.


Types of Gradients

There are two current types of gradients, UniformGradient and PercentageGradient.

You can create your own as you see fit by conforming to the Gradient protocol.

  • If you want to make a radial gradient, go wild.
  • If you want to make a diagonal gradient, that works too.
  • If you come up with something creative, contribute to the project!

Installation

You can use SPM to install GenericCells.

You can also use CocoaPods to install Slope by adding it to your Podfile:

platform :ios, '9.0'
use_frameworks!

pod 'Slope'

Or install it manually by downloading Gradient.swift, UniformGradient.swift, PercentageGradient.swift, and GradientView.swift, and dropping them in your project.

About me

Hi, I'm Joe everywhere on the web, but especially on Twitter.

License

See the license for more information about how you can use Slope.

Is that it?

Yep, that's it. Good night, and have a pleasant tomorrow.

More Repositories

1

Boutique

✨ A magical persistence library (and so much more) for state-driven iOS and Mac apps ✨
Swift
774
star
2

TableFlip

A simpler way to do cool UITableView animations! (╯°□°)╯︵ ┻━┻
Swift
552
star
3

Public-Extension

🔧 A weekly log of handy Swift extensions
Swift
298
star
4

Bodega

A simple store for all your basic needs, and a foundational data layer primitive for iOS and Mac apps. 🐱
Swift
252
star
5

FeedbackEffect

A library for playing sounds and providing haptic feedback with ease.
Swift
225
star
6

GenericCells

Creating generic UITableViewCells and UICollectionViewCells instead of subclasses.
Swift
82
star
7

Anchorman

An autolayout library for the damn fine citizens of San Diego.
Swift
79
star
8

TypedNotifications

A mechanism for sending typed notifications with payloads across your iOS app.
Swift
76
star
9

MVCS

Swift
51
star
10

UILabel-ContentSize

Get the content size of a UILabel with text, because I always forget how to and want to have it in one god damn place.
Objective-C
44
star
11

CrossPromoter

A control which allows you to display an app to cross promote within your own app.
Objective-C
36
star
12

Communicado

A simpler way to share on iOS.
Swift
26
star
13

Shortcat

Navigate UITableViews using a keyboard with cat-like agility 🐱
Swift
12
star
14

Modem

A routing, serialization, and deep link handling framework all wrapped up in one
Swift
9
star
15

slack-themes

Slack Themes I've made and use
8
star
16

UIView-BezierCurve

Round individual corners of a UIView
Objective-C
7
star
17

UIViewController-StoreKit

A category on UIViewController allowing you to pull up an iTunes item with just one method
Objective-C
7
star
18

UIViewController-Sharing

A category on UIViewController for adding sharing options
Objective-C
6
star
19

UIControl-Notifications

Make your UIControls respond to notifications and blocks instead of the old fashioned target+selector approach
Objective-C
5
star
20

Launchpad

A better way to handle SwiftUI app launch
Swift
5
star
21

QuickNote

A scratch pad notification center widget for jailbroken iOS 5/6
Objective-C
4
star
22

iMessageFormatter

An Applescript to autoformat sentences with a capital letter and period at the end
AppleScript
4
star
23

UIDevice-Hardware

Category on UIDevice for accessing hardware information
Ruby
3
star
24

RequestBuilder

A library to help you build network requests atop URLSession
Swift
3
star
25

bot-of-conduct

JavaScript
3
star
26

JFTextFieldTableCell

A UITableViewCell subclass which supports inline editing, block handlers, and other niceties.
Objective-C
3
star
27

Podcatcher

A library for interacting with iOS Podcast apps
Objective-C
2
star
28

is-ci-busted

Is Ci Busted? Who even knows.
JavaScript
2
star
29

NSObject-Builder

Use the builder pattern with a category on NSObject
Ruby
2
star
30

QuickTweet

Add a quick way to send tweets from iOS's Notification Center.
2
star
31

UIImage-Transforms

Transforms on UIImage
Objective-C
2
star
32

JFFileManager

Class methods which make dealing with files on iOS easier.
Objective-C
2
star
33

NSString-Validation

A category on NSString for checking validity and transforming strings
Objective-C
2
star
34

SML

Random code I've done in SML for class
Standard ML
1
star
35

dropcaster-feed-seeder

Ruby
1
star
36

Google-Trends-Scraper

Get the list of google trends for every day from a certain point in time.
PHP
1
star
37

liftoff

Templates and Configuration for Liftoff
Swift
1
star
38

Project-Euler

My Objective-C implementation of the Project Euler solutions.
Objective-C
1
star
39

iosfolks.com

1
star
40

WebViewController

A simple web view controller, because everyone has their own version, but this one is simple with minimal chrome, and supports sharing out the box.
Objective-C
1
star
41

Response

An interface for creating a JSON response simply from a string
Go
1
star
42

NSDictionary-Networking

A category on NSDictionary for adding functionality when you're interacting with networking
Objective-C
1
star
43

Rerelease

A What's New screen, and more
Swift
1
star