ScrollView Auto Layout for SignUp And keyboard Show Hide With Notification

ViewController.h

#import <UIKit/UIKit.h>

#import “NewViewController.h”

#import “UserDetailDataModel.h”

@interface ViewController : UIViewController<UITextFieldDelegate>

@property (weak, nonatomic) IBOutlet UITextField *textFieldCurrent;

@property (weak, nonatomic) IBOutlet UITextField *textFieldFirstName;

@property (weak, nonatomic) IBOutlet UITextField *textFieldLastName;

@property (weak, nonatomic) IBOutlet UITextField *textFieldPhoneNumber;

@property (weak, nonatomic) IBOutlet UITextField *textFieldCity;

@property (weak, nonatomic) IBOutlet UIScrollView *scrollViewSignUp;

– (IBAction)buttonActionSubmit:(id)sender;

– (IBAction)buttonActionCancel:(id)sender;

@end

ViewController.m

#import “ViewController.h”

@interface ViewController ()

@end

@implementation ViewController

– (void)viewDidLoad {

    [super viewDidLoad];

    

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil];

    

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil];

    

    

    UITapGestureRecognizer *aGest = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapDetected)];

    aGest.numberOfTapsRequired = 1;

    [self.view addGestureRecognizer:aGest];

    // Do any additional setup after loading the view, typically from a nib.

}

– (void)didReceiveMemoryWarning {

    [super didReceiveMemoryWarning];

    // Dispose of any resources that can be recreated.

}

-(void)viewWillDisappear:(BOOL)animated

{

    [super viewWillDisappear:animated];

    

    [[NSNotificationCenter defaultCenter] removeObserver:self

                                                    name:UIKeyboardWillShowNotification

                                                  object:nil];

    

    [[NSNotificationCenter defaultCenter] removeObserver:self

                                                    name:UIKeyboardWillHideNotification

                                                  object:nil];

}

– (IBAction)buttonActionSubmit:(id)sender

{

    NSLog(@”buttonActionSubmit”);

    

    UserDetailDataModel *aUserDetailDataModel = [UserDetailDataModel new];

    aUserDetailDataModel.FirstName = self.textFieldFirstName.text;

    aUserDetailDataModel.LastName = self.textFieldLastName.text;

    aUserDetailDataModel.PhoneNumber = self.textFieldPhoneNumber.text;

    aUserDetailDataModel.City = self.textFieldCity.text;

    

    NewViewController *aNewViewController = [self.storyboard instantiateViewControllerWithIdentifier:@”NewViewController”];

    aNewViewController.bUserDetailDataModel = aUserDetailDataModel;

    [self.navigationController pushViewController:aNewViewController animated:YES];

}

– (IBAction)buttonActionCancel:(id)sender

{

    NSLog(@”buttonActionCancel”);

    [self resetAllTextField];

}

– (void)resetAllTextField

{

    self.textFieldFirstName.text = nil;

    self.textFieldLastName.text = nil;

    self.textFieldPhoneNumber.text = nil;

    self.textFieldCity.text = nil;

}

#pragma mark – Gester method

– (void)tapDetected {

    

    [self.textFieldCurrent resignFirstResponder];

    

}

#pragma mark – UIKeyboard show/hide notification

– (void)keyboardWillShow:(NSNotification *)iNotification {

    

    NSLog(@”%f”, [iNotification.userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue].size.height);

    

    NSDictionary *aKeyInfo = iNotification.userInfo;

    NSValue *aRectValue = [aKeyInfo valueForKey:UIKeyboardFrameBeginUserInfoKey];

    CGRect aRect = [aRectValue CGRectValue];

    

    if (self.textFieldCurrent.tag == 3 || self.textFieldCurrent.tag == 4)

    {

        self.scrollViewSignUp.contentOffset = CGPointMake(0, (aRect.size.height) – ([UIScreen mainScreen].bounds.size.height / 5.3));

    }

    

}

– (void)keyboardWillHide:(NSNotification *)iNotification  {

    

    self.scrollViewSignUp.contentOffset = CGPointMake(0, 0);

    

}

