From bee8d6d9baaf014f788898e9c0dfa2e2b48b3c3e Mon Sep 17 00:00:00 2001 From: Diogo Autilio Date: Mon, 13 Oct 2014 23:45:47 -0300 Subject: [PATCH 01/22] Add travis yml --- .travis.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 .travis.yml diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..fbce8eb --- /dev/null +++ b/.travis.yml @@ -0,0 +1,6 @@ +# reference: http://www.objc.io/issue-6/travis-ci.html + +language: objective-c + +script: +- xctool test -workspace Example/SCLAlertView.xcworkspace -scheme SCLAlertView -sdk iphonesimulator ONLY_ACTIVE_ARCH=NO \ No newline at end of file From 63f10a40be10431d3e0413cc13f42ccb454a91ec Mon Sep 17 00:00:00 2001 From: Diogo Autilio Date: Mon, 13 Oct 2014 23:56:05 -0300 Subject: [PATCH 02/22] Update travis.yml --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index fbce8eb..761abcc 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,4 +3,4 @@ language: objective-c script: -- xctool test -workspace Example/SCLAlertView.xcworkspace -scheme SCLAlertView -sdk iphonesimulator ONLY_ACTIVE_ARCH=NO \ No newline at end of file +- xcodebuild -project SCLAlertView.xcodeproj -target SCLAlertView -sdk iphonesimulator ONLY_ACTIVE_ARCH=NO \ No newline at end of file From c761fc82376c9874b1e7053690feb1b5395bcef5 Mon Sep 17 00:00:00 2001 From: Diogo Autilio Date: Mon, 13 Oct 2014 23:59:25 -0300 Subject: [PATCH 03/22] Add travis badge --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index a3785bd..0570336 100644 --- a/README.md +++ b/README.md @@ -3,6 +3,8 @@ SCLAlertView-Objective-C Animated Alert View written in Swift but ported to Objective-C, which can be used as a `UIAlertView` or `UIAlertController` replacement. +[![Build Status](https://travis-ci.org/dogo/SCLAlertView.svg?branch=master)](https://travis-ci.org/dogo/SCLAlertView) + ![BackgroundImage](https://raw.githubusercontent.com/dogo/SCLAlertView/master/ScreenShots/ScreenShot.png)_ ![BackgroundImage](https://raw.githubusercontent.com/dogo/SCLAlertView/master/ScreenShots/ScreenShot2.png) From d4b4fa525149cf2c81fcddf9f426e22982ea3306 Mon Sep 17 00:00:00 2001 From: Diogo Autilio Date: Wed, 15 Oct 2014 11:35:15 -0300 Subject: [PATCH 04/22] Basic support to hide animations --- SCLAlertView/SCLAlertView.h | 29 ++++++++++++++++++++++++++--- SCLAlertView/SCLAlertView.m | 33 +++++++++++++++++++++++++++++---- 2 files changed, 55 insertions(+), 7 deletions(-) diff --git a/SCLAlertView/SCLAlertView.h b/SCLAlertView/SCLAlertView.h index 1925e16..4a3676b 100755 --- a/SCLAlertView/SCLAlertView.h +++ b/SCLAlertView/SCLAlertView.h @@ -15,7 +15,7 @@ typedef NSAttributedString* (^SCLAttributedFormatBlock)(NSString *value); /** Alert Styles * - * TODO + * Set SCLAlertView Style */ typedef NS_ENUM(NSInteger, SCLAlertViewStyle) { @@ -27,6 +27,16 @@ typedef NS_ENUM(NSInteger, SCLAlertViewStyle) Edit }; +/** Alert hide animation styles + * + * Set SCLAlertView hide animation type. + */ +typedef NS_ENUM(NSInteger, SCLAlertViewAnimation) +{ + NoAnimation, + FadeOut +}; + /** Title Label * * TODO @@ -42,7 +52,7 @@ typedef NS_ENUM(NSInteger, SCLAlertViewStyle) /** Dismiss on tap outside * * A boolean value that determines whether to dismiss when tapping outside the SCLAlertView. - * (Default = NO) + * (Default: NO) */ @property (nonatomic, assign) BOOL shouldDismissOnTapOutside; @@ -58,12 +68,25 @@ typedef NS_ENUM(NSInteger, SCLAlertViewStyle) */ @property (nonatomic, copy) SCLAttributedFormatBlock attributedFormatBlock; +/** Hide animation type + * + * Holds the hide animation type. + * (Default: NoAnimation) + */ +@property (nonatomic) SCLAlertViewAnimation hideAnimationType; + /** Hide SCLAlertView * - * TODO + * Hide SCLAlertView removing from super view. */ - (void)hideView; +/** Hide SCLAlertView + * + * Hide SCLAlertView using animation. + */ +- (void)hideViewWithAnimation:(SCLAlertViewAnimation)animation; + /** Add Text Field * * TODO diff --git a/SCLAlertView/SCLAlertView.m b/SCLAlertView/SCLAlertView.m index 651d23b..511be6a 100755 --- a/SCLAlertView/SCLAlertView.m +++ b/SCLAlertView/SCLAlertView.m @@ -76,6 +76,7 @@ - (id)init kWindowHeight = 178.0f; kTextHeight = 90.0f; _shouldDismissOnTapOutside = NO; + self.hideAnimationType = NoAnimation; // Init _labelTitle = [[UILabel alloc] init]; @@ -315,7 +316,7 @@ - (void)buttonTapped:(SCLButton *)btn { NSLog(@"Unknown action type for button"); } - [self hideView]; + [self hideViewWithAnimation:_hideAnimationType]; } #pragma mark - Show Alert @@ -508,12 +509,11 @@ - (void)showTitle:(UIViewController *)vc title:(NSString *)title subTitle:(NSStr #pragma mark - Hide Alert -// Close SCLAlertView - (void)hideView { [UIView animateWithDuration:0.2f animations:^{ - self.shadowView.alpha = 0; - self.view.alpha = 0; + self.shadowView.alpha = 0.0f; + self.view.alpha = 0.0f; } completion:^(BOOL completed) { [self.shadowView removeFromSuperview]; [self.view removeFromSuperview]; @@ -521,4 +521,29 @@ - (void)hideView }]; } +- (void)hideViewWithAnimation:(SCLAlertViewAnimation)animation +{ + switch (animation) + { + case NoAnimation: + [self hideView]; + break; + + case FadeOut: + [self fadeOut]; + break; + } +} + +#pragma mark - Animations + +- (void)fadeOut +{ + [UIView animateWithDuration:1.0f animations:^{ + self.shadowView.alpha = 0.0f; + self.view.alpha = 0.0f; + } completion:nil + ]; +} + @end \ No newline at end of file From 13d63bb4feef90644eefb00d46ad2ad4ae70d0ea Mon Sep 17 00:00:00 2001 From: Mike Amaral Date: Fri, 17 Oct 2014 20:35:52 -0400 Subject: [PATCH 05/22] Added new Custom alert view style enum. --- SCLAlertView/SCLAlertView.h | 3 ++- SCLAlertView/git.png | Bin 0 -> 3536 bytes 2 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 SCLAlertView/git.png diff --git a/SCLAlertView/SCLAlertView.h b/SCLAlertView/SCLAlertView.h index 1925e16..4971bea 100755 --- a/SCLAlertView/SCLAlertView.h +++ b/SCLAlertView/SCLAlertView.h @@ -24,7 +24,8 @@ typedef NS_ENUM(NSInteger, SCLAlertViewStyle) Notice, Warning, Info, - Edit + Edit, + Custom }; /** Title Label diff --git a/SCLAlertView/git.png b/SCLAlertView/git.png new file mode 100644 index 0000000000000000000000000000000000000000..8d11b6dbe132196eec5ff3035c73bc41f09f6204 GIT binary patch literal 3536 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 LJmOGkACUMzTyXn~ literal 0 HcmV?d00001 From 151d1589fac9578cb443ed8d827563e41db312f3 Mon Sep 17 00:00:00 2001 From: Mike Amaral Date: Fri, 17 Oct 2014 20:36:50 -0400 Subject: [PATCH 06/22] Added Custom enum case to switch-statement that sets the image and color passed in, as well as grows the icon image view to be larger inside the circle view. --- SCLAlertView/SCLAlertView.m | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/SCLAlertView/SCLAlertView.m b/SCLAlertView/SCLAlertView.m index 651d23b..ec37c0f 100755 --- a/SCLAlertView/SCLAlertView.m +++ b/SCLAlertView/SCLAlertView.m @@ -367,6 +367,12 @@ -(SCLAlertViewResponder *)showTitle:(UIViewController *)vc title:(NSString *)tit viewColor = UIColorFromRGB(0xA429FF); iconImage = SCLAlertViewStyleKit.imageOfEdit; break; + + case Custom: + viewColor = color; + iconImage = image; + kCircleIconHeight = kCircleIconHeight * 2; + break; } // Title From 145028abfeee2609f935e6253a014444cbda926e Mon Sep 17 00:00:00 2001 From: Mike Amaral Date: Fri, 17 Oct 2014 20:38:59 -0400 Subject: [PATCH 07/22] Added image and color params to the default showTitle method so they could be passed in for the custom alert view type, and are left nil for all others. --- SCLAlertView/SCLAlertView.m | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/SCLAlertView/SCLAlertView.m b/SCLAlertView/SCLAlertView.m index ec37c0f..a3c3483 100755 --- a/SCLAlertView/SCLAlertView.m +++ b/SCLAlertView/SCLAlertView.m @@ -320,7 +320,7 @@ - (void)buttonTapped:(SCLButton *)btn #pragma mark - Show Alert --(SCLAlertViewResponder *)showTitle:(UIViewController *)vc title:(NSString *)title subTitle:(NSString *)subTitle duration:(NSTimeInterval)duration completeText:(NSString *)completeText style:(SCLAlertViewStyle)style +-(SCLAlertViewResponder *)showTitle:(UIViewController *)vc image:(UIImage *)image color:(UIColor *)color title:(NSString *)title subTitle:(NSString *)subTitle duration:(NSTimeInterval)duration completeText:(NSString *)completeText style:(SCLAlertViewStyle)style { self.view.alpha = 0; self.rootViewController = vc; @@ -479,37 +479,42 @@ -(SCLAlertViewResponder *)showTitle:(UIViewController *)vc title:(NSString *)tit - (void)showSuccess:(UIViewController *)vc title:(NSString *)title subTitle:(NSString *)subTitle closeButtonTitle:(NSString *)closeButtonTitle duration:(NSTimeInterval)duration { - [self showTitle:vc title:title subTitle:subTitle duration:duration completeText:closeButtonTitle style:Success]; + [self showTitle:vc image:nil color:nil title:title subTitle:subTitle duration:duration completeText:closeButtonTitle style:Success]; } - (void)showError:(UIViewController *)vc title:(NSString *)title subTitle:(NSString *)subTitle closeButtonTitle:(NSString *)closeButtonTitle duration:(NSTimeInterval)duration { - [self showTitle:vc title:title subTitle:subTitle duration:duration completeText:closeButtonTitle style:Error]; + [self showTitle:vc image:nil color:nil title:title subTitle:subTitle duration:duration completeText:closeButtonTitle style:Error]; } - (void)showNotice:(UIViewController *)vc title:(NSString *)title subTitle:(NSString *)subTitle closeButtonTitle:(NSString *)closeButtonTitle duration:(NSTimeInterval)duration { - [self showTitle:vc title:title subTitle:subTitle duration:duration completeText:closeButtonTitle style:Notice]; + [self showTitle:vc image:nil color:nil title:title subTitle:subTitle duration:duration completeText:closeButtonTitle style:Notice]; } - (void)showWarning:(UIViewController *)vc title:(NSString *)title subTitle:(NSString *)subTitle closeButtonTitle:(NSString *)closeButtonTitle duration:(NSTimeInterval)duration { - [self showTitle:vc title:title subTitle:subTitle duration:duration completeText:closeButtonTitle style:Warning]; + [self showTitle:vc image:nil color:nil title:title subTitle:subTitle duration:duration completeText:closeButtonTitle style:Warning]; } - (void)showInfo:(UIViewController *)vc title:(NSString *)title subTitle:(NSString *)subTitle closeButtonTitle:(NSString *)closeButtonTitle duration:(NSTimeInterval)duration { - [self showTitle:vc title:title subTitle:subTitle duration:duration completeText:closeButtonTitle style:Info]; + [self showTitle:vc image:nil color:nil title:title subTitle:subTitle duration:duration completeText:closeButtonTitle style:Info]; } - (void)showEdit:(UIViewController *)vc title:(NSString *)title subTitle:(NSString *)subTitle closeButtonTitle:(NSString *)closeButtonTitle duration:(NSTimeInterval)duration { - [self showTitle:vc title:title subTitle:subTitle duration:duration completeText:closeButtonTitle style:Edit]; + [self showTitle:vc image:nil color:nil title:title subTitle:subTitle duration:duration completeText:closeButtonTitle style:Edit]; } - (void)showTitle:(UIViewController *)vc title:(NSString *)title subTitle:(NSString *)subTitle style:(SCLAlertViewStyle)style closeButtonTitle:(NSString *)closeButtonTitle duration:(NSTimeInterval)duration { - [self showTitle:vc title:title subTitle:subTitle duration:duration completeText:closeButtonTitle style:style]; + [self showTitle:vc image:nil color:nil title:title subTitle:subTitle duration:duration completeText:closeButtonTitle style:style]; +} + +- (void)showCustom:(UIViewController *)vc image:(UIImage *)image color:(UIColor *)color title:(NSString *)title subTitle:(NSString *)subTitle closeButtonTitle:(NSString *)closeButtonTitle duration:(NSTimeInterval)duration +{ + [self showTitle:vc image:image color:color title:title subTitle:subTitle duration:duration completeText:closeButtonTitle style:Custom]; } #pragma mark - Hide Alert From 187e6d5e9d0ada4cfed946eb67f135f0321f1a1e Mon Sep 17 00:00:00 2001 From: Mike Amaral Date: Fri, 17 Oct 2014 20:39:32 -0400 Subject: [PATCH 08/22] Added git icon for demoing the custom alert style. --- SCLAlertView.xcodeproj/project.pbxproj | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/SCLAlertView.xcodeproj/project.pbxproj b/SCLAlertView.xcodeproj/project.pbxproj index ab4b7ed..6fc6e64 100644 --- a/SCLAlertView.xcodeproj/project.pbxproj +++ b/SCLAlertView.xcodeproj/project.pbxproj @@ -7,6 +7,7 @@ objects = { /* Begin PBXBuildFile section */ + 274E5C1C19F1ECFE009D8B4A /* git.png in Resources */ = {isa = PBXBuildFile; fileRef = 274E5C1B19F1ECFE009D8B4A /* git.png */; }; DD4BA9BE19DED822008D73EB /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DD4BA9BD19DED822008D73EB /* AVFoundation.framework */; }; DD4BA9C119DED8EF008D73EB /* right_answer.mp3 in Resources */ = {isa = PBXBuildFile; fileRef = DD4BA9C019DED8EF008D73EB /* right_answer.mp3 */; }; DD7282B919D6087C00077F54 /* Storyboard.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = DD7282B719D6087C00077F54 /* Storyboard.storyboard */; }; @@ -32,6 +33,7 @@ /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ + 274E5C1B19F1ECFE009D8B4A /* git.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = git.png; sourceTree = ""; }; DD0D295B19D902DA00881F53 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = Info.plist; path = SCLAlertViewExample/Info.plist; sourceTree = SOURCE_ROOT; }; DD4BA9BD19DED822008D73EB /* AVFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = System/Library/Frameworks/AVFoundation.framework; sourceTree = SDKROOT; }; DD4BA9C019DED8EF008D73EB /* right_answer.mp3 */ = {isa = PBXFileReference; lastKnownFileType = audio.mp3; path = right_answer.mp3; sourceTree = ""; }; @@ -126,6 +128,7 @@ DDB15FD319D5B8DB00173158 /* main.m */, DD4BA9C219DEDD8E008D73EB /* SCLAlertView-Objective-C-prefix.pch */, DD0D295B19D902DA00881F53 /* Info.plist */, + 274E5C1B19F1ECFE009D8B4A /* git.png */, DD4BA9BF19DED8EF008D73EB /* Sounds */, ); name = "Supporting Files"; @@ -245,6 +248,7 @@ files = ( DD4BA9C119DED8EF008D73EB /* right_answer.mp3 in Resources */, DDB15FD019D5B8BF00173158 /* Images.xcassets in Resources */, + 274E5C1C19F1ECFE009D8B4A /* git.png in Resources */, DD7282B919D6087C00077F54 /* Storyboard.storyboard in Resources */, ); runOnlyForDeploymentPostprocessing = 0; From 698eca750438e76f9fd77f08d362079d0a198dbf Mon Sep 17 00:00:00 2001 From: Mike Amaral Date: Fri, 17 Oct 2014 20:40:25 -0400 Subject: [PATCH 09/22] Exposed the new showCustom method in the header. --- SCLAlertView/SCLAlertView.h | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/SCLAlertView/SCLAlertView.h b/SCLAlertView/SCLAlertView.h index 4971bea..c16b9f2 100755 --- a/SCLAlertView/SCLAlertView.h +++ b/SCLAlertView/SCLAlertView.h @@ -125,5 +125,11 @@ typedef NS_ENUM(NSInteger, SCLAlertViewStyle) */ - (void)showTitle:(UIViewController *)vc title:(NSString *)title subTitle:(NSString *)subTitle style:(SCLAlertViewStyle)style closeButtonTitle:(NSString *)closeButtonTitle duration:(NSTimeInterval)duration; +/** Show Custom SCLAlertView + * + * TODO + */ +- (void)showCustom:(UIViewController *)vc image:(UIImage *)image color:(UIColor *)color title:(NSString *)title subTitle:(NSString *)subTitle closeButtonTitle:(NSString *)closeButtonTitle duration:(NSTimeInterval)duration; + @end From 15d8d0060a6515ba7c93113ad69401212ddafc8b Mon Sep 17 00:00:00 2001 From: Mike Amaral Date: Fri, 17 Oct 2014 20:41:03 -0400 Subject: [PATCH 10/22] Updated the storyboard with a new buttom to demo the custom feature, and added the outlets to handle creating a new custom alert and displaying it. --- SCLAlertViewExample/Base.lproj/Storyboard.storyboard | 9 +++++++++ SCLAlertViewExample/ViewController.h | 1 + SCLAlertViewExample/ViewController.m | 7 +++++++ 3 files changed, 17 insertions(+) diff --git a/SCLAlertViewExample/Base.lproj/Storyboard.storyboard b/SCLAlertViewExample/Base.lproj/Storyboard.storyboard index 75830df..eb83715 100644 --- a/SCLAlertViewExample/Base.lproj/Storyboard.storyboard +++ b/SCLAlertViewExample/Base.lproj/Storyboard.storyboard @@ -89,6 +89,15 @@ + diff --git a/SCLAlertViewExample/ViewController.h b/SCLAlertViewExample/ViewController.h index 26e3cb9..eb7f124 100644 --- a/SCLAlertViewExample/ViewController.h +++ b/SCLAlertViewExample/ViewController.h @@ -16,6 +16,7 @@ - (IBAction)showWarning:(id)sender; - (IBAction)showInfo:(id)sender; - (IBAction)showEdit:(id)sender; +- (IBAction)showCustom:(id)sender; @end diff --git a/SCLAlertViewExample/ViewController.m b/SCLAlertViewExample/ViewController.m index 53d1e1c..8139ff4 100644 --- a/SCLAlertViewExample/ViewController.m +++ b/SCLAlertViewExample/ViewController.m @@ -136,6 +136,13 @@ - (IBAction)showWithDuration:(id)sender [alert showNotice:self title:kNoticeTitle subTitle:@"You've just displayed this awesome Pop Up View with 5 seconds duration" closeButtonTitle:nil duration:5.0f]; } +- (IBAction)showCustom:(id)sender { + SCLAlertView *alert = [[SCLAlertView alloc] init]; + + UIColor *color = [UIColor colorWithRed:65.0/255.0 green:64.0/255.0 blue:144.0/255.0 alpha:1.0]; + [alert showCustom:self image:[UIImage imageNamed:@"git"] color:color title:@"Custom" subTitle:@"Add a custom icon and color for your own type of alert!" closeButtonTitle:@"OK" duration:0.0f]; +} + - (void)firstButton { NSLog(@"First button tapped"); From af0b2322c2bdee3e824e7a309b40a036550ff48b Mon Sep 17 00:00:00 2001 From: Mike Amaral Date: Fri, 17 Oct 2014 21:11:01 -0400 Subject: [PATCH 11/22] Made the alert view conform to the UITextFieldDelegate protocol, and set itself as the delegate on the textfields it creates. --- SCLAlertView/SCLAlertView.m | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/SCLAlertView/SCLAlertView.m b/SCLAlertView/SCLAlertView.m index 651d23b..1085a59 100755 --- a/SCLAlertView/SCLAlertView.m +++ b/SCLAlertView/SCLAlertView.m @@ -17,7 +17,7 @@ green:((float)((rgbValue & 0xFF00) >> 8))/255.0 \ blue:((float)(rgbValue & 0xFF))/255.0 alpha:1.0] -@interface SCLAlertView () +@interface SCLAlertView () @property (nonatomic, strong) NSMutableArray *inputs; @property (nonatomic, strong) NSMutableArray *buttons; @@ -240,6 +240,7 @@ - (UITextField *)addTextField:(NSString *)title // Add text field UITextField *txt = [[UITextField alloc] init]; + txt.delegate = self; txt.borderStyle = UITextBorderStyleRoundedRect; txt.font = [UIFont fontWithName:kDefaultFont size:14.0f]; txt.autocapitalizationType = UITextAutocapitalizationTypeWords; From 9129708dac76e3187c9f45011612d249e3ee2d17 Mon Sep 17 00:00:00 2001 From: Mike Amaral Date: Fri, 17 Oct 2014 21:11:41 -0400 Subject: [PATCH 12/22] Set the return key type to Done for every textfield when you add it because it is the last field. --- SCLAlertView/SCLAlertView.m | 1 + 1 file changed, 1 insertion(+) diff --git a/SCLAlertView/SCLAlertView.m b/SCLAlertView/SCLAlertView.m index 1085a59..0f463f1 100755 --- a/SCLAlertView/SCLAlertView.m +++ b/SCLAlertView/SCLAlertView.m @@ -241,6 +241,7 @@ - (UITextField *)addTextField:(NSString *)title // Add text field UITextField *txt = [[UITextField alloc] init]; txt.delegate = self; + txt.returnKeyType = UIReturnKeyDone; txt.borderStyle = UITextBorderStyleRoundedRect; txt.font = [UIFont fontWithName:kDefaultFont size:14.0f]; txt.autocapitalizationType = UITextAutocapitalizationTypeWords; From eba68f6ec95b578bcec9f3f82b7c2f1f07ebd38d Mon Sep 17 00:00:00 2001 From: Mike Amaral Date: Fri, 17 Oct 2014 21:12:29 -0400 Subject: [PATCH 13/22] After adding a new textfield, and if there are other fields present, set the prior field's return key type to Next. --- SCLAlertView/SCLAlertView.m | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/SCLAlertView/SCLAlertView.m b/SCLAlertView/SCLAlertView.m index 0f463f1..0e93676 100755 --- a/SCLAlertView/SCLAlertView.m +++ b/SCLAlertView/SCLAlertView.m @@ -257,6 +257,14 @@ - (UITextField *)addTextField:(NSString *)title [_contentView addSubview:txt]; [_inputs addObject:txt]; + // If there are other fields in the inputs array, get the previous field and set the + // return key type on that to next. + if (_inputs.count > 1) { + NSUInteger indexOfCurrentField = [_inputs indexOfObject:txt]; + UITextField *priorField = _inputs[indexOfCurrentField - 1]; + priorField.returnKeyType = UIReturnKeyNext; + } + return txt; } From 99a295cf3cef6efa54ebe485ef215b37c9337f46 Mon Sep 17 00:00:00 2001 From: Mike Amaral Date: Fri, 17 Oct 2014 21:13:18 -0400 Subject: [PATCH 14/22] Implement the textFieldShouldReturn: delegate method, and if the field is the last field dismiss the keyboard, otherwise get the next field and make it the first responder - for much faster and more user-friendly form navigation. --- SCLAlertView/SCLAlertView.m | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/SCLAlertView/SCLAlertView.m b/SCLAlertView/SCLAlertView.m index 0e93676..50f28c9 100755 --- a/SCLAlertView/SCLAlertView.m +++ b/SCLAlertView/SCLAlertView.m @@ -268,6 +268,23 @@ - (UITextField *)addTextField:(NSString *)title return txt; } +- (BOOL)textFieldShouldReturn:(UITextField *)textField { + // If this is the last object in the inputs array, resign first responder + // as the form is at the end. + if (textField == [_inputs lastObject]) { + [textField resignFirstResponder]; + } + + // Otherwise find the next field and make it first responder. + else { + NSUInteger indexOfCurrentField = [_inputs indexOfObject:textField]; + UITextField *nextField = _inputs[indexOfCurrentField + 1]; + [nextField becomeFirstResponder]; + } + + return NO; +} + #pragma mark - Buttons - (SCLButton *)addButton:(NSString *)title From 53e702f877460da02d7eacd60fa4dc74b482b235 Mon Sep 17 00:00:00 2001 From: Mike Amaral Date: Sat, 18 Oct 2014 09:10:47 -0400 Subject: [PATCH 15/22] Added documentation for the new showCustom method. --- SCLAlertView/SCLAlertView.h | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/SCLAlertView/SCLAlertView.h b/SCLAlertView/SCLAlertView.h index c16b9f2..2eeaaac 100755 --- a/SCLAlertView/SCLAlertView.h +++ b/SCLAlertView/SCLAlertView.h @@ -125,9 +125,15 @@ typedef NS_ENUM(NSInteger, SCLAlertViewStyle) */ - (void)showTitle:(UIViewController *)vc title:(NSString *)title subTitle:(NSString *)subTitle style:(SCLAlertViewStyle)style closeButtonTitle:(NSString *)closeButtonTitle duration:(NSTimeInterval)duration; -/** Show Custom SCLAlertView - * - * TODO +/** Shows a custom SCLAlertView without using a predefined type, allowing for a custom image and color to be specified. + * + * @param vc The view controller the alert view will be displayed in. + * @param image A UIImage object to be used as the icon for the alert view. + * @param color A UIColor object to be used to tint the background of the icon circle and the buttons. + * @param title The title text of the alert view. + * @param subTitle The subtitle text of the alert view. + * @param closeButtonTitle The text for the close button. + * @param duration The amount of time the alert will remain on screen until it is automatically dismissed. If automatic dismissal is not desired, set to 0. */ - (void)showCustom:(UIViewController *)vc image:(UIImage *)image color:(UIColor *)color title:(NSString *)title subTitle:(NSString *)subTitle closeButtonTitle:(NSString *)closeButtonTitle duration:(NSTimeInterval)duration; From 50836d0c1ade9e248cb375521a022208eb6d81ba Mon Sep 17 00:00:00 2001 From: Mike Amaral Date: Sat, 18 Oct 2014 09:16:46 -0400 Subject: [PATCH 16/22] Updated README with new custom info. --- README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 0570336..166a57a 100644 --- a/README.md +++ b/README.md @@ -7,6 +7,7 @@ Animated Alert View written in Swift but ported to Objective-C, which can be use ![BackgroundImage](https://raw.githubusercontent.com/dogo/SCLAlertView/master/ScreenShots/ScreenShot.png)_ ![BackgroundImage](https://raw.githubusercontent.com/dogo/SCLAlertView/master/ScreenShots/ScreenShot2.png) +![BackgroundImage](ScreenShots/ScreenShot3.png) ###Easy to use ```Objective-C @@ -21,6 +22,7 @@ SCLAlertView *alert = [[SCLAlertView alloc] init]; [alert showWarning:self title:@"Hello Warning" subTitle:@"This is a more descriptive warning text." closeButtonTitle:@"Done" duration:0.0f]; // Warning [alert showInfo:self title:@"Hello Info" subTitle:@"This is a more descriptive info text." closeButtonTitle:@"Done" duration:0.0f]; // Info [alert showEdit:self title:@"Hello Edit" subTitle:@"This is a more descriptive info text with a edit textbox" closeButtonTitle:@"Done" duration:0.0f]; // Edit +[alert showCustom:self image:[UIImage imageNamed:@"git"] color:color title:@"Custom" subTitle:@"Add a custom icon and color for your own type of alert!" closeButtonTitle:@"OK" duration:0.0f]; // Custom // Advanced SCLAlertView *alert = [[SCLAlertView alloc] init]; @@ -89,7 +91,8 @@ typedef NS_ENUM(NSInteger, SCLAlertViewStyle) Notice, Warning, Info, - Edit + Edit, + Custom }; ``` From 22a919c147d3b95b66e6d07b68e6fdf5c11340d8 Mon Sep 17 00:00:00 2001 From: Mike Amaral Date: Sat, 18 Oct 2014 09:17:06 -0400 Subject: [PATCH 17/22] Added screenshot image for custom. --- ScreenShots/ScreenShot3.png | Bin 0 -> 39659 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 ScreenShots/ScreenShot3.png diff --git a/ScreenShots/ScreenShot3.png b/ScreenShots/ScreenShot3.png new file mode 100644 index 0000000000000000000000000000000000000000..77265c5be80f84694b56ec58b12a2818cc1b1db2 GIT binary patch literal 39659 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 z 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 literal 0 HcmV?d00001 From be8918b42fca7494909feecd2b546e2e25aa7b42 Mon Sep 17 00:00:00 2001 From: Diogo Autilio Date: Sat, 18 Oct 2014 11:36:25 -0300 Subject: [PATCH 18/22] Code cleanup Hide view only if is visible --- SCLAlertView/SCLAlertView.m | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/SCLAlertView/SCLAlertView.m b/SCLAlertView/SCLAlertView.m index 5c2092c..8f6f652 100755 --- a/SCLAlertView/SCLAlertView.m +++ b/SCLAlertView/SCLAlertView.m @@ -342,7 +342,10 @@ - (void)buttonTapped:(SCLButton *)btn { NSLog(@"Unknown action type for button"); } - [self hideView]; + if([self isVisible]) + { + [self hideView]; + } } #pragma mark - Show Alert @@ -544,9 +547,15 @@ - (void)showCustom:(UIViewController *)vc image:(UIImage *)image color:(UIColor [self showTitle:vc image:image color:color title:title subTitle:subTitle duration:duration completeText:closeButtonTitle style:Custom]; } +#pragma mark - Visibility + +- (BOOL)isVisible +{ + return (self.shadowView.alpha && self.view.alpha); +} + #pragma mark - Hide Alert -// Close SCLAlertView - (void)hideView { [UIView animateWithDuration:0.2f animations:^{ From 05b8b1ff03aee5755f95e7d2efabad52c400477b Mon Sep 17 00:00:00 2001 From: Mike Amaral Date: Sat, 18 Oct 2014 10:36:54 -0400 Subject: [PATCH 19/22] Added a unique method for adding the done button, so we can simply tell the view to hide when pressed. --- SCLAlertView/SCLAlertView.m | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/SCLAlertView/SCLAlertView.m b/SCLAlertView/SCLAlertView.m index 5c2092c..957bedc 100755 --- a/SCLAlertView/SCLAlertView.m +++ b/SCLAlertView/SCLAlertView.m @@ -304,6 +304,14 @@ - (SCLButton *)addButton:(NSString *)title return btn; } +- (SCLButton *)addDoneButtonWithTitle:(NSString *)title +{ + SCLButton *btn = [self addButton:title]; + [btn addTarget:self action:@selector(hideView) forControlEvents:UIControlEventTouchUpInside]; + + return btn; +} + - (SCLButton *)addButton:(NSString *)title actionBlock:(ActionBlock)action { SCLButton *btn = [self addButton:title]; @@ -450,7 +458,7 @@ -(SCLAlertViewResponder *)showTitle:(UIViewController *)vc image:(UIImage *)imag // Add button, if necessary if(completeText != nil) { - [self addButton:completeText target:self selector:@selector(hideView)]; + [self addDoneButtonWithTitle:completeText]; } // Alert view colour and images From b2bf37fff5aaade507a98d05d30faf39214da089 Mon Sep 17 00:00:00 2001 From: Diogo Autilio Date: Sat, 18 Oct 2014 11:57:37 -0300 Subject: [PATCH 20/22] Remove unused function --- SCLAlertView/SCLAlertView.h | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/SCLAlertView/SCLAlertView.h b/SCLAlertView/SCLAlertView.h index 02b7ed7..7e13a9c 100755 --- a/SCLAlertView/SCLAlertView.h +++ b/SCLAlertView/SCLAlertView.h @@ -78,16 +78,10 @@ typedef NS_ENUM(NSInteger, SCLAlertViewAnimation) /** Hide SCLAlertView * - * Hide SCLAlertView removing from super view. + * Hide SCLAlertView using animation and removing from super view. */ - (void)hideView; -/** Hide SCLAlertView - * - * Hide SCLAlertView using animation. - */ -- (void)hideViewWithAnimation:(SCLAlertViewAnimation)animation; - /** Add Text Field * * TODO From 57c416a08267b9822e70ea831594e9c3c84ee84c Mon Sep 17 00:00:00 2001 From: Diogo Autilio Date: Sat, 18 Oct 2014 13:08:58 -0300 Subject: [PATCH 21/22] Code formatting Move pop up view up when the keyboard show --- SCLAlertView/SCLAlertView.m | 48 ++++++++++++++++++++++++++++++------- 1 file changed, 40 insertions(+), 8 deletions(-) diff --git a/SCLAlertView/SCLAlertView.m b/SCLAlertView/SCLAlertView.m index 3786efb..01b5c40 100755 --- a/SCLAlertView/SCLAlertView.m +++ b/SCLAlertView/SCLAlertView.m @@ -17,6 +17,9 @@ green:((float)((rgbValue & 0xFF00) >> 8))/255.0 \ blue:((float)(rgbValue & 0xFF))/255.0 alpha:1.0] +#define KEYBOARD_HEIGHT 80 +#define PREDICTION_BAR_HEIGHT 40 + @interface SCLAlertView () @property (nonatomic, strong) NSMutableArray *inputs; @@ -127,10 +130,19 @@ - (id)init _labelTitle.textColor = UIColorFromRGB(0x4D4D4D); _viewText.textColor = UIColorFromRGB(0x4D4D4D); _contentView.layer.borderColor = UIColorFromRGB(0xCCCCCC).CGColor; + + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardDidShow:) name:UIKeyboardDidShowNotification object:nil]; + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardDidHide:) name:UIKeyboardDidHideNotification object:nil]; } return self; } +- (void)dealloc +{ + [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillShowNotification object:nil]; + [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillHideNotification object:nil]; +} + #pragma mark - View Cycle -(void)viewWillLayoutSubviews @@ -260,32 +272,52 @@ - (UITextField *)addTextField:(NSString *)title // If there are other fields in the inputs array, get the previous field and set the // return key type on that to next. - if (_inputs.count > 1) { + if (_inputs.count > 1) + { NSUInteger indexOfCurrentField = [_inputs indexOfObject:txt]; UITextField *priorField = _inputs[indexOfCurrentField - 1]; priorField.returnKeyType = UIReturnKeyNext; } - return txt; } -- (BOOL)textFieldShouldReturn:(UITextField *)textField { +# pragma mark - UITextFieldDelegate + +- (BOOL)textFieldShouldReturn:(UITextField *)textField +{ // If this is the last object in the inputs array, resign first responder // as the form is at the end. - if (textField == [_inputs lastObject]) { + if (textField == [_inputs lastObject]) + { [textField resignFirstResponder]; } - - // Otherwise find the next field and make it first responder. - else { + else // Otherwise find the next field and make it first responder. + { NSUInteger indexOfCurrentField = [_inputs indexOfObject:textField]; UITextField *nextField = _inputs[indexOfCurrentField + 1]; [nextField becomeFirstResponder]; } - return NO; } +- (void)keyboardDidShow:(NSNotification *)notification +{ + [UIView animateWithDuration:0.2f animations:^{ + CGRect f = self.view.frame; + f.origin.y -= KEYBOARD_HEIGHT + PREDICTION_BAR_HEIGHT; + self.view.frame = f; + }]; +} + +-(void)keyboardDidHide:(NSNotification *)notification +{ + [UIView animateWithDuration:0.2f animations:^{ + CGRect f = self.view.frame; + f.origin.y += KEYBOARD_HEIGHT + PREDICTION_BAR_HEIGHT; + self.view.frame = f; + }]; +} + #pragma mark - Buttons - (SCLButton *)addButton:(NSString *)title From 0100462340c0226caf099df4b87e633ae2a6c35d Mon Sep 17 00:00:00 2001 From: Diogo Autilio Date: Sat, 18 Oct 2014 13:11:48 -0300 Subject: [PATCH 22/22] Bump version --- SCLAlertView-Objective-C.podspec | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/SCLAlertView-Objective-C.podspec b/SCLAlertView-Objective-C.podspec index e5c0cfb..6abfb11 100644 --- a/SCLAlertView-Objective-C.podspec +++ b/SCLAlertView-Objective-C.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |spec| spec.name = "SCLAlertView-Objective-C" - spec.version = "0.1.2" + spec.version = "0.2.0" spec.summary = "Beautiful animated Alert View. Written in Swift but ported to Objective-C" spec.homepage = "https://github.com/dogo/SCLAlertView" spec.screenshots = "https://raw.githubusercontent.com/dogo/SCLAlertView/master/ScreenShots/ScreenShot.png", "https://raw.githubusercontent.com/dogo/SCLAlertView/master/ScreenShots/ScreenShot2.png" @@ -10,7 +10,7 @@ Pod::Spec.new do |spec| spec.social_media_url = "http://twitter.com/di_autilio" spec.platform = :ios spec.ios.deployment_target = '7.0' - spec.source = { :git => "https://github.com/dogo/SCLAlertView.git", :tag => "0.1.2" } + spec.source = { :git => "https://github.com/dogo/SCLAlertView.git", :tag => "0.2.0" } spec.source_files = "SCLAlertView/*" spec.requires_arc = true end