Skip to content

Commit

Permalink
[TextFields] iOS 11 example bugs fixed (#2071)
Browse files Browse the repository at this point in the history
* [TextFields] Example fix for iOS 11.

* [TextFields] iOS 11 bugs fixed.

* [TextFields] Formatting

* [TextFields] Xcode 8 support

* [TextFields] Example layout correction.

* [TextFields] Xcode and iOS safety code.

* [TextFields] typo corrections.

* [TextFields] Code for Xcode conditional.

* [TextFields] Xcode 8 support.

* [TextFields] Pleasing the static analyzer.

* [TextFields] Formatting improvement.

* [TextFields] Swift compiler conditional change and some formatting.

* [TextFields] Swift example notification changes.

* [TextFields] Safer notifcations code in Objc.

* [TextFields] Formatting
  • Loading branch information
willlarche committed Oct 3, 2017
1 parent c50dec4 commit 90e79dd
Show file tree
Hide file tree
Showing 11 changed files with 617 additions and 114 deletions.
117 changes: 93 additions & 24 deletions components/TextFields/examples/MultilineTextFieldLegacyExample.m
Expand Up @@ -28,6 +28,10 @@ @interface MultilineTextFieldLegacyExample : UIViewController <UITextViewDelegat

@implementation MultilineTextFieldLegacyExample

- (void)dealloc {
[[NSNotificationCenter defaultCenter] removeObserver:self];
}

- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor colorWithWhite:0.97 alpha:1.0];
Expand Down Expand Up @@ -95,8 +99,8 @@ - (void)viewDidLoad {
multilineTextFieldCharMaxDefault.placeholder = @"Inline Placeholder Only";
multilineTextFieldCharMaxDefault.textView.delegate = self;

self.textFieldControllerDefaultCharMax =
[[MDCTextInputControllerLegacyDefault alloc] initWithTextInput:multilineTextFieldCharMaxDefault];
self.textFieldControllerDefaultCharMax = [[MDCTextInputControllerLegacyDefault alloc]
initWithTextInput:multilineTextFieldCharMaxDefault];
self.textFieldControllerDefaultCharMax.characterCountMax = 30;
self.textFieldControllerDefaultCharMax.floatingEnabled = NO;

Expand All @@ -112,19 +116,18 @@ - (void)viewDidLoad {
self.textFieldControllerFullWidth.characterCountMax = 140;

[NSLayoutConstraint
activateConstraints:[NSLayoutConstraint
constraintsWithVisualFormat:
@"V:|-20-[unstyled]-[area]-[floating]-[charMax]-[fullWidth]-|"
options:0
metrics:nil
views:@{
@"unstyled" : multilineTextFieldUnstyled,
@"area" : multilineTextFieldUnstyledArea,
@"charMax" : multilineTextFieldCharMaxDefault,
@"floating" : multilineTextFieldFloating,
@"fullWidth" :
multilineTextFieldCharMaxFullWidth
}]];
activateConstraints:
[NSLayoutConstraint
constraintsWithVisualFormat:@"V:[unstyled]-[area]-[floating]-[charMax]-[fullWidth]"
options:0
metrics:nil
views:@{
@"unstyled" : multilineTextFieldUnstyled,
@"area" : multilineTextFieldUnstyledArea,
@"charMax" : multilineTextFieldCharMaxDefault,
@"floating" : multilineTextFieldFloating,
@"fullWidth" : multilineTextFieldCharMaxFullWidth
}]];
[NSLayoutConstraint
activateConstraints:[NSLayoutConstraint
constraintsWithVisualFormat:@"H:|-[unstyled]-|"
Expand Down Expand Up @@ -158,6 +161,61 @@ - (void)viewDidLoad {
@"charMax" : multilineTextFieldCharMaxDefault
}]];

#if defined(__IPHONE_11_0) && (__IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_11_0)
if (@available(iOS 11.0, *)) {
[NSLayoutConstraint activateConstraints:@[
[NSLayoutConstraint constraintWithItem:multilineTextFieldUnstyled
attribute:NSLayoutAttributeTop
relatedBy:NSLayoutRelationEqual
toItem:self.scrollView.contentLayoutGuide
attribute:NSLayoutAttributeTop
multiplier:1
constant:20],
[NSLayoutConstraint constraintWithItem:multilineTextFieldCharMaxFullWidth
attribute:NSLayoutAttributeBottom
relatedBy:NSLayoutRelationEqual
toItem:self.scrollView.contentLayoutGuide
attribute:NSLayoutAttributeBottomMargin
multiplier:1
constant:-20]
]];
} else {
[NSLayoutConstraint activateConstraints:@[
[NSLayoutConstraint constraintWithItem:multilineTextFieldUnstyled
attribute:NSLayoutAttributeTop
relatedBy:NSLayoutRelationEqual
toItem:self.scrollView
attribute:NSLayoutAttributeTop
multiplier:1
constant:20],
[NSLayoutConstraint constraintWithItem:multilineTextFieldCharMaxFullWidth
attribute:NSLayoutAttributeBottom
relatedBy:NSLayoutRelationEqual
toItem:self.scrollView
attribute:NSLayoutAttributeBottomMargin
multiplier:1
constant:-20]
]];
}
#else
[NSLayoutConstraint activateConstraints:@[
[NSLayoutConstraint constraintWithItem:multilineTextFieldUnstyled
attribute:NSLayoutAttributeTop
relatedBy:NSLayoutRelationEqual
toItem:self.scrollView
attribute:NSLayoutAttributeTop
multiplier:1
constant:20],
[NSLayoutConstraint constraintWithItem:multilineTextFieldCharMaxFullWidth
attribute:NSLayoutAttributeBottom
relatedBy:NSLayoutRelationEqual
toItem:self.scrollView
attribute:NSLayoutAttributeBottomMargin
multiplier:1
constant:-20]
]];
#endif

[NSLayoutConstraint constraintWithItem:multilineTextFieldCharMaxFullWidth
attribute:NSLayoutAttributeLeading
relatedBy:NSLayoutRelationEqual
Expand Down Expand Up @@ -188,15 +246,7 @@ - (void)viewDidLoad {
[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapDidTouch)];
[self.view addGestureRecognizer:tapRecognizer];

[[NSNotificationCenter defaultCenter]
addObserverForName:UIKeyboardWillShowNotification
object:nil
queue:[NSOperationQueue mainQueue]
usingBlock:^(NSNotification *_Nonnull note) {
CGRect frame =
[[note.userInfo valueForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue];
self.scrollView.contentInset = UIEdgeInsetsMake(0, 0, CGRectGetHeight(frame), 0);
}];
[self registerKeyboardNotifications];
}

- (void)tapDidTouch {
Expand All @@ -213,6 +263,25 @@ + (BOOL)catalogIsPrimaryDemo {
return NO;
}

#pragma mark - Keyboard Handling

- (void)registerKeyboardNotifications {
NSNotificationCenter *defaultCenter = [NSNotificationCenter defaultCenter];
[defaultCenter addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil];
[defaultCenter addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardDidChangeFrameNotification object:nil];
[defaultCenter addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil];
}

- (void)keyboardWillShow:(NSNotification *)notification {
CGRect frame =
[[notification.userInfo valueForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue];
self.scrollView.contentInset = UIEdgeInsetsMake(0, 0, CGRectGetHeight(frame), 0);
}

- (void)keyboardWillHide:(NSNotification *)notification {
self.scrollView.contentInset = UIEdgeInsetsMake(0, 0, 0, 0);
}

@end

@implementation MultilineTextFieldLegacyExample (UITextViewDelegate)
Expand Down
62 changes: 60 additions & 2 deletions components/TextFields/examples/TextFieldExample.swift
Expand Up @@ -91,6 +91,10 @@ final class TextFieldSwiftExample: UIViewController {
fatalError("init(coder:) has not been implemented")
}

deinit {
NotificationCenter.default.removeObserver(self)
}

override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = UIColor(white:0.97, alpha: 1.0)
Expand Down Expand Up @@ -165,7 +169,7 @@ final class TextFieldSwiftExample: UIViewController {
"phone": phone,
"message": message ]
var constraints = NSLayoutConstraint.constraints(withVisualFormat:
"V:|-20-[name]-[address]-[city]-[stateZip]-[phone]-[message]-|",
"V:[name]-[address]-[city]-[stateZip]-[phone]-[message]",
options: [.alignAllLeading, .alignAllTrailing],
metrics: nil,
views: views)
Expand All @@ -189,6 +193,55 @@ final class TextFieldSwiftExample: UIViewController {
metrics: nil,
views: views)

#if swift(>=3.2)
if #available(iOS 11.0, *) {
constraints += [NSLayoutConstraint(item: name,
attribute: .top,
relatedBy: .equal,
toItem: scrollView.contentLayoutGuide,
attribute: .top,
multiplier: 1,
constant: 20),
NSLayoutConstraint(item: message,
attribute: .bottom,
relatedBy: .equal,
toItem: scrollView.contentLayoutGuide,
attribute: .bottomMargin,
multiplier: 1,
constant: -20)]
} else {
constraints += [NSLayoutConstraint(item: name,
attribute: .top,
relatedBy: .equal,
toItem: scrollView,
attribute: .top,
multiplier: 1,
constant: 20),
NSLayoutConstraint(item: message,
attribute: .bottom,
relatedBy: .equal,
toItem: scrollView,
attribute: .bottomMargin,
multiplier: 1,
constant: -20)]
}
#else
constraints += [NSLayoutConstraint(item: name,
attribute: .top,
relatedBy: .equal,
toItem: scrollView,
attribute: .top,
multiplier: 1,
constant: 20),
NSLayoutConstraint(item: message,
attribute: .bottom,
relatedBy: .equal,
toItem: scrollView,
attribute: .bottomMargin,
multiplier: 1,
constant: -20)]
#endif

let stateZipViews = [ "state": state, "zip": zip ]
constraints += NSLayoutConstraint.constraints(withVisualFormat: "H:|[state(80)]-[zip]|",
options: [.alignAllTop],
Expand Down Expand Up @@ -336,10 +389,15 @@ extension TextFieldSwiftExample {
selector: #selector(keyboardWillHide(notif:)),
name: .UIKeyboardWillHide,
object: nil)
notificationCenter.addObserver(
self,
selector: #selector(keyboardWillShow(notif:)),
name: .UIKeyboardWillChangeFrame,
object: nil)
}

@objc func keyboardWillShow(notif: Notification) {
guard let frame = notif.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? CGRect else {
guard let frame = notif.userInfo?[UIKeyboardFrameEndUserInfoKey] as? CGRect else {
return
}
scrollView.contentInset = UIEdgeInsets(top: 0.0,
Expand Down
62 changes: 60 additions & 2 deletions components/TextFields/examples/TextFieldFilledExample.swift
Expand Up @@ -91,6 +91,10 @@ final class TextFieldFilledSwiftExample: UIViewController {
fatalError("init(coder:) has not been implemented")
}

deinit {
NotificationCenter.default.removeObserver(self)
}

override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = UIColor(white:0.97, alpha: 1.0)
Expand Down Expand Up @@ -165,7 +169,7 @@ final class TextFieldFilledSwiftExample: UIViewController {
"phone": phone,
"message": message ]
var constraints = NSLayoutConstraint.constraints(withVisualFormat:
"V:|-20-[name]-[address]-[city]-[stateZip]-[phone]-[message]-|",
"V:[name]-[address]-[city]-[stateZip]-[phone]-[message]",
options: [.alignAllLeading, .alignAllTrailing],
metrics: nil,
views: views)
Expand All @@ -188,6 +192,55 @@ final class TextFieldFilledSwiftExample: UIViewController {
options: [],
metrics: nil,
views: views)
#if swift(>=3.2)
if #available(iOS 11.0, *) {
constraints += [NSLayoutConstraint(item: name,
attribute: .top,
relatedBy: .equal,
toItem: scrollView.contentLayoutGuide,
attribute: .top,
multiplier: 1,
constant: 20),
NSLayoutConstraint(item: message,
attribute: .bottom,
relatedBy: .equal,
toItem: scrollView.contentLayoutGuide,
attribute: .bottomMargin,
multiplier: 1,
constant: -20)]
} else {
constraints += [NSLayoutConstraint(item: name,
attribute: .top,
relatedBy: .equal,
toItem: scrollView,
attribute: .top,
multiplier: 1,
constant: 20),
NSLayoutConstraint(item: message,
attribute: .bottom,
relatedBy: .equal,
toItem: scrollView,
attribute: .bottomMargin,
multiplier: 1,
constant: -20)]
}
#else
constraints += [NSLayoutConstraint(item: name,
attribute: .top,
relatedBy: .equal,
toItem: scrollView,
attribute: .top,
multiplier: 1,
constant: 20),
NSLayoutConstraint(item: message,
attribute: .bottom,
relatedBy: .equal,
toItem: scrollView,
attribute: .bottomMargin,
multiplier: 1,
constant: -20)]

#endif

let stateZipViews = [ "state": state, "zip": zip ]
constraints += NSLayoutConstraint.constraints(withVisualFormat: "H:|[state(80)]-[zip]|",
Expand Down Expand Up @@ -330,6 +383,11 @@ extension TextFieldFilledSwiftExample {
selector: #selector(keyboardWillShow(notif:)),
name: .UIKeyboardWillShow,
object: nil)
notificationCenter.addObserver(
self,
selector: #selector(keyboardWillShow(notif:)),
name: .UIKeyboardWillChangeFrame,
object: nil)
notificationCenter.addObserver(
self,
selector: #selector(keyboardWillHide(notif:)),
Expand All @@ -338,7 +396,7 @@ extension TextFieldFilledSwiftExample {
}

@objc func keyboardWillShow(notif: Notification) {
guard let frame = notif.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? CGRect else {
guard let frame = notif.userInfo?[UIKeyboardFrameEndUserInfoKey] as? CGRect else {
return
}
scrollView.contentInset = UIEdgeInsets(top: 0.0,
Expand Down
Expand Up @@ -92,6 +92,10 @@ final class TextFieldKitchenSinkSwiftExample: UIViewController {
lazy var clearModeButton: MDCButton = self.setupButton()
lazy var underlineButton: MDCButton = self.setupButton()

deinit {
NotificationCenter.default.removeObserver(self)
}

override func viewDidLoad() {
super.viewDidLoad()
setupExampleViews()
Expand Down

0 comments on commit 90e79dd

Please sign in to comment.