#pragma mark – UITextField delegate

– (BOOL)textFieldShouldReturn:(UITextField *)textField {

    

    [textField resignFirstResponder];

    return YES;

    

}

– (void)textFieldDidBeginEditing:(UITextField *)textField {

    

    self.textFieldCurrent = textField;

    

}

@end

NewViewController.h

#import <UIKit/UIKit.h>

#import “UserDetailDataModel.h”

#import “Utility.h”

@interface NewViewController : UIViewController

@property (strong, nonatomic) UserDetailDataModel *bUserDetailDataModel;

– (IBAction)buttonActionBack:(id)sender;

@end

NewViewController.m

#import “NewViewController.h”

@interface NewViewController ()

@end

@implementation NewViewController

– (void)viewDidLoad {

    [super viewDidLoad];

    

    NSLog(@”%@”,self.bUserDetailDataModel);

    NSLog(@”%@”,[self.bUserDetailDataModel asMutableDictionaryUserDetailDataModel]);

    NSLog(@”%@”,[Utility descriptionForObject:self.bUserDetailDataModel]);

    // Do any additional setup after loading the view.

}

– (void)didReceiveMemoryWarning {

    [super didReceiveMemoryWarning];

    // Dispose of any resources that can be recreated.

}

/*

#pragma mark – Navigation

// In a storyboard-based application, you will often want to do a little preparation before navigation

– (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {

    // Get the new view controller using [segue destinationViewController].

    // Pass the selected object to the new view controller.

}

*/

– (IBAction)buttonActionBack:(id)sender

{

    [self.navigationController popViewControllerAnimated:YES];

}

@end

UserDetailDataModel.h

#import <Foundation/Foundation.h>

@interface UserDetailDataModel : NSObject

@property (strong, nonatomic) NSString *FirstName;

@property (strong, nonatomic) NSString *LastName;

@property (strong, nonatomic) NSString *PhoneNumber;

@property (strong, nonatomic) NSString *City;

– (NSMutableDictionary *)asMutableDictionaryUserDetailDataModel;

@end

UserDetailDataModel.m

#import “UserDetailDataModel.h”

@implementation UserDetailDataModel

– (NSMutableDictionary *)asMutableDictionaryUserDetailDataModel

{

    NSMutableDictionary *aDictionaryUserDetailDataModel = [NSMutableDictionary new];

    [aDictionaryUserDetailDataModel setObject:(self.FirstName == nil ? @””:self.FirstName) forKey:@”FirstName”];

    [aDictionaryUserDetailDataModel setObject:(self.LastName == nil ? @””:self.LastName) forKey:@”LastName”];

    [aDictionaryUserDetailDataModel setObject:(self.PhoneNumber == nil ? @””:self.PhoneNumber) forKey:@”PhoneNumber”];

    [aDictionaryUserDetailDataModel setObject:(self.City == nil ? @””:self.City) forKey:@”City”];

    

    return aDictionaryUserDetailDataModel;

}

@end

Utility.h

#import <Foundation/Foundation.h>

@interface Utility : NSObject

+(NSString *)descriptionForObject:(id)objct;

@end

Utility.m

#import “Utility.h”

#import <objc/message.h>

@implementation Utility

+(NSString *)descriptionForObject:(id)objct

{

    unsigned int varCount;

    NSMutableString *descriptionString = [[NSMutableString alloc]init];

    

    objc_property_t *vars = class_copyPropertyList(object_getClass(objct), &varCount);

    

    for (int i = 0; i < varCount; i++)

    {

        objc_property_t var = vars[i];

        

        const char* name = property_getName (var);

        

        NSString *keyValueString = [NSString stringWithFormat:@”\n%@ = %@”,[NSString stringWithUTF8String:name],[objct valueForKey:[NSString stringWithUTF8String:name]]];

        [descriptionString appendString:keyValueString];

    }

    

    free(vars);

    return descriptionString;

}

@end

Download Sample Project From GitHub

Leave a comment