Coder Social home page Coder Social logo

liliang360 / tgpcontrols Goto Github PK

View Code? Open in Web Editor NEW

This project forked from swiftarchitect/tgpcontrols

0.0 2.0 0.0 136 KB

Drop-in replacement for UISlider with ticks, images & animated labels

License: MIT License

Ruby 6.33% Objective-C 80.12% Swift 13.55%

tgpcontrols's Introduction

TGPControls Swift & Obj-C

##TGPDiscreteSlider ticksdemo

A slider with discrete steps, discrete range, with customizable track, thumb and ticks. Ideal to select steps.

##TGPCamelLabels camellabels2

A set of animated labels representing a selection. Can be used alone or in conjunction with a UIControl. Ideal to represent steps. The discrete slider and the camel labels can work in unison.

##Compatibility TGPControls are AutoLayout ready, support iOS 9 & iOS 8 IB Designable and IB Inspectable properties, yet runs as far back as iOS 7. Comes with two demo applications, one in Swift and one in Objective-C.

imagessliderdemo

Copyright disclaimer
The above slider is inspired by National Parks by National Geographic iPhone App.
National Parks iPhone App is developped by Rally Interactive LLC.
The above image, styling, appearance and look & feel all Copyright © 2015 National Geographic Society.
TGPControls is not associated with National Geographic Society, Rally Interactive LLC or any of it's subsidiaries.

##Fully Customizable

alphabetslider

Control everything about the slider or its labels, starting with colors, images and fonts, including track and ticks shape, and thumb shadows. All computations regarding range and sizing and handled automatically. Use the two classes in tandem to create stunning new controls, which can be resized dynamically, to intergrate beautifully into your application.

onoff

Most customization can be done in Interface Builder and require 0 coding.

##How to integrate Using CocoaPods

  • iOS 9 and later, iOS 8: install CocoaPods 0.36.0+ CocoaPods-Frameworks, add use_frameworks! to your podfile.
  • iOS 7: restrict yourself to TGPCamelLabels7.{h,m} and TGPDiscreteSlider7.{h,m}. Compatible with CocoaPods 0.35.0. Note: When integrating into an iOS 7 project, use the TGPCamelLabels7 and TGPDiscreteSlider7 classes in Interface Builder.

Besides customization, which you can do entirely under Interface Builder in iOS 8 and later, both TGPDiscreteSlider and TGPCamelLabels require surprisingly little code to integrate.

###TGPDiscreteSlider

For simplicity, TGPDiscreteSlider does not descend from UISlider but from UIControl. It uses a minimumValue, a tickCount and an incrementValue (instead of minimumValue and maximumValue). All graphic aspects, such as physical spacing of the ticks or physical width of the track are controlled internally. This makes TGPDiscreteSlider predictable. it is guaranteed to always fit snuggly inside its bounds.

Step 1: register to notifications (just like any UIControl)

[self.discreteSlider addTarget:self
                        action:@selector(discreteSliderValueChanged:)
              forControlEvents:UIControlEventValueChanged];

Step 2: respond to notification

- (IBAction)discreteSliderValueChanged:(TGPDiscreteSlider *)sender {
    [self.camelLabels setValue:sender.value];
}

That's all, and all you need to create this control:

complete

Change tickStyle, trackStyle, thumbStyle to be one of:

  • ComponentStyleIOS = 0 Gives to any component the iOS appearance. Ticks are invisible, track is blue and gray, thumb is round with a shadow.
  • ComponentStyleRectangular = 1 Boxy look with hard edges.
  • ComponentStyleRounded = 2 From rounded rectangles to perfects circles, depending on vertical to horizontal ratio.
  • ComponentStyleInvisible = 3 Surprisingly useful to individually hide ticks, track, or even thumb.

image

###TGPCamelLabels

Besides font customization, TGPCamelLabels only requires a set of labels (supplied as strings), and an active index selection.

Step 1: tell the TGPCamelLabels what to select

[self.camelLabels setValue:sender.value];

There is no step 2.

For ease of use, most of the customization can be done inside Interface Builder. You may, however, be interested in these 3 properties programatically:

  • ticksListener allows you tie a discrete slider to its camel labels. This is your most robust method to not only ensure that the layout of both controls match exactly, but also adjust this spacing when orientation changes. A typical use may be self.discreteSlider.ticksListener = self.camelLabels

  • names allows you to supply a new set of labels. This supersedes the tickCount property, which will return the number of labels. A typical use may be self.camelLabels.names = @[@"OFF", @"ON"];

  • ticksDistance, a less common property, allows you to override the labels spacing entirely. Prefer the ticksListener mechanism if it is available to you. A typical use may be self.camelLabels.ticksDistance = 15

For convenience TGPCamelLabels becomes tap-through (click-through) when backgroundColor is clearColor. You can then use TGPCamelLabels on top of other UI elements:

uiswitch

###Code example

See TGPControlsDemo projects:

  1. TGPControlsDemo (iOS 9 & 8 + Swift + IBInspectable)
  2. TGPControlsDemo7 (iOS 7 + ObjC) projects.
#import "ViewController.h"
#import "TGPDiscreteSlider.h"
#import "TGPCamelLabels.h"

@interface ViewController ()
@property (strong, nonatomic) IBOutlet TGPDiscreteSlider *oneTo10Slider;
@property (strong, nonatomic) IBOutlet TGPCamelLabels *oneTo10Labels;

@property (strong, nonatomic) IBOutlet TGPCamelLabels *alphabetLabels;
@property (strong, nonatomic) IBOutlet TGPDiscreteSlider *alphabetSlider;

@property (strong, nonatomic) IBOutlet TGPCamelLabels *switch1Camel;
@property (strong, nonatomic) IBOutlet TGPCamelLabels *switch2Camel;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    self.alphabetLabels.names = @[@"A",@"B",@"C",@"D",@"E",@"F", @"G",@"H",@"I",@"J",@"K",@"L",@"M",
                                  @"N",@"O",@"P",@"Q",@"R",@"S", @"T",@"U",@"V",@"W",@"X",@"Y",@"Z"];
    self.switch1Camel.names = @[@"OFF", @"ON"];

    // Automatically track tick spacing changes
    self.alphabetSlider.ticksListener = self.alphabetLabels;
    self.oneTo10Slider.ticksListener = self.oneTo10Labels;
}

#pragma mark UISwitch

- (IBAction)switch1ValueChanged:(UISwitch *)sender {
    [self.switch1Camel setValue:((sender.isOn) ? 1 : 0)];
}

- (IBAction)switch2TouchUpInside:(UISwitch *)sender {
    [self.switch2Camel setValue:((sender.isOn) ? 1 : 0)];
}

@end

###Customization example

image

custom

tgpcontrols's People

Contributors

swiftarchitect avatar hebertialmeida avatar peterhaldbaek avatar readmecritic avatar

Watchers

James Cloos avatar  avatar

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.