You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
219 lines
8.3 KiB
219 lines
8.3 KiB
![]()
2 years ago
|
/*
|
||
|
* Copyright 2016 Google LLC. All rights reserved.
|
||
|
*
|
||
|
*
|
||
|
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this
|
||
|
* file except in compliance with the License. You may obtain a copy of the License at
|
||
|
*
|
||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||
|
*
|
||
|
* Unless required by applicable law or agreed to in writing, software distributed under
|
||
|
* the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
|
||
|
* ANY KIND, either express or implied. See the License for the specific language governing
|
||
|
* permissions and limitations under the License.
|
||
|
*/
|
||
|
|
||
|
#import "GooglePlacesDemos/Samples/Autocomplete/AutocompleteWithTextFieldController.h"
|
||
|
|
||
|
#import <GooglePlaces/GooglePlaces.h>
|
||
|
|
||
|
|
||
|
@interface AutocompleteWithTextFieldController () <UITextFieldDelegate,
|
||
|
GMSAutocompleteTableDataSourceDelegate>
|
||
|
@end
|
||
|
|
||
|
@implementation AutocompleteWithTextFieldController {
|
||
|
UITextField *_searchField;
|
||
|
UITableViewController *_resultsController;
|
||
|
GMSAutocompleteTableDataSource *_tableDataSource;
|
||
|
}
|
||
|
|
||
|
+ (NSString *)demoTitle {
|
||
|
return NSLocalizedString(
|
||
|
@"Demo.Title.Autocomplete.UITextField",
|
||
|
@"Title of the UITextField autocomplete demo for display in a list or nav header");
|
||
|
}
|
||
|
|
||
|
#pragma mark - View Lifecycle
|
||
|
|
||
|
- (void)viewDidLoad {
|
||
|
[super viewDidLoad];
|
||
|
#if defined(__IPHONE_13_0) && (__IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_13_0)
|
||
|
if (@available(iOS 13.0, *)) {
|
||
|
self.view.backgroundColor = [UIColor systemBackgroundColor];
|
||
|
} else {
|
||
|
}
|
||
|
#else
|
||
|
self.view.backgroundColor = [UIColor whiteColor];
|
||
|
#endif // defined(__IPHONE_13_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_13_0
|
||
|
|
||
|
// Configure the text field to our linking.
|
||
|
_searchField = [[UITextField alloc] initWithFrame:CGRectZero];
|
||
|
|
||
|
_searchField.translatesAutoresizingMaskIntoConstraints = NO;
|
||
|
_searchField.borderStyle = UITextBorderStyleNone;
|
||
|
#if defined(__IPHONE_13_0) && (__IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_13_0)
|
||
|
if (@available(iOS 13.0, *)) {
|
||
|
_searchField.backgroundColor = [UIColor systemBackgroundColor];
|
||
|
} else {
|
||
|
_searchField.backgroundColor = [UIColor whiteColor];
|
||
|
}
|
||
|
#else
|
||
|
_searchField.backgroundColor = [UIColor whiteColor];
|
||
|
#endif // defined(__IPHONE_13_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_13_0
|
||
|
_searchField.placeholder = NSLocalizedString(@"Demo.Content.Autocomplete.EnterTextPrompt",
|
||
|
@"Prompt to enter text for autocomplete demo");
|
||
|
_searchField.autocorrectionType = UITextAutocorrectionTypeNo;
|
||
|
_searchField.keyboardType = UIKeyboardTypeDefault;
|
||
|
_searchField.returnKeyType = UIReturnKeyDone;
|
||
|
_searchField.clearButtonMode = UITextFieldViewModeWhileEditing;
|
||
|
_searchField.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter;
|
||
|
|
||
|
[_searchField addTarget:self
|
||
|
action:@selector(textFieldDidChange:)
|
||
|
forControlEvents:UIControlEventEditingChanged];
|
||
|
_searchField.delegate = self;
|
||
|
|
||
|
// Setup the results view controller.
|
||
|
_tableDataSource = [[GMSAutocompleteTableDataSource alloc] init];
|
||
|
_tableDataSource.delegate = self;
|
||
|
_tableDataSource.autocompleteFilter = self.autocompleteFilter;
|
||
|
_tableDataSource.placeFields = self.placeFields;
|
||
|
#if defined(__IPHONE_13_0) && (__IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_13_0)
|
||
|
if (@available(iOS 13.0, *)) {
|
||
|
_tableDataSource.tableCellBackgroundColor = [UIColor systemBackgroundColor];
|
||
|
} else {
|
||
|
_tableDataSource.tableCellBackgroundColor = [UIColor whiteColor];
|
||
|
}
|
||
|
#else
|
||
|
_tableDataSource.tableCellBackgroundColor = [UIColor whiteColor];
|
||
|
#endif // defined(__IPHONE_13_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_13_0
|
||
|
_resultsController = [[UITableViewController alloc] initWithStyle:UITableViewStylePlain];
|
||
|
_resultsController.tableView.delegate = _tableDataSource;
|
||
|
_resultsController.tableView.dataSource = _tableDataSource;
|
||
|
|
||
|
[self.view addSubview:_searchField];
|
||
|
// Use auto layout to place the text field, as we need to take the top layout guide into
|
||
|
// consideration.
|
||
|
[self.view
|
||
|
addConstraints:[NSLayoutConstraint
|
||
|
constraintsWithVisualFormat:@"H:|-[_searchField]-|"
|
||
|
options:0
|
||
|
metrics:nil
|
||
|
views:NSDictionaryOfVariableBindings(_searchField)]];
|
||
|
[NSLayoutConstraint constraintWithItem:_searchField
|
||
|
attribute:NSLayoutAttributeTop
|
||
|
relatedBy:NSLayoutRelationEqual
|
||
|
toItem:self.topLayoutGuide
|
||
|
attribute:NSLayoutAttributeBottom
|
||
|
multiplier:1
|
||
|
constant:8]
|
||
|
.active = YES;
|
||
|
}
|
||
|
|
||
|
#pragma mark - GMSAutocompleteTableDataSourceDelegate
|
||
|
|
||
|
- (void)tableDataSource:(GMSAutocompleteTableDataSource *)tableDataSource
|
||
|
didAutocompleteWithPlace:(GMSPlace *)place {
|
||
|
[self dismissResultsController];
|
||
|
[_searchField resignFirstResponder];
|
||
|
[_searchField setHidden:YES];
|
||
|
[self autocompleteDidSelectPlace:place];
|
||
|
}
|
||
|
|
||
|
- (void)tableDataSource:(GMSAutocompleteTableDataSource *)tableDataSource
|
||
|
didFailAutocompleteWithError:(NSError *)error {
|
||
|
[self dismissResultsController];
|
||
|
[_searchField resignFirstResponder];
|
||
|
[self autocompleteDidFail:error];
|
||
|
_searchField.text = @"";
|
||
|
}
|
||
|
|
||
|
- (void)didRequestAutocompletePredictionsForTableDataSource:
|
||
|
(GMSAutocompleteTableDataSource *)tableDataSource {
|
||
|
[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
|
||
|
[_resultsController.tableView reloadData];
|
||
|
}
|
||
|
|
||
|
- (void)didUpdateAutocompletePredictionsForTableDataSource:
|
||
|
(GMSAutocompleteTableDataSource *)tableDataSource {
|
||
|
[UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
|
||
|
[_resultsController.tableView reloadData];
|
||
|
}
|
||
|
|
||
|
#pragma mark - UITextFieldDelegate
|
||
|
|
||
|
- (void)textFieldDidBeginEditing:(UITextField *)textField {
|
||
|
[self addChildViewController:_resultsController];
|
||
|
|
||
|
// Add the results controller.
|
||
|
_resultsController.view.translatesAutoresizingMaskIntoConstraints = NO;
|
||
|
_resultsController.view.alpha = 0.0f;
|
||
|
[self.view addSubview:_resultsController.view];
|
||
|
|
||
|
// Layout it out below the text field using auto layout.
|
||
|
[self.view addConstraints:[NSLayoutConstraint
|
||
|
constraintsWithVisualFormat:@"V:[_searchField]-[resultView]-(0)-|"
|
||
|
options:0
|
||
|
metrics:nil
|
||
|
views:@{
|
||
|
@"_searchField" : _searchField,
|
||
|
@"resultView" : _resultsController.view
|
||
|
}]];
|
||
|
[self.view
|
||
|
addConstraints:[NSLayoutConstraint
|
||
|
constraintsWithVisualFormat:@"H:|-(0)-[resultView]-(0)-|"
|
||
|
options:0
|
||
|
metrics:nil
|
||
|
views:@{@"resultView" : _resultsController.view}]];
|
||
|
|
||
|
// Force a layout pass otherwise the table will animate in weirdly.
|
||
|
[self.view layoutIfNeeded];
|
||
|
|
||
|
// Reload the data.
|
||
|
[_resultsController.tableView reloadData];
|
||
|
|
||
|
// Animate in the results.
|
||
|
[UIView animateWithDuration:0.5
|
||
|
animations:^{
|
||
|
_resultsController.view.alpha = 1.0f;
|
||
|
}
|
||
|
completion:^(BOOL finished) {
|
||
|
[_resultsController didMoveToParentViewController:self];
|
||
|
}];
|
||
|
}
|
||
|
|
||
|
- (BOOL)textFieldShouldReturn:(UITextField *)textField {
|
||
|
[textField resignFirstResponder];
|
||
|
return NO;
|
||
|
}
|
||
|
|
||
|
- (BOOL)textFieldShouldClear:(UITextField *)textField {
|
||
|
[self dismissResultsController];
|
||
|
[textField resignFirstResponder];
|
||
|
textField.text = @"";
|
||
|
[_tableDataSource clearResults];
|
||
|
return NO;
|
||
|
}
|
||
|
|
||
|
#pragma mark - Private Methods
|
||
|
|
||
|
- (void)textFieldDidChange:(UITextField *)textField {
|
||
|
[_tableDataSource sourceTextHasChanged:textField.text];
|
||
|
}
|
||
|
|
||
|
- (void)dismissResultsController {
|
||
|
// Dismiss the results.
|
||
|
[_resultsController willMoveToParentViewController:nil];
|
||
|
[UIView animateWithDuration:0.5
|
||
|
animations:^{
|
||
|
_resultsController.view.alpha = 0.0f;
|
||
|
}
|
||
|
completion:^(BOOL finished) {
|
||
|
[_resultsController.view removeFromSuperview];
|
||
|
[_resultsController removeFromParentViewController];
|
||
|
}];
|
||
|
}
|
||
|
|
||
|
@end
|