Skip to content

Repository files navigation

MDCSwipeToChoose

Build Status

Swipe to "like" or "dislike" any view, just like Tinder.app. Build a flashcard app, a photo viewer, and more, in minutes, not hours!

  • Use UIView+MDCSwipeToChoose to add a swipe gesture and callbacks to any UIView.
  • Use MDCSwipeToChooseView to get a UI nearly identical to Tinder.app in just a few lines of code.

You may view slides on some the architecture decisions that went into this library here.

How to Install via CocoaPods

Place the following in your Podfile and run pod install:

pod "MDCSwipeToChoose"

How to Use

Check out the sample app for an example of how to use MDCSwipeToChooseView to build the UI in the GIF above.

NOTE: You must run pod install in the Examples/LikedOrNope directory before building the example app.

Every public class contains documentation in its header file.

Swiping Yes/No

The following is an example of how you can use MDCSwipeToChooseView to display a photo. The user can choose to delete it by swiping left, or save it by swiping right.

Objective-C

#import<MDCSwipeToChoose/MDCSwipeToChoose.h>// ... in a view controller
#pragma mark - Creating and Customizing a MDCSwipeToChooseView
- (void)viewDidLoad {
[superviewDidLoad];
// You can customize MDCSwipeToChooseView using MDCSwipeToChooseViewOptions.
MDCSwipeToChooseViewOptions *options = [MDCSwipeToChooseViewOptions new];
options.delegate = self;
options.likedText = @"Keep";
options.likedColor = [UIColor blueColor];
options.nopeText = @"Delete";
options.onPan = ^(MDCPanState *state){
if (state.thresholdRatio == 1.f && state.direction == MDCSwipeDirectionLeft) {
NSLog(@"Let go now to delete the photo!");
}
};
MDCSwipeToChooseView *view = [[MDCSwipeToChooseView alloc] initWithFrame:self.view.bounds
options:options];
view.imageView.image = [UIImage imageNamed:@"photo"];
[self.view addSubview:view];
}
#pragma mark - MDCSwipeToChooseDelegate Callbacks
// This is called when a user didn't fully swipe left or right.
- (void)viewDidCancelSwipe:(UIView *)view {
NSLog(@"Couldn't decide, huh?");
}
// Sent before a choice is made. Cancel the choice by returning `NO`. Otherwise return `YES`.
- (BOOL)view:(UIView *)view shouldBeChosenWithDirection:(MDCSwipeDirection)direction {
if (direction == MDCSwipeDirectionLeft) {
returnYES;
} else {
// Snap the view back and cancel the choice.
[UIView animateWithDuration:0.16animations:^{
view.transform = CGAffineTransformIdentity;
view.center = [view superview].center;
}];
returnNO;
}
}
// This is called then a user swipes the view fully left or right.
- (void)view:(UIView *)view wasChosenWithDirection:(MDCSwipeDirection)direction {
if (direction == MDCSwipeDirectionLeft) {
NSLog(@"Photo deleted!");
} else {
NSLog(@"Photo saved!");
}
}

As of version 0.2.0, you may also swipe a view programmatically:

[self.swipeToChooseView mdc_swipe:MDCSwipeDirectionLeft];

Swift

To use objective-c code from swift, you need to use bridging-header.

#ifndef BridgingHeader_h
#define BridgingHeader_h
#import <UIKit/UIKit.h>
#import <MDCSwipeToChoose/MDCSwipeToChoose.h>
#endif
import UIKit
// ... in a view controller
overridefunc viewDidLoad(){
super.viewDidLoad()varoptions=MDCSwipeToChooseViewOptions()
options.delegate =self
options.likedText ="Keep"
options.likedColor =UIColor.blueColor()
options.nopeText ="Delete"
options.onPan ={ state ->Voidinif state.thresholdRatio ==1 && state.direction ==MDCSwipeDirection.Left {println("Photo deleted!")}}varview=MDCSwipeToChooseView(frame:self.view.bounds, options: options)
view.imageView.image =UIImage(named:"photo.png")self.view.addSubview(view)}overridefunc didReceiveMemoryWarning(){
super.didReceiveMemoryWarning()}
// This is called when a user didn't fully swipe left or right.
func viewDidCancelSwipe(view:UIView)->Void{println("Couldn't decide, huh?")}
// Sent before a choice is made. Cancel the choice by returning `false`. Otherwise return `true`.
func view(view:UIView, shouldBeChosenWithDirection:MDCSwipeDirection)->Bool{if(shouldBeChosenWithDirection ==MDCSwipeDirection.Left){returntrue;
}else{
// Snap the view back and cancel the choice.
UIView.animateWithDuration(0.16, animations:{()->Voidin
view.transform = CGAffineTransformIdentity
view.center = view.superview!.center
})returnfalse;
}}
// This is called then a user swipes the view fully left or right.
func view(view:UIView, wasChosenWithDirection:MDCSwipeDirection)->Void{if wasChosenWithDirection ==MDCSwipeDirection.Left {println("Photo deleted!")}else{println("Photo saved!")}}

If you're using Cocoapods 0.36+ (perhaps because you want to include pods that contain Swift code) and you've included the use_frameworks! directive in your Podfile, then you've converted all your pods (including MDCSwipeToChoose) into frameworks. Therefore, you'll need to include the line

import MDCSwipeToChoose

...in your Swift files (even if you're using a bridging header).

More Generic Swiping

You don't have to use a subclass of MDCChooseView. You can use the mdc_swipeToChooseSetup: method on any UIView to enable swipe-to-choose.

In the following example, we adjust the opacity of a UIWebView when it's panned left and right.

#import<MDCSwipeToChoose/MDCSwipeToChoose.h>// ... in a view controller
- (void)viewDidLoad {
[superviewDidLoad];
MDCSwipeOptions *options = [MDCSwipeOptions new];
options.delegate = self;
options.onPan = ^(MDCPanState *state){
switch (state.direction) {
case MDCSwipeDirectionLeft:
self.webView.alpha = 0.5f - state.thresholdRatio;
break;
case MDCSwipeDirectionRight:
self.webView.alpha = 0.5f + state.thresholdRatio;
break;
case MDCSwipeDirectionNone:
self.webView.alpha = 0.5f;
break;
}
};
[self.webView mdc_swipeToChooseSetup:options];
}

##Swiping in Swift

The following is an example of how you can use MDCSwipeToChooseView to display a photo in swift. The user can choose to delete it by swiping left, or save it by swiping right.

First you must create a BridgingHeader.h file

#ifndef ProjectName_BridgingHeader_h
#defineProjectName_BridgingHeader_h
#import<UIKit/UIKit.h>
#import<MDCSwipeToChoose/MDCSwipeToChoose.h>
#endif

You must then add the bridging header file to the project by navigating to Build Settings then searching for 'Bridging Header'. Double click the field and type: ProjectName/BridgingHeader.h as the value

// Creating and Customizing a MDCSwipeToChooseView
overridefunc viewDidLoad(){
super.viewDidLoad()
// You can customize MDCSwipeToChooseView using MDCSwipeToChooseViewOptions.
varoptions:MDCSwipeToChooseViewOptions=MDCSwipeToChooseViewOptions()
options.delegate =self
options.likedText ="Keep"
options.likedColor =[UIColor blueColor]
options.nopeText ="Delete"
options.onPan ={ state ->Voidinif(state.thresholdRatio ==1.0 && state.direction ==MDCSwipeDirection.Left){Println("Let go now to delete the photo!")}}varview:MDCSwipeToChooseView=MDCSwipeToChooseView(frame:self.view.bounds, options:options)
view.imageView.image =UIImage(named:"photo")self.view.addSubview(view)}
// MDCSwipeToChooseDelegate Callbacks
// This is called when a user didn't fully swipe left or right.
func viewDidCancelSwipe(view:UIView)->Void{Println("Couldn't decide, huh?")}
// Sent before a choice is made. Cancel the choice by returning `NO`. Otherwise return `YES`.
func view(view:UIView, shouldBeChosenWithDirection:MDCSwipeDirection)->BOOL{if(shouldBeChosenWithDirection ==MDCSwipeDirection.Left){return YES;
}else{
// Snap the view back and cancel the choice.
UIView.animateWithDuration(0.16, animations:{
view.transform = CGAffineTransformIdentity
view.center =self.superview.center
}return NO;
}}
// This is called then a user swipes the view fully left or right.
func view(view:UIView, wasChosenWithDirection:MDCSwipeDirection)->Void{if(wasChosenWithDirection ==MDCSwipeDirection.Left){Println("Photo deleted!");
}else{Println("Photo saved!");
}}

As of version 0.2.0, you may also swipe a view programmatically:

self.swipeToChooseView(mdc_swipe:MDCSwipeDirection.Left)

License

All the source code is distributed under the MIT license. See the LICENSE file for details. The license does not apply to the images used in the sample apps.

About

Swipe to "like" or "dislike" any view, just like Tinder.app. Build a flashcard app, a photo viewer, and more, in minutes, not hours!

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
GitHub - alienbat/MDCSwipeToChoose: Swipe to "like" or "dislike" any view, just like Tinder.app. Build a flashcard app, a photo viewer, and more, in minutes, not hours! · GitHub
Skip to content

Repository files navigation

MDCSwipeToChoose

Build Status

Swipe to "like" or "dislike" any view, just like Tinder.app. Build a flashcard app, a photo viewer, and more, in minutes, not hours!

  • Use UIView+MDCSwipeToChoose to add a swipe gesture and callbacks to any UIView.
  • Use MDCSwipeToChooseView to get a UI nearly identical to Tinder.app in just a few lines of code.

You may view slides on some the architecture decisions that went into this library here.

How to Install via CocoaPods

Place the following in your Podfile and run pod install:

pod "MDCSwipeToChoose"

How to Use

Check out the sample app for an example of how to use MDCSwipeToChooseView to build the UI in the GIF above.

NOTE: You must run pod install in the Examples/LikedOrNope directory before building the example app.

Every public class contains documentation in its header file.

Swiping Yes/No

The following is an example of how you can use MDCSwipeToChooseView to display a photo. The user can choose to delete it by swiping left, or save it by swiping right.

Objective-C

#import<MDCSwipeToChoose/MDCSwipeToChoose.h>// ... in a view controller
#pragma mark - Creating and Customizing a MDCSwipeToChooseView
- (void)viewDidLoad {
[superviewDidLoad];
// You can customize MDCSwipeToChooseView using MDCSwipeToChooseViewOptions.
MDCSwipeToChooseViewOptions *options = [MDCSwipeToChooseViewOptions new];
options.delegate = self;
options.likedText = @"Keep";
options.likedColor = [UIColor blueColor];
options.nopeText = @"Delete";
options.onPan = ^(MDCPanState *state){
if (state.thresholdRatio == 1.f && state.direction == MDCSwipeDirectionLeft) {
NSLog(@"Let go now to delete the photo!");
}
};
MDCSwipeToChooseView *view = [[MDCSwipeToChooseView alloc] initWithFrame:self.view.bounds
options:options];
view.imageView.image = [UIImage imageNamed:@"photo"];
[self.view addSubview:view];
}
#pragma mark - MDCSwipeToChooseDelegate Callbacks
// This is called when a user didn't fully swipe left or right.
- (void)viewDidCancelSwipe:(UIView *)view {
NSLog(@"Couldn't decide, huh?");
}
// Sent before a choice is made. Cancel the choice by returning `NO`. Otherwise return `YES`.
- (BOOL)view:(UIView *)view shouldBeChosenWithDirection:(MDCSwipeDirection)direction {
if (direction == MDCSwipeDirectionLeft) {
returnYES;
} else {
// Snap the view back and cancel the choice.
[UIView animateWithDuration:0.16animations:^{
view.transform = CGAffineTransformIdentity;
view.center = [view superview].center;
}];
returnNO;
}
}
// This is called then a user swipes the view fully left or right.
- (void)view:(UIView *)view wasChosenWithDirection:(MDCSwipeDirection)direction {
if (direction == MDCSwipeDirectionLeft) {
NSLog(@"Photo deleted!");
} else {
NSLog(@"Photo saved!");
}
}

As of version 0.2.0, you may also swipe a view programmatically:

[self.swipeToChooseView mdc_swipe:MDCSwipeDirectionLeft];

Swift

To use objective-c code from swift, you need to use bridging-header.

#ifndef BridgingHeader_h
#define BridgingHeader_h
#import <UIKit/UIKit.h>
#import <MDCSwipeToChoose/MDCSwipeToChoose.h>
#endif
import UIKit
// ... in a view controller
overridefunc viewDidLoad(){
super.viewDidLoad()varoptions=MDCSwipeToChooseViewOptions()
options.delegate =self
options.likedText ="Keep"
options.likedColor =UIColor.blueColor()
options.nopeText ="Delete"
options.onPan ={ state ->Voidinif state.thresholdRatio ==1 && state.direction ==MDCSwipeDirection.Left {println("Photo deleted!")}}varview=MDCSwipeToChooseView(frame:self.view.bounds, options: options)
view.imageView.image =UIImage(named:"photo.png")self.view.addSubview(view)}overridefunc didReceiveMemoryWarning(){
super.didReceiveMemoryWarning()}
// This is called when a user didn't fully swipe left or right.
func viewDidCancelSwipe(view:UIView)->Void{println("Couldn't decide, huh?")}
// Sent before a choice is made. Cancel the choice by returning `false`. Otherwise return `true`.
func view(view:UIView, shouldBeChosenWithDirection:MDCSwipeDirection)->Bool{if(shouldBeChosenWithDirection ==MDCSwipeDirection.Left){returntrue;
}else{
// Snap the view back and cancel the choice.
UIView.animateWithDuration(0.16, animations:{()->Voidin
view.transform = CGAffineTransformIdentity
view.center = view.superview!.center
})returnfalse;
}}
// This is called then a user swipes the view fully left or right.
func view(view:UIView, wasChosenWithDirection:MDCSwipeDirection)->Void{if wasChosenWithDirection ==MDCSwipeDirection.Left {println("Photo deleted!")}else{println("Photo saved!")}}

If you're using Cocoapods 0.36+ (perhaps because you want to include pods that contain Swift code) and you've included the use_frameworks! directive in your Podfile, then you've converted all your pods (including MDCSwipeToChoose) into frameworks. Therefore, you'll need to include the line

import MDCSwipeToChoose

...in your Swift files (even if you're using a bridging header).

More Generic Swiping

You don't have to use a subclass of MDCChooseView. You can use the mdc_swipeToChooseSetup: method on any UIView to enable swipe-to-choose.

In the following example, we adjust the opacity of a UIWebView when it's panned left and right.

#import<MDCSwipeToChoose/MDCSwipeToChoose.h>// ... in a view controller
- (void)viewDidLoad {
[superviewDidLoad];
MDCSwipeOptions *options = [MDCSwipeOptions new];
options.delegate = self;
options.onPan = ^(MDCPanState *state){
switch (state.direction) {
case MDCSwipeDirectionLeft:
self.webView.alpha = 0.5f - state.thresholdRatio;
break;
case MDCSwipeDirectionRight:
self.webView.alpha = 0.5f + state.thresholdRatio;
break;
case MDCSwipeDirectionNone:
self.webView.alpha = 0.5f;
break;
}
};
[self.webView mdc_swipeToChooseSetup:options];
}

##Swiping in Swift

The following is an example of how you can use MDCSwipeToChooseView to display a photo in swift. The user can choose to delete it by swiping left, or save it by swiping right.

First you must create a BridgingHeader.h file

#ifndef ProjectName_BridgingHeader_h
#defineProjectName_BridgingHeader_h
#import<UIKit/UIKit.h>
#import<MDCSwipeToChoose/MDCSwipeToChoose.h>
#endif

You must then add the bridging header file to the project by navigating to Build Settings then searching for 'Bridging Header'. Double click the field and type: ProjectName/BridgingHeader.h as the value

// Creating and Customizing a MDCSwipeToChooseView
overridefunc viewDidLoad(){
super.viewDidLoad()
// You can customize MDCSwipeToChooseView using MDCSwipeToChooseViewOptions.
varoptions:MDCSwipeToChooseViewOptions=MDCSwipeToChooseViewOptions()
options.delegate =self
options.likedText ="Keep"
options.likedColor =[UIColor blueColor]
options.nopeText ="Delete"
options.onPan ={ state ->Voidinif(state.thresholdRatio ==1.0 && state.direction ==MDCSwipeDirection.Left){Println("Let go now to delete the photo!")}}varview:MDCSwipeToChooseView=MDCSwipeToChooseView(frame:self.view.bounds, options:options)
view.imageView.image =UIImage(named:"photo")self.view.addSubview(view)}
// MDCSwipeToChooseDelegate Callbacks
// This is called when a user didn't fully swipe left or right.
func viewDidCancelSwipe(view:UIView)->Void{Println("Couldn't decide, huh?")}
// Sent before a choice is made. Cancel the choice by returning `NO`. Otherwise return `YES`.
func view(view:UIView, shouldBeChosenWithDirection:MDCSwipeDirection)->BOOL{if(shouldBeChosenWithDirection ==MDCSwipeDirection.Left){return YES;
}else{
// Snap the view back and cancel the choice.
UIView.animateWithDuration(0.16, animations:{
view.transform = CGAffineTransformIdentity
view.center =self.superview.center
}return NO;
}}
// This is called then a user swipes the view fully left or right.
func view(view:UIView, wasChosenWithDirection:MDCSwipeDirection)->Void{if(wasChosenWithDirection ==MDCSwipeDirection.Left){Println("Photo deleted!");
}else{Println("Photo saved!");
}}

As of version 0.2.0, you may also swipe a view programmatically:

self.swipeToChooseView(mdc_swipe:MDCSwipeDirection.Left)

License

All the source code is distributed under the MIT license. See the LICENSE file for details. The license does not apply to the images used in the sample apps.

About

Swipe to "like" or "dislike" any view, just like Tinder.app. Build a flashcard app, a photo viewer, and more, in minutes, not hours!

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - alienbat/MDCSwipeToChoose: Swipe to "like" or "dislike" any view, just like Tinder.app. Build a flashcard app, a photo viewer, and more, in minutes, not hours! · GitHub
Skip to content

Repository files navigation

MDCSwipeToChoose

Build Status

Swipe to "like" or "dislike" any view, just like Tinder.app. Build a flashcard app, a photo viewer, and more, in minutes, not hours!

  • Use UIView+MDCSwipeToChoose to add a swipe gesture and callbacks to any UIView.
  • Use MDCSwipeToChooseView to get a UI nearly identical to Tinder.app in just a few lines of code.

You may view slides on some the architecture decisions that went into this library here.

How to Install via CocoaPods

Place the following in your Podfile and run pod install:

pod "MDCSwipeToChoose"

How to Use

Check out the sample app for an example of how to use MDCSwipeToChooseView to build the UI in the GIF above.

NOTE: You must run pod install in the Examples/LikedOrNope directory before building the example app.

Every public class contains documentation in its header file.

Swiping Yes/No

The following is an example of how you can use MDCSwipeToChooseView to display a photo. The user can choose to delete it by swiping left, or save it by swiping right.

Objective-C

#import<MDCSwipeToChoose/MDCSwipeToChoose.h>// ... in a view controller
#pragma mark - Creating and Customizing a MDCSwipeToChooseView
- (void)viewDidLoad {
[superviewDidLoad];
// You can customize MDCSwipeToChooseView using MDCSwipeToChooseViewOptions.
MDCSwipeToChooseViewOptions *options = [MDCSwipeToChooseViewOptions new];
options.delegate = self;
options.likedText = @"Keep";
options.likedColor = [UIColor blueColor];
options.nopeText = @"Delete";
options.onPan = ^(MDCPanState *state){
if (state.thresholdRatio == 1.f && state.direction == MDCSwipeDirectionLeft) {
NSLog(@"Let go now to delete the photo!");
}
};
MDCSwipeToChooseView *view = [[MDCSwipeToChooseView alloc] initWithFrame:self.view.bounds
options:options];
view.imageView.image = [UIImage imageNamed:@"photo"];
[self.view addSubview:view];
}
#pragma mark - MDCSwipeToChooseDelegate Callbacks
// This is called when a user didn't fully swipe left or right.
- (void)viewDidCancelSwipe:(UIView *)view {
NSLog(@"Couldn't decide, huh?");
}
// Sent before a choice is made. Cancel the choice by returning `NO`. Otherwise return `YES`.
- (BOOL)view:(UIView *)view shouldBeChosenWithDirection:(MDCSwipeDirection)direction {
if (direction == MDCSwipeDirectionLeft) {
returnYES;
} else {
// Snap the view back and cancel the choice.
[UIView animateWithDuration:0.16animations:^{
view.transform = CGAffineTransformIdentity;
view.center = [view superview].center;
}];
returnNO;
}
}
// This is called then a user swipes the view fully left or right.
- (void)view:(UIView *)view wasChosenWithDirection:(MDCSwipeDirection)direction {
if (direction == MDCSwipeDirectionLeft) {
NSLog(@"Photo deleted!");
} else {
NSLog(@"Photo saved!");
}
}

As of version 0.2.0, you may also swipe a view programmatically:

[self.swipeToChooseView mdc_swipe:MDCSwipeDirectionLeft];

Swift

To use objective-c code from swift, you need to use bridging-header.

#ifndef BridgingHeader_h
#define BridgingHeader_h
#import <UIKit/UIKit.h>
#import <MDCSwipeToChoose/MDCSwipeToChoose.h>
#endif
import UIKit
// ... in a view controller
overridefunc viewDidLoad(){
super.viewDidLoad()varoptions=MDCSwipeToChooseViewOptions()
options.delegate =self
options.likedText ="Keep"
options.likedColor =UIColor.blueColor()
options.nopeText ="Delete"
options.onPan ={ state ->Voidinif state.thresholdRatio ==1 && state.direction ==MDCSwipeDirection.Left {println("Photo deleted!")}}varview=MDCSwipeToChooseView(frame:self.view.bounds, options: options)
view.imageView.image =UIImage(named:"photo.png")self.view.addSubview(view)}overridefunc didReceiveMemoryWarning(){
super.didReceiveMemoryWarning()}
// This is called when a user didn't fully swipe left or right.
func viewDidCancelSwipe(view:UIView)->Void{println("Couldn't decide, huh?")}
// Sent before a choice is made. Cancel the choice by returning `false`. Otherwise return `true`.
func view(view:UIView, shouldBeChosenWithDirection:MDCSwipeDirection)->Bool{if(shouldBeChosenWithDirection ==MDCSwipeDirection.Left){returntrue;
}else{
// Snap the view back and cancel the choice.
UIView.animateWithDuration(0.16, animations:{()->Voidin
view.transform = CGAffineTransformIdentity
view.center = view.superview!.center
})returnfalse;
}}
// This is called then a user swipes the view fully left or right.
func view(view:UIView, wasChosenWithDirection:MDCSwipeDirection)->Void{if wasChosenWithDirection ==MDCSwipeDirection.Left {println("Photo deleted!")}else{println("Photo saved!")}}

If you're using Cocoapods 0.36+ (perhaps because you want to include pods that contain Swift code) and you've included the use_frameworks! directive in your Podfile, then you've converted all your pods (including MDCSwipeToChoose) into frameworks. Therefore, you'll need to include the line

import MDCSwipeToChoose

...in your Swift files (even if you're using a bridging header).

More Generic Swiping

You don't have to use a subclass of MDCChooseView. You can use the mdc_swipeToChooseSetup: method on any UIView to enable swipe-to-choose.

In the following example, we adjust the opacity of a UIWebView when it's panned left and right.

#import<MDCSwipeToChoose/MDCSwipeToChoose.h>// ... in a view controller
- (void)viewDidLoad {
[superviewDidLoad];
MDCSwipeOptions *options = [MDCSwipeOptions new];
options.delegate = self;
options.onPan = ^(MDCPanState *state){
switch (state.direction) {
case MDCSwipeDirectionLeft:
self.webView.alpha = 0.5f - state.thresholdRatio;
break;
case MDCSwipeDirectionRight:
self.webView.alpha = 0.5f + state.thresholdRatio;
break;
case MDCSwipeDirectionNone:
self.webView.alpha = 0.5f;
break;
}
};
[self.webView mdc_swipeToChooseSetup:options];
}

##Swiping in Swift

The following is an example of how you can use MDCSwipeToChooseView to display a photo in swift. The user can choose to delete it by swiping left, or save it by swiping right.

First you must create a BridgingHeader.h file

#ifndef ProjectName_BridgingHeader_h
#defineProjectName_BridgingHeader_h
#import<UIKit/UIKit.h>
#import<MDCSwipeToChoose/MDCSwipeToChoose.h>
#endif

You must then add the bridging header file to the project by navigating to Build Settings then searching for 'Bridging Header'. Double click the field and type: ProjectName/BridgingHeader.h as the value

// Creating and Customizing a MDCSwipeToChooseView
overridefunc viewDidLoad(){
super.viewDidLoad()
// You can customize MDCSwipeToChooseView using MDCSwipeToChooseViewOptions.
varoptions:MDCSwipeToChooseViewOptions=MDCSwipeToChooseViewOptions()
options.delegate =self
options.likedText ="Keep"
options.likedColor =[UIColor blueColor]
options.nopeText ="Delete"
options.onPan ={ state ->Voidinif(state.thresholdRatio ==1.0 && state.direction ==MDCSwipeDirection.Left){Println("Let go now to delete the photo!")}}varview:MDCSwipeToChooseView=MDCSwipeToChooseView(frame:self.view.bounds, options:options)
view.imageView.image =UIImage(named:"photo")self.view.addSubview(view)}
// MDCSwipeToChooseDelegate Callbacks
// This is called when a user didn't fully swipe left or right.
func viewDidCancelSwipe(view:UIView)->Void{Println("Couldn't decide, huh?")}
// Sent before a choice is made. Cancel the choice by returning `NO`. Otherwise return `YES`.
func view(view:UIView, shouldBeChosenWithDirection:MDCSwipeDirection)->BOOL{if(shouldBeChosenWithDirection ==MDCSwipeDirection.Left){return YES;
}else{
// Snap the view back and cancel the choice.
UIView.animateWithDuration(0.16, animations:{
view.transform = CGAffineTransformIdentity
view.center =self.superview.center
}return NO;
}}
// This is called then a user swipes the view fully left or right.
func view(view:UIView, wasChosenWithDirection:MDCSwipeDirection)->Void{if(wasChosenWithDirection ==MDCSwipeDirection.Left){Println("Photo deleted!");
}else{Println("Photo saved!");
}}

As of version 0.2.0, you may also swipe a view programmatically:

self.swipeToChooseView(mdc_swipe:MDCSwipeDirection.Left)

License

All the source code is distributed under the MIT license. See the LICENSE file for details. The license does not apply to the images used in the sample apps.

About

Swipe to "like" or "dislike" any view, just like Tinder.app. Build a flashcard app, a photo viewer, and more, in minutes, not hours!

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - alienbat/MDCSwipeToChoose: Swipe to "like" or "dislike" any view, just like Tinder.app. Build a flashcard app, a photo viewer, and more, in minutes, not hours! · GitHub
Skip to content

Repository files navigation

MDCSwipeToChoose

Build Status

Swipe to "like" or "dislike" any view, just like Tinder.app. Build a flashcard app, a photo viewer, and more, in minutes, not hours!

  • Use UIView+MDCSwipeToChoose to add a swipe gesture and callbacks to any UIView.
  • Use MDCSwipeToChooseView to get a UI nearly identical to Tinder.app in just a few lines of code.

You may view slides on some the architecture decisions that went into this library here.

How to Install via CocoaPods

Place the following in your Podfile and run pod install:

pod "MDCSwipeToChoose"

How to Use

Check out the sample app for an example of how to use MDCSwipeToChooseView to build the UI in the GIF above.

NOTE: You must run pod install in the Examples/LikedOrNope directory before building the example app.

Every public class contains documentation in its header file.

Swiping Yes/No

The following is an example of how you can use MDCSwipeToChooseView to display a photo. The user can choose to delete it by swiping left, or save it by swiping right.

Objective-C

#import<MDCSwipeToChoose/MDCSwipeToChoose.h>// ... in a view controller
#pragma mark - Creating and Customizing a MDCSwipeToChooseView
- (void)viewDidLoad {
[superviewDidLoad];
// You can customize MDCSwipeToChooseView using MDCSwipeToChooseViewOptions.
MDCSwipeToChooseViewOptions *options = [MDCSwipeToChooseViewOptions new];
options.delegate = self;
options.likedText = @"Keep";
options.likedColor = [UIColor blueColor];
options.nopeText = @"Delete";
options.onPan = ^(MDCPanState *state){
if (state.thresholdRatio == 1.f && state.direction == MDCSwipeDirectionLeft) {
NSLog(@"Let go now to delete the photo!");
}
};
MDCSwipeToChooseView *view = [[MDCSwipeToChooseView alloc] initWithFrame:self.view.bounds
options:options];
view.imageView.image = [UIImage imageNamed:@"photo"];
[self.view addSubview:view];
}
#pragma mark - MDCSwipeToChooseDelegate Callbacks
// This is called when a user didn't fully swipe left or right.
- (void)viewDidCancelSwipe:(UIView *)view {
NSLog(@"Couldn't decide, huh?");
}
// Sent before a choice is made. Cancel the choice by returning `NO`. Otherwise return `YES`.
- (BOOL)view:(UIView *)view shouldBeChosenWithDirection:(MDCSwipeDirection)direction {
if (direction == MDCSwipeDirectionLeft) {
returnYES;
} else {
// Snap the view back and cancel the choice.
[UIView animateWithDuration:0.16animations:^{
view.transform = CGAffineTransformIdentity;
view.center = [view superview].center;
}];
returnNO;
}
}
// This is called then a user swipes the view fully left or right.
- (void)view:(UIView *)view wasChosenWithDirection:(MDCSwipeDirection)direction {
if (direction == MDCSwipeDirectionLeft) {
NSLog(@"Photo deleted!");
} else {
NSLog(@"Photo saved!");
}
}

As of version 0.2.0, you may also swipe a view programmatically:

[self.swipeToChooseView mdc_swipe:MDCSwipeDirectionLeft];

Swift

To use objective-c code from swift, you need to use bridging-header.

#ifndef BridgingHeader_h
#define BridgingHeader_h
#import <UIKit/UIKit.h>
#import <MDCSwipeToChoose/MDCSwipeToChoose.h>
#endif
import UIKit
// ... in a view controller
overridefunc viewDidLoad(){
super.viewDidLoad()varoptions=MDCSwipeToChooseViewOptions()
options.delegate =self
options.likedText ="Keep"
options.likedColor =UIColor.blueColor()
options.nopeText ="Delete"
options.onPan ={ state ->Voidinif state.thresholdRatio ==1 && state.direction ==MDCSwipeDirection.Left {println("Photo deleted!")}}varview=MDCSwipeToChooseView(frame:self.view.bounds, options: options)
view.imageView.image =UIImage(named:"photo.png")self.view.addSubview(view)}overridefunc didReceiveMemoryWarning(){
super.didReceiveMemoryWarning()}
// This is called when a user didn't fully swipe left or right.
func viewDidCancelSwipe(view:UIView)->Void{println("Couldn't decide, huh?")}
// Sent before a choice is made. Cancel the choice by returning `false`. Otherwise return `true`.
func view(view:UIView, shouldBeChosenWithDirection:MDCSwipeDirection)->Bool{if(shouldBeChosenWithDirection ==MDCSwipeDirection.Left){returntrue;
}else{
// Snap the view back and cancel the choice.
UIView.animateWithDuration(0.16, animations:{()->Voidin
view.transform = CGAffineTransformIdentity
view.center = view.superview!.center
})returnfalse;
}}
// This is called then a user swipes the view fully left or right.
func view(view:UIView, wasChosenWithDirection:MDCSwipeDirection)->Void{if wasChosenWithDirection ==MDCSwipeDirection.Left {println("Photo deleted!")}else{println("Photo saved!")}}

If you're using Cocoapods 0.36+ (perhaps because you want to include pods that contain Swift code) and you've included the use_frameworks! directive in your Podfile, then you've converted all your pods (including MDCSwipeToChoose) into frameworks. Therefore, you'll need to include the line

import MDCSwipeToChoose

...in your Swift files (even if you're using a bridging header).

More Generic Swiping

You don't have to use a subclass of MDCChooseView. You can use the mdc_swipeToChooseSetup: method on any UIView to enable swipe-to-choose.

In the following example, we adjust the opacity of a UIWebView when it's panned left and right.

#import<MDCSwipeToChoose/MDCSwipeToChoose.h>// ... in a view controller
- (void)viewDidLoad {
[superviewDidLoad];
MDCSwipeOptions *options = [MDCSwipeOptions new];
options.delegate = self;
options.onPan = ^(MDCPanState *state){
switch (state.direction) {
case MDCSwipeDirectionLeft:
self.webView.alpha = 0.5f - state.thresholdRatio;
break;
case MDCSwipeDirectionRight:
self.webView.alpha = 0.5f + state.thresholdRatio;
break;
case MDCSwipeDirectionNone:
self.webView.alpha = 0.5f;
break;
}
};
[self.webView mdc_swipeToChooseSetup:options];
}

##Swiping in Swift

The following is an example of how you can use MDCSwipeToChooseView to display a photo in swift. The user can choose to delete it by swiping left, or save it by swiping right.

First you must create a BridgingHeader.h file

#ifndef ProjectName_BridgingHeader_h
#defineProjectName_BridgingHeader_h
#import<UIKit/UIKit.h>
#import<MDCSwipeToChoose/MDCSwipeToChoose.h>
#endif

You must then add the bridging header file to the project by navigating to Build Settings then searching for 'Bridging Header'. Double click the field and type: ProjectName/BridgingHeader.h as the value

// Creating and Customizing a MDCSwipeToChooseView
overridefunc viewDidLoad(){
super.viewDidLoad()
// You can customize MDCSwipeToChooseView using MDCSwipeToChooseViewOptions.
varoptions:MDCSwipeToChooseViewOptions=MDCSwipeToChooseViewOptions()
options.delegate =self
options.likedText ="Keep"
options.likedColor =[UIColor blueColor]
options.nopeText ="Delete"
options.onPan ={ state ->Voidinif(state.thresholdRatio ==1.0 && state.direction ==MDCSwipeDirection.Left){Println("Let go now to delete the photo!")}}varview:MDCSwipeToChooseView=MDCSwipeToChooseView(frame:self.view.bounds, options:options)
view.imageView.image =UIImage(named:"photo")self.view.addSubview(view)}
// MDCSwipeToChooseDelegate Callbacks
// This is called when a user didn't fully swipe left or right.
func viewDidCancelSwipe(view:UIView)->Void{Println("Couldn't decide, huh?")}
// Sent before a choice is made. Cancel the choice by returning `NO`. Otherwise return `YES`.
func view(view:UIView, shouldBeChosenWithDirection:MDCSwipeDirection)->BOOL{if(shouldBeChosenWithDirection ==MDCSwipeDirection.Left){return YES;
}else{
// Snap the view back and cancel the choice.
UIView.animateWithDuration(0.16, animations:{
view.transform = CGAffineTransformIdentity
view.center =self.superview.center
}return NO;
}}
// This is called then a user swipes the view fully left or right.
func view(view:UIView, wasChosenWithDirection:MDCSwipeDirection)->Void{if(wasChosenWithDirection ==MDCSwipeDirection.Left){Println("Photo deleted!");
}else{Println("Photo saved!");
}}

As of version 0.2.0, you may also swipe a view programmatically:

self.swipeToChooseView(mdc_swipe:MDCSwipeDirection.Left)

License

All the source code is distributed under the MIT license. See the LICENSE file for details. The license does not apply to the images used in the sample apps.

About

Swipe to "like" or "dislike" any view, just like Tinder.app. Build a flashcard app, a photo viewer, and more, in minutes, not hours!

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' GitHub - alienbat/MDCSwipeToChoose: Swipe to "like" or "dislike" any view, just like Tinder.app. Build a flashcard app, a photo viewer, and more, in minutes, not hours! · GitHub
Skip to content

Repository files navigation

MDCSwipeToChoose

Build Status

Swipe to "like" or "dislike" any view, just like Tinder.app. Build a flashcard app, a photo viewer, and more, in minutes, not hours!

  • Use UIView+MDCSwipeToChoose to add a swipe gesture and callbacks to any UIView.
  • Use MDCSwipeToChooseView to get a UI nearly identical to Tinder.app in just a few lines of code.

You may view slides on some the architecture decisions that went into this library here.

How to Install via CocoaPods

Place the following in your Podfile and run pod install:

pod "MDCSwipeToChoose"

How to Use

Check out the sample app for an example of how to use MDCSwipeToChooseView to build the UI in the GIF above.

NOTE: You must run pod install in the Examples/LikedOrNope directory before building the example app.

Every public class contains documentation in its header file.

Swiping Yes/No

The following is an example of how you can use MDCSwipeToChooseView to display a photo. The user can choose to delete it by swiping left, or save it by swiping right.

Objective-C

#import<MDCSwipeToChoose/MDCSwipeToChoose.h>// ... in a view controller
#pragma mark - Creating and Customizing a MDCSwipeToChooseView
- (void)viewDidLoad {
[superviewDidLoad];
// You can customize MDCSwipeToChooseView using MDCSwipeToChooseViewOptions.
MDCSwipeToChooseViewOptions *options = [MDCSwipeToChooseViewOptions new];
options.delegate = self;
options.likedText = @"Keep";
options.likedColor = [UIColor blueColor];
options.nopeText = @"Delete";
options.onPan = ^(MDCPanState *state){
if (state.thresholdRatio == 1.f && state.direction == MDCSwipeDirectionLeft) {
NSLog(@"Let go now to delete the photo!");
}
};
MDCSwipeToChooseView *view = [[MDCSwipeToChooseView alloc] initWithFrame:self.view.bounds
options:options];
view.imageView.image = [UIImage imageNamed:@"photo"];
[self.view addSubview:view];
}
#pragma mark - MDCSwipeToChooseDelegate Callbacks
// This is called when a user didn't fully swipe left or right.
- (void)viewDidCancelSwipe:(UIView *)view {
NSLog(@"Couldn't decide, huh?");
}
// Sent before a choice is made. Cancel the choice by returning `NO`. Otherwise return `YES`.
- (BOOL)view:(UIView *)view shouldBeChosenWithDirection:(MDCSwipeDirection)direction {
if (direction == MDCSwipeDirectionLeft) {
returnYES;
} else {
// Snap the view back and cancel the choice.
[UIView animateWithDuration:0.16animations:^{
view.transform = CGAffineTransformIdentity;
view.center = [view superview].center;
}];
returnNO;
}
}
// This is called then a user swipes the view fully left or right.
- (void)view:(UIView *)view wasChosenWithDirection:(MDCSwipeDirection)direction {
if (direction == MDCSwipeDirectionLeft) {
NSLog(@"Photo deleted!");
} else {
NSLog(@"Photo saved!");
}
}

As of version 0.2.0, you may also swipe a view programmatically:

[self.swipeToChooseView mdc_swipe:MDCSwipeDirectionLeft];

Swift

To use objective-c code from swift, you need to use bridging-header.

#ifndef BridgingHeader_h
#define BridgingHeader_h
#import <UIKit/UIKit.h>
#import <MDCSwipeToChoose/MDCSwipeToChoose.h>
#endif
import UIKit
// ... in a view controller
overridefunc viewDidLoad(){
super.viewDidLoad()varoptions=MDCSwipeToChooseViewOptions()
options.delegate =self
options.likedText ="Keep"
options.likedColor =UIColor.blueColor()
options.nopeText ="Delete"
options.onPan ={ state ->Voidinif state.thresholdRatio ==1 && state.direction ==MDCSwipeDirection.Left {println("Photo deleted!")}}varview=MDCSwipeToChooseView(frame:self.view.bounds, options: options)
view.imageView.image =UIImage(named:"photo.png")self.view.addSubview(view)}overridefunc didReceiveMemoryWarning(){
super.didReceiveMemoryWarning()}
// This is called when a user didn't fully swipe left or right.
func viewDidCancelSwipe(view:UIView)->Void{println("Couldn't decide, huh?")}
// Sent before a choice is made. Cancel the choice by returning `false`. Otherwise return `true`.
func view(view:UIView, shouldBeChosenWithDirection:MDCSwipeDirection)->Bool{if(shouldBeChosenWithDirection ==MDCSwipeDirection.Left){returntrue;
}else{
// Snap the view back and cancel the choice.
UIView.animateWithDuration(0.16, animations:{()->Voidin
view.transform = CGAffineTransformIdentity
view.center = view.superview!.center
})returnfalse;
}}
// This is called then a user swipes the view fully left or right.
func view(view:UIView, wasChosenWithDirection:MDCSwipeDirection)->Void{if wasChosenWithDirection ==MDCSwipeDirection.Left {println("Photo deleted!")}else{println("Photo saved!")}}

If you're using Cocoapods 0.36+ (perhaps because you want to include pods that contain Swift code) and you've included the use_frameworks! directive in your Podfile, then you've converted all your pods (including MDCSwipeToChoose) into frameworks. Therefore, you'll need to include the line

import MDCSwipeToChoose

...in your Swift files (even if you're using a bridging header).

More Generic Swiping

You don't have to use a subclass of MDCChooseView. You can use the mdc_swipeToChooseSetup: method on any UIView to enable swipe-to-choose.

In the following example, we adjust the opacity of a UIWebView when it's panned left and right.

#import<MDCSwipeToChoose/MDCSwipeToChoose.h>// ... in a view controller
- (void)viewDidLoad {
[superviewDidLoad];
MDCSwipeOptions *options = [MDCSwipeOptions new];
options.delegate = self;
options.onPan = ^(MDCPanState *state){
switch (state.direction) {
case MDCSwipeDirectionLeft:
self.webView.alpha = 0.5f - state.thresholdRatio;
break;
case MDCSwipeDirectionRight:
self.webView.alpha = 0.5f + state.thresholdRatio;
break;
case MDCSwipeDirectionNone:
self.webView.alpha = 0.5f;
break;
}
};
[self.webView mdc_swipeToChooseSetup:options];
}

##Swiping in Swift

The following is an example of how you can use MDCSwipeToChooseView to display a photo in swift. The user can choose to delete it by swiping left, or save it by swiping right.

First you must create a BridgingHeader.h file

#ifndef ProjectName_BridgingHeader_h
#defineProjectName_BridgingHeader_h
#import<UIKit/UIKit.h>
#import<MDCSwipeToChoose/MDCSwipeToChoose.h>
#endif

You must then add the bridging header file to the project by navigating to Build Settings then searching for 'Bridging Header'. Double click the field and type: ProjectName/BridgingHeader.h as the value

// Creating and Customizing a MDCSwipeToChooseView
overridefunc viewDidLoad(){
super.viewDidLoad()
// You can customize MDCSwipeToChooseView using MDCSwipeToChooseViewOptions.
varoptions:MDCSwipeToChooseViewOptions=MDCSwipeToChooseViewOptions()
options.delegate =self
options.likedText ="Keep"
options.likedColor =[UIColor blueColor]
options.nopeText ="Delete"
options.onPan ={ state ->Voidinif(state.thresholdRatio ==1.0 && state.direction ==MDCSwipeDirection.Left){Println("Let go now to delete the photo!")}}varview:MDCSwipeToChooseView=MDCSwipeToChooseView(frame:self.view.bounds, options:options)
view.imageView.image =UIImage(named:"photo")self.view.addSubview(view)}
// MDCSwipeToChooseDelegate Callbacks
// This is called when a user didn't fully swipe left or right.
func viewDidCancelSwipe(view:UIView)->Void{Println("Couldn't decide, huh?")}
// Sent before a choice is made. Cancel the choice by returning `NO`. Otherwise return `YES`.
func view(view:UIView, shouldBeChosenWithDirection:MDCSwipeDirection)->BOOL{if(shouldBeChosenWithDirection ==MDCSwipeDirection.Left){return YES;
}else{
// Snap the view back and cancel the choice.
UIView.animateWithDuration(0.16, animations:{
view.transform = CGAffineTransformIdentity
view.center =self.superview.center
}return NO;
}}
// This is called then a user swipes the view fully left or right.
func view(view:UIView, wasChosenWithDirection:MDCSwipeDirection)->Void{if(wasChosenWithDirection ==MDCSwipeDirection.Left){Println("Photo deleted!");
}else{Println("Photo saved!");
}}

As of version 0.2.0, you may also swipe a view programmatically:

self.swipeToChooseView(mdc_swipe:MDCSwipeDirection.Left)

License

All the source code is distributed under the MIT license. See the LICENSE file for details. The license does not apply to the images used in the sample apps.

About

Swipe to "like" or "dislike" any view, just like Tinder.app. Build a flashcard app, a photo viewer, and more, in minutes, not hours!

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - alienbat/MDCSwipeToChoose: Swipe to "like" or "dislike" any view, just like Tinder.app. Build a flashcard app, a photo viewer, and more, in minutes, not hours! · GitHub
Skip to content

Repository files navigation

MDCSwipeToChoose

Build Status

Swipe to "like" or "dislike" any view, just like Tinder.app. Build a flashcard app, a photo viewer, and more, in minutes, not hours!

  • Use UIView+MDCSwipeToChoose to add a swipe gesture and callbacks to any UIView.
  • Use MDCSwipeToChooseView to get a UI nearly identical to Tinder.app in just a few lines of code.

You may view slides on some the architecture decisions that went into this library here.

How to Install via CocoaPods

Place the following in your Podfile and run pod install:

pod "MDCSwipeToChoose"

How to Use

Check out the sample app for an example of how to use MDCSwipeToChooseView to build the UI in the GIF above.

NOTE: You must run pod install in the Examples/LikedOrNope directory before building the example app.

Every public class contains documentation in its header file.

Swiping Yes/No

The following is an example of how you can use MDCSwipeToChooseView to display a photo. The user can choose to delete it by swiping left, or save it by swiping right.

Objective-C

#import<MDCSwipeToChoose/MDCSwipeToChoose.h>// ... in a view controller
#pragma mark - Creating and Customizing a MDCSwipeToChooseView
- (void)viewDidLoad {
[superviewDidLoad];
// You can customize MDCSwipeToChooseView using MDCSwipeToChooseViewOptions.
MDCSwipeToChooseViewOptions *options = [MDCSwipeToChooseViewOptions new];
options.delegate = self;
options.likedText = @"Keep";
options.likedColor = [UIColor blueColor];
options.nopeText = @"Delete";
options.onPan = ^(MDCPanState *state){
if (state.thresholdRatio == 1.f && state.direction == MDCSwipeDirectionLeft) {
NSLog(@"Let go now to delete the photo!");
}
};
MDCSwipeToChooseView *view = [[MDCSwipeToChooseView alloc] initWithFrame:self.view.bounds
options:options];
view.imageView.image = [UIImage imageNamed:@"photo"];
[self.view addSubview:view];
}
#pragma mark - MDCSwipeToChooseDelegate Callbacks
// This is called when a user didn't fully swipe left or right.
- (void)viewDidCancelSwipe:(UIView *)view {
NSLog(@"Couldn't decide, huh?");
}
// Sent before a choice is made. Cancel the choice by returning `NO`. Otherwise return `YES`.
- (BOOL)view:(UIView *)view shouldBeChosenWithDirection:(MDCSwipeDirection)direction {
if (direction == MDCSwipeDirectionLeft) {
returnYES;
} else {
// Snap the view back and cancel the choice.
[UIView animateWithDuration:0.16animations:^{
view.transform = CGAffineTransformIdentity;
view.center = [view superview].center;
}];
returnNO;
}
}
// This is called then a user swipes the view fully left or right.
- (void)view:(UIView *)view wasChosenWithDirection:(MDCSwipeDirection)direction {
if (direction == MDCSwipeDirectionLeft) {
NSLog(@"Photo deleted!");
} else {
NSLog(@"Photo saved!");
}
}

As of version 0.2.0, you may also swipe a view programmatically:

[self.swipeToChooseView mdc_swipe:MDCSwipeDirectionLeft];

Swift

To use objective-c code from swift, you need to use bridging-header.

#ifndef BridgingHeader_h
#define BridgingHeader_h
#import <UIKit/UIKit.h>
#import <MDCSwipeToChoose/MDCSwipeToChoose.h>
#endif
import UIKit
// ... in a view controller
overridefunc viewDidLoad(){
super.viewDidLoad()varoptions=MDCSwipeToChooseViewOptions()
options.delegate =self
options.likedText ="Keep"
options.likedColor =UIColor.blueColor()
options.nopeText ="Delete"
options.onPan ={ state ->Voidinif state.thresholdRatio ==1 && state.direction ==MDCSwipeDirection.Left {println("Photo deleted!")}}varview=MDCSwipeToChooseView(frame:self.view.bounds, options: options)
view.imageView.image =UIImage(named:"photo.png")self.view.addSubview(view)}overridefunc didReceiveMemoryWarning(){
super.didReceiveMemoryWarning()}
// This is called when a user didn't fully swipe left or right.
func viewDidCancelSwipe(view:UIView)->Void{println("Couldn't decide, huh?")}
// Sent before a choice is made. Cancel the choice by returning `false`. Otherwise return `true`.
func view(view:UIView, shouldBeChosenWithDirection:MDCSwipeDirection)->Bool{if(shouldBeChosenWithDirection ==MDCSwipeDirection.Left){returntrue;
}else{
// Snap the view back and cancel the choice.
UIView.animateWithDuration(0.16, animations:{()->Voidin
view.transform = CGAffineTransformIdentity
view.center = view.superview!.center
})returnfalse;
}}
// This is called then a user swipes the view fully left or right.
func view(view:UIView, wasChosenWithDirection:MDCSwipeDirection)->Void{if wasChosenWithDirection ==MDCSwipeDirection.Left {println("Photo deleted!")}else{println("Photo saved!")}}

If you're using Cocoapods 0.36+ (perhaps because you want to include pods that contain Swift code) and you've included the use_frameworks! directive in your Podfile, then you've converted all your pods (including MDCSwipeToChoose) into frameworks. Therefore, you'll need to include the line

import MDCSwipeToChoose

...in your Swift files (even if you're using a bridging header).

More Generic Swiping

You don't have to use a subclass of MDCChooseView. You can use the mdc_swipeToChooseSetup: method on any UIView to enable swipe-to-choose.

In the following example, we adjust the opacity of a UIWebView when it's panned left and right.

#import<MDCSwipeToChoose/MDCSwipeToChoose.h>// ... in a view controller
- (void)viewDidLoad {
[superviewDidLoad];
MDCSwipeOptions *options = [MDCSwipeOptions new];
options.delegate = self;
options.onPan = ^(MDCPanState *state){
switch (state.direction) {
case MDCSwipeDirectionLeft:
self.webView.alpha = 0.5f - state.thresholdRatio;
break;
case MDCSwipeDirectionRight:
self.webView.alpha = 0.5f + state.thresholdRatio;
break;
case MDCSwipeDirectionNone:
self.webView.alpha = 0.5f;
break;
}
};
[self.webView mdc_swipeToChooseSetup:options];
}

##Swiping in Swift

The following is an example of how you can use MDCSwipeToChooseView to display a photo in swift. The user can choose to delete it by swiping left, or save it by swiping right.

First you must create a BridgingHeader.h file

#ifndef ProjectName_BridgingHeader_h
#defineProjectName_BridgingHeader_h
#import<UIKit/UIKit.h>
#import<MDCSwipeToChoose/MDCSwipeToChoose.h>
#endif

You must then add the bridging header file to the project by navigating to Build Settings then searching for 'Bridging Header'. Double click the field and type: ProjectName/BridgingHeader.h as the value

// Creating and Customizing a MDCSwipeToChooseView
overridefunc viewDidLoad(){
super.viewDidLoad()
// You can customize MDCSwipeToChooseView using MDCSwipeToChooseViewOptions.
varoptions:MDCSwipeToChooseViewOptions=MDCSwipeToChooseViewOptions()
options.delegate =self
options.likedText ="Keep"
options.likedColor =[UIColor blueColor]
options.nopeText ="Delete"
options.onPan ={ state ->Voidinif(state.thresholdRatio ==1.0 && state.direction ==MDCSwipeDirection.Left){Println("Let go now to delete the photo!")}}varview:MDCSwipeToChooseView=MDCSwipeToChooseView(frame:self.view.bounds, options:options)
view.imageView.image =UIImage(named:"photo")self.view.addSubview(view)}
// MDCSwipeToChooseDelegate Callbacks
// This is called when a user didn't fully swipe left or right.
func viewDidCancelSwipe(view:UIView)->Void{Println("Couldn't decide, huh?")}
// Sent before a choice is made. Cancel the choice by returning `NO`. Otherwise return `YES`.
func view(view:UIView, shouldBeChosenWithDirection:MDCSwipeDirection)->BOOL{if(shouldBeChosenWithDirection ==MDCSwipeDirection.Left){return YES;
}else{
// Snap the view back and cancel the choice.
UIView.animateWithDuration(0.16, animations:{
view.transform = CGAffineTransformIdentity
view.center =self.superview.center
}return NO;
}}
// This is called then a user swipes the view fully left or right.
func view(view:UIView, wasChosenWithDirection:MDCSwipeDirection)->Void{if(wasChosenWithDirection ==MDCSwipeDirection.Left){Println("Photo deleted!");
}else{Println("Photo saved!");
}}

As of version 0.2.0, you may also swipe a view programmatically:

self.swipeToChooseView(mdc_swipe:MDCSwipeDirection.Left)

License

All the source code is distributed under the MIT license. See the LICENSE file for details. The license does not apply to the images used in the sample apps.

About

Swipe to "like" or "dislike" any view, just like Tinder.app. Build a flashcard app, a photo viewer, and more, in minutes, not hours!

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - alienbat/MDCSwipeToChoose: Swipe to "like" or "dislike" any view, just like Tinder.app. Build a flashcard app, a photo viewer, and more, in minutes, not hours! · GitHub
Skip to content

Repository files navigation

MDCSwipeToChoose

Build Status

Swipe to "like" or "dislike" any view, just like Tinder.app. Build a flashcard app, a photo viewer, and more, in minutes, not hours!

  • Use UIView+MDCSwipeToChoose to add a swipe gesture and callbacks to any UIView.
  • Use MDCSwipeToChooseView to get a UI nearly identical to Tinder.app in just a few lines of code.

You may view slides on some the architecture decisions that went into this library here.

How to Install via CocoaPods

Place the following in your Podfile and run pod install:

pod "MDCSwipeToChoose"

How to Use

Check out the sample app for an example of how to use MDCSwipeToChooseView to build the UI in the GIF above.

NOTE: You must run pod install in the Examples/LikedOrNope directory before building the example app.

Every public class contains documentation in its header file.

Swiping Yes/No

The following is an example of how you can use MDCSwipeToChooseView to display a photo. The user can choose to delete it by swiping left, or save it by swiping right.

Objective-C

#import<MDCSwipeToChoose/MDCSwipeToChoose.h>// ... in a view controller
#pragma mark - Creating and Customizing a MDCSwipeToChooseView
- (void)viewDidLoad {
[superviewDidLoad];
// You can customize MDCSwipeToChooseView using MDCSwipeToChooseViewOptions.
MDCSwipeToChooseViewOptions *options = [MDCSwipeToChooseViewOptions new];
options.delegate = self;
options.likedText = @"Keep";
options.likedColor = [UIColor blueColor];
options.nopeText = @"Delete";
options.onPan = ^(MDCPanState *state){
if (state.thresholdRatio == 1.f && state.direction == MDCSwipeDirectionLeft) {
NSLog(@"Let go now to delete the photo!");
}
};
MDCSwipeToChooseView *view = [[MDCSwipeToChooseView alloc] initWithFrame:self.view.bounds
options:options];
view.imageView.image = [UIImage imageNamed:@"photo"];
[self.view addSubview:view];
}
#pragma mark - MDCSwipeToChooseDelegate Callbacks
// This is called when a user didn't fully swipe left or right.
- (void)viewDidCancelSwipe:(UIView *)view {
NSLog(@"Couldn't decide, huh?");
}
// Sent before a choice is made. Cancel the choice by returning `NO`. Otherwise return `YES`.
- (BOOL)view:(UIView *)view shouldBeChosenWithDirection:(MDCSwipeDirection)direction {
if (direction == MDCSwipeDirectionLeft) {
returnYES;
} else {
// Snap the view back and cancel the choice.
[UIView animateWithDuration:0.16animations:^{
view.transform = CGAffineTransformIdentity;
view.center = [view superview].center;
}];
returnNO;
}
}
// This is called then a user swipes the view fully left or right.
- (void)view:(UIView *)view wasChosenWithDirection:(MDCSwipeDirection)direction {
if (direction == MDCSwipeDirectionLeft) {
NSLog(@"Photo deleted!");
} else {
NSLog(@"Photo saved!");
}
}

As of version 0.2.0, you may also swipe a view programmatically:

[self.swipeToChooseView mdc_swipe:MDCSwipeDirectionLeft];

Swift

To use objective-c code from swift, you need to use bridging-header.

#ifndef BridgingHeader_h
#define BridgingHeader_h
#import <UIKit/UIKit.h>
#import <MDCSwipeToChoose/MDCSwipeToChoose.h>
#endif
import UIKit
// ... in a view controller
overridefunc viewDidLoad(){
super.viewDidLoad()varoptions=MDCSwipeToChooseViewOptions()
options.delegate =self
options.likedText ="Keep"
options.likedColor =UIColor.blueColor()
options.nopeText ="Delete"
options.onPan ={ state ->Voidinif state.thresholdRatio ==1 && state.direction ==MDCSwipeDirection.Left {println("Photo deleted!")}}varview=MDCSwipeToChooseView(frame:self.view.bounds, options: options)
view.imageView.image =UIImage(named:"photo.png")self.view.addSubview(view)}overridefunc didReceiveMemoryWarning(){
super.didReceiveMemoryWarning()}
// This is called when a user didn't fully swipe left or right.
func viewDidCancelSwipe(view:UIView)->Void{println("Couldn't decide, huh?")}
// Sent before a choice is made. Cancel the choice by returning `false`. Otherwise return `true`.
func view(view:UIView, shouldBeChosenWithDirection:MDCSwipeDirection)->Bool{if(shouldBeChosenWithDirection ==MDCSwipeDirection.Left){returntrue;
}else{
// Snap the view back and cancel the choice.
UIView.animateWithDuration(0.16, animations:{()->Voidin
view.transform = CGAffineTransformIdentity
view.center = view.superview!.center
})returnfalse;
}}
// This is called then a user swipes the view fully left or right.
func view(view:UIView, wasChosenWithDirection:MDCSwipeDirection)->Void{if wasChosenWithDirection ==MDCSwipeDirection.Left {println("Photo deleted!")}else{println("Photo saved!")}}

If you're using Cocoapods 0.36+ (perhaps because you want to include pods that contain Swift code) and you've included the use_frameworks! directive in your Podfile, then you've converted all your pods (including MDCSwipeToChoose) into frameworks. Therefore, you'll need to include the line

import MDCSwipeToChoose

...in your Swift files (even if you're using a bridging header).

More Generic Swiping

You don't have to use a subclass of MDCChooseView. You can use the mdc_swipeToChooseSetup: method on any UIView to enable swipe-to-choose.

In the following example, we adjust the opacity of a UIWebView when it's panned left and right.

#import<MDCSwipeToChoose/MDCSwipeToChoose.h>// ... in a view controller
- (void)viewDidLoad {
[superviewDidLoad];
MDCSwipeOptions *options = [MDCSwipeOptions new];
options.delegate = self;
options.onPan = ^(MDCPanState *state){
switch (state.direction) {
case MDCSwipeDirectionLeft:
self.webView.alpha = 0.5f - state.thresholdRatio;
break;
case MDCSwipeDirectionRight:
self.webView.alpha = 0.5f + state.thresholdRatio;
break;
case MDCSwipeDirectionNone:
self.webView.alpha = 0.5f;
break;
}
};
[self.webView mdc_swipeToChooseSetup:options];
}

##Swiping in Swift

The following is an example of how you can use MDCSwipeToChooseView to display a photo in swift. The user can choose to delete it by swiping left, or save it by swiping right.

First you must create a BridgingHeader.h file

#ifndef ProjectName_BridgingHeader_h
#defineProjectName_BridgingHeader_h
#import<UIKit/UIKit.h>
#import<MDCSwipeToChoose/MDCSwipeToChoose.h>
#endif

You must then add the bridging header file to the project by navigating to Build Settings then searching for 'Bridging Header'. Double click the field and type: ProjectName/BridgingHeader.h as the value

// Creating and Customizing a MDCSwipeToChooseView
overridefunc viewDidLoad(){
super.viewDidLoad()
// You can customize MDCSwipeToChooseView using MDCSwipeToChooseViewOptions.
varoptions:MDCSwipeToChooseViewOptions=MDCSwipeToChooseViewOptions()
options.delegate =self
options.likedText ="Keep"
options.likedColor =[UIColor blueColor]
options.nopeText ="Delete"
options.onPan ={ state ->Voidinif(state.thresholdRatio ==1.0 && state.direction ==MDCSwipeDirection.Left){Println("Let go now to delete the photo!")}}varview:MDCSwipeToChooseView=MDCSwipeToChooseView(frame:self.view.bounds, options:options)
view.imageView.image =UIImage(named:"photo")self.view.addSubview(view)}
// MDCSwipeToChooseDelegate Callbacks
// This is called when a user didn't fully swipe left or right.
func viewDidCancelSwipe(view:UIView)->Void{Println("Couldn't decide, huh?")}
// Sent before a choice is made. Cancel the choice by returning `NO`. Otherwise return `YES`.
func view(view:UIView, shouldBeChosenWithDirection:MDCSwipeDirection)->BOOL{if(shouldBeChosenWithDirection ==MDCSwipeDirection.Left){return YES;
}else{
// Snap the view back and cancel the choice.
UIView.animateWithDuration(0.16, animations:{
view.transform = CGAffineTransformIdentity
view.center =self.superview.center
}return NO;
}}
// This is called then a user swipes the view fully left or right.
func view(view:UIView, wasChosenWithDirection:MDCSwipeDirection)->Void{if(wasChosenWithDirection ==MDCSwipeDirection.Left){Println("Photo deleted!");
}else{Println("Photo saved!");
}}

As of version 0.2.0, you may also swipe a view programmatically:

self.swipeToChooseView(mdc_swipe:MDCSwipeDirection.Left)

License

All the source code is distributed under the MIT license. See the LICENSE file for details. The license does not apply to the images used in the sample apps.

About

Swipe to "like" or "dislike" any view, just like Tinder.app. Build a flashcard app, a photo viewer, and more, in minutes, not hours!

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); GitHub - alienbat/MDCSwipeToChoose: Swipe to "like" or "dislike" any view, just like Tinder.app. Build a flashcard app, a photo viewer, and more, in minutes, not hours! · GitHub
Skip to content

Repository files navigation

MDCSwipeToChoose

Build Status

Swipe to "like" or "dislike" any view, just like Tinder.app. Build a flashcard app, a photo viewer, and more, in minutes, not hours!

  • Use UIView+MDCSwipeToChoose to add a swipe gesture and callbacks to any UIView.
  • Use MDCSwipeToChooseView to get a UI nearly identical to Tinder.app in just a few lines of code.

You may view slides on some the architecture decisions that went into this library here.

How to Install via CocoaPods

Place the following in your Podfile and run pod install:

pod "MDCSwipeToChoose"

How to Use

Check out the sample app for an example of how to use MDCSwipeToChooseView to build the UI in the GIF above.

NOTE: You must run pod install in the Examples/LikedOrNope directory before building the example app.

Every public class contains documentation in its header file.

Swiping Yes/No

The following is an example of how you can use MDCSwipeToChooseView to display a photo. The user can choose to delete it by swiping left, or save it by swiping right.

Objective-C

#import<MDCSwipeToChoose/MDCSwipeToChoose.h>// ... in a view controller
#pragma mark - Creating and Customizing a MDCSwipeToChooseView
- (void)viewDidLoad {
[superviewDidLoad];
// You can customize MDCSwipeToChooseView using MDCSwipeToChooseViewOptions.
MDCSwipeToChooseViewOptions *options = [MDCSwipeToChooseViewOptions new];
options.delegate = self;
options.likedText = @"Keep";
options.likedColor = [UIColor blueColor];
options.nopeText = @"Delete";
options.onPan = ^(MDCPanState *state){
if (state.thresholdRatio == 1.f && state.direction == MDCSwipeDirectionLeft) {
NSLog(@"Let go now to delete the photo!");
}
};
MDCSwipeToChooseView *view = [[MDCSwipeToChooseView alloc] initWithFrame:self.view.bounds
options:options];
view.imageView.image = [UIImage imageNamed:@"photo"];
[self.view addSubview:view];
}
#pragma mark - MDCSwipeToChooseDelegate Callbacks
// This is called when a user didn't fully swipe left or right.
- (void)viewDidCancelSwipe:(UIView *)view {
NSLog(@"Couldn't decide, huh?");
}
// Sent before a choice is made. Cancel the choice by returning `NO`. Otherwise return `YES`.
- (BOOL)view:(UIView *)view shouldBeChosenWithDirection:(MDCSwipeDirection)direction {
if (direction == MDCSwipeDirectionLeft) {
returnYES;
} else {
// Snap the view back and cancel the choice.
[UIView animateWithDuration:0.16animations:^{
view.transform = CGAffineTransformIdentity;
view.center = [view superview].center;
}];
returnNO;
}
}
// This is called then a user swipes the view fully left or right.
- (void)view:(UIView *)view wasChosenWithDirection:(MDCSwipeDirection)direction {
if (direction == MDCSwipeDirectionLeft) {
NSLog(@"Photo deleted!");
} else {
NSLog(@"Photo saved!");
}
}

As of version 0.2.0, you may also swipe a view programmatically:

[self.swipeToChooseView mdc_swipe:MDCSwipeDirectionLeft];

Swift

To use objective-c code from swift, you need to use bridging-header.

#ifndef BridgingHeader_h
#define BridgingHeader_h
#import <UIKit/UIKit.h>
#import <MDCSwipeToChoose/MDCSwipeToChoose.h>
#endif
import UIKit
// ... in a view controller
overridefunc viewDidLoad(){
super.viewDidLoad()varoptions=MDCSwipeToChooseViewOptions()
options.delegate =self
options.likedText ="Keep"
options.likedColor =UIColor.blueColor()
options.nopeText ="Delete"
options.onPan ={ state ->Voidinif state.thresholdRatio ==1 && state.direction ==MDCSwipeDirection.Left {println("Photo deleted!")}}varview=MDCSwipeToChooseView(frame:self.view.bounds, options: options)
view.imageView.image =UIImage(named:"photo.png")self.view.addSubview(view)}overridefunc didReceiveMemoryWarning(){
super.didReceiveMemoryWarning()}
// This is called when a user didn't fully swipe left or right.
func viewDidCancelSwipe(view:UIView)->Void{println("Couldn't decide, huh?")}
// Sent before a choice is made. Cancel the choice by returning `false`. Otherwise return `true`.
func view(view:UIView, shouldBeChosenWithDirection:MDCSwipeDirection)->Bool{if(shouldBeChosenWithDirection ==MDCSwipeDirection.Left){returntrue;
}else{
// Snap the view back and cancel the choice.
UIView.animateWithDuration(0.16, animations:{()->Voidin
view.transform = CGAffineTransformIdentity
view.center = view.superview!.center
})returnfalse;
}}
// This is called then a user swipes the view fully left or right.
func view(view:UIView, wasChosenWithDirection:MDCSwipeDirection)->Void{if wasChosenWithDirection ==MDCSwipeDirection.Left {println("Photo deleted!")}else{println("Photo saved!")}}

If you're using Cocoapods 0.36+ (perhaps because you want to include pods that contain Swift code) and you've included the use_frameworks! directive in your Podfile, then you've converted all your pods (including MDCSwipeToChoose) into frameworks. Therefore, you'll need to include the line

import MDCSwipeToChoose

...in your Swift files (even if you're using a bridging header).

More Generic Swiping

You don't have to use a subclass of MDCChooseView. You can use the mdc_swipeToChooseSetup: method on any UIView to enable swipe-to-choose.

In the following example, we adjust the opacity of a UIWebView when it's panned left and right.

#import<MDCSwipeToChoose/MDCSwipeToChoose.h>// ... in a view controller
- (void)viewDidLoad {
[superviewDidLoad];
MDCSwipeOptions *options = [MDCSwipeOptions new];
options.delegate = self;
options.onPan = ^(MDCPanState *state){
switch (state.direction) {
case MDCSwipeDirectionLeft:
self.webView.alpha = 0.5f - state.thresholdRatio;
break;
case MDCSwipeDirectionRight:
self.webView.alpha = 0.5f + state.thresholdRatio;
break;
case MDCSwipeDirectionNone:
self.webView.alpha = 0.5f;
break;
}
};
[self.webView mdc_swipeToChooseSetup:options];
}

##Swiping in Swift

The following is an example of how you can use MDCSwipeToChooseView to display a photo in swift. The user can choose to delete it by swiping left, or save it by swiping right.

First you must create a BridgingHeader.h file

#ifndef ProjectName_BridgingHeader_h
#defineProjectName_BridgingHeader_h
#import<UIKit/UIKit.h>
#import<MDCSwipeToChoose/MDCSwipeToChoose.h>
#endif

You must then add the bridging header file to the project by navigating to Build Settings then searching for 'Bridging Header'. Double click the field and type: ProjectName/BridgingHeader.h as the value

// Creating and Customizing a MDCSwipeToChooseView
overridefunc viewDidLoad(){
super.viewDidLoad()
// You can customize MDCSwipeToChooseView using MDCSwipeToChooseViewOptions.
varoptions:MDCSwipeToChooseViewOptions=MDCSwipeToChooseViewOptions()
options.delegate =self
options.likedText ="Keep"
options.likedColor =[UIColor blueColor]
options.nopeText ="Delete"
options.onPan ={ state ->Voidinif(state.thresholdRatio ==1.0 && state.direction ==MDCSwipeDirection.Left){Println("Let go now to delete the photo!")}}varview:MDCSwipeToChooseView=MDCSwipeToChooseView(frame:self.view.bounds, options:options)
view.imageView.image =UIImage(named:"photo")self.view.addSubview(view)}
// MDCSwipeToChooseDelegate Callbacks
// This is called when a user didn't fully swipe left or right.
func viewDidCancelSwipe(view:UIView)->Void{Println("Couldn't decide, huh?")}
// Sent before a choice is made. Cancel the choice by returning `NO`. Otherwise return `YES`.
func view(view:UIView, shouldBeChosenWithDirection:MDCSwipeDirection)->BOOL{if(shouldBeChosenWithDirection ==MDCSwipeDirection.Left){return YES;
}else{
// Snap the view back and cancel the choice.
UIView.animateWithDuration(0.16, animations:{
view.transform = CGAffineTransformIdentity
view.center =self.superview.center
}return NO;
}}
// This is called then a user swipes the view fully left or right.
func view(view:UIView, wasChosenWithDirection:MDCSwipeDirection)->Void{if(wasChosenWithDirection ==MDCSwipeDirection.Left){Println("Photo deleted!");
}else{Println("Photo saved!");
}}

As of version 0.2.0, you may also swipe a view programmatically:

self.swipeToChooseView(mdc_swipe:MDCSwipeDirection.Left)

License

All the source code is distributed under the MIT license. See the LICENSE file for details. The license does not apply to the images used in the sample apps.

About

Swipe to "like" or "dislike" any view, just like Tinder.app. Build a flashcard app, a photo viewer, and more, in minutes, not hours!

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages