123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237 |
- /*
- * 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/AutocompleteBaseViewController.h"
- #import "GooglePlacesDemos/Samples/PagingPhotoView.h"
- @implementation AutocompleteBaseViewController {
- PagingPhotoView *_photoView;
- UIButton *_photoButton;
- UITextView *_textView;
- }
- - (void)viewDidLoad {
- [super viewDidLoad];
- // Configure a background color.
- #if defined(__IPHONE_13_0) && (__IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_13_0)
- if (@available(iOS 13.0, *)) {
- self.view.backgroundColor = [UIColor systemBackgroundColor];
- } else {
- self.view.backgroundColor = [UIColor whiteColor];
- }
- #else
- self.view.backgroundColor = [UIColor whiteColor];
- #endif // defined(__IPHONE_13_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_13_0
- // Configure the UI. Tell our superclass we want a button and a result view below that.
- _photoButton =
- [self createButton:@selector(showPhotosButtonTapped)
- title:NSLocalizedString(@"Demo.Title.Photos", @"Button title for 'Photos'")];
- // Create a text view.
- _textView = [[UITextView alloc] init];
- _textView.editable = NO;
- _textView.translatesAutoresizingMaskIntoConstraints = NO;
- [self addResultTextView];
- // Configure the photo view where we are going to display the loaded photos.
- _photoView = [[PagingPhotoView alloc] initWithFrame:self.view.bounds];
- _photoView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
- [self.view addSubview:_photoView];
- // Reset the various views to their initial states.
- [self resetViews];
- }
- - (UIButton *)createShowAutocompleteButton:(SEL)selector {
- return [self createButton:selector
- title:NSLocalizedString(@"Demo.Content.Autocomplete.ShowWidgetButton",
- @"Button title for 'show autocomplete widget'")];
- }
- - (NSString *)openStatusTextFromPlace:(GMSPlace *)place {
- GMSPlaceOpenStatus openStatus = [place isOpen];
- switch (openStatus) {
- case GMSPlaceOpenStatusOpen:
- return @"Open";
- case GMSPlaceOpenStatusClosed:
- return @"Closed";
- case GMSPlaceOpenStatusUnknown:
- return @"Unknown";
- }
- }
- - (void)autocompleteDidSelectPlace:(GMSPlace *)place {
- NSMutableAttributedString *text =
- [[NSMutableAttributedString alloc] initWithString:[place description]];
- [text appendAttributedString:[[NSAttributedString alloc] initWithString:@"\nPlace status: "]];
- NSString *openStatusText = [self openStatusTextFromPlace:place];
- [text appendAttributedString:[[NSAttributedString alloc] initWithString:openStatusText]];
- NSAttributedString *attributions = place.attributions;
- if (attributions) {
- NSAttributedString *doubleReturn = [[NSAttributedString alloc] initWithString:@"\n\n"];
- [text appendAttributedString:doubleReturn];
- [text appendAttributedString:attributions];
- }
- #if defined(__IPHONE_13_0) && (__IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_13_0)
- if (@available(iOS 13.0, *)) {
- [text addAttribute:NSForegroundColorAttributeName
- value:[UIColor labelColor]
- range:NSMakeRange(0, text.length)];
- }
- #endif
- _textView.attributedText = text;
- [_textView setIsAccessibilityElement:YES];
- [_textView setHidden:NO];
- // Show the photo button be start disabled until the photos have loaded.
- [_photoButton setIsAccessibilityElement:YES];
- [_photoButton setHidden:NO];
- [_photoButton setEnabled:NO];
- if (place.photos.count > 0) {
- [self preloadPhotoList:place.photos];
- }
- }
- - (void)autocompleteDidFail:(NSError *)error {
- NSString *formatString =
- NSLocalizedString(@"Demo.Content.Autocomplete.FailedErrorMessage",
- @"Format string for 'autocomplete failed with error' message");
- _textView.text = [NSString stringWithFormat:formatString, error];
- }
- - (void)autocompleteDidCancel {
- _textView.text = NSLocalizedString(@"Demo.Content.Autocomplete.WasCanceledMessage",
- @"String for 'autocomplete canceled message'");
- }
- - (void)showCustomMessageInResultPane:(NSString *)message {
- _textView.text = message;
- }
- - (void)resetViews {
- _photoView.photoList = @[];
- [_textView setText:@""];
- [_textView setIsAccessibilityElement:NO];
- [_textView setHidden:NO];
- [_photoButton setIsAccessibilityElement:NO];
- [_photoButton setHidden:YES];
- [_photoView setHidden:YES];
- }
- #pragma mark - Private
- - (void)addResultTextView {
- NSAssert(_textView.superview == nil, @"%s should not be called twice", sel_getName(_cmd));
- [self.view addSubview:_textView];
- // Check to see if we can use readableContentGuide from iOS 9+
- if ([self.view respondsToSelector:@selector(readableContentGuide)]) {
- // Position it horizontally so it fills the readableContentGuide. Use the new anchor-based
- // system because we know this code will only run on iOS 9+.
- [self.view.readableContentGuide.leadingAnchor constraintEqualToAnchor:_textView.leadingAnchor]
- .active = YES;
- [self.view.readableContentGuide.trailingAnchor constraintEqualToAnchor:_textView.trailingAnchor]
- .active = YES;
- // Set the textContainerInset to 0 because the readableContentGuide is already handling the
- // inset.
- _textView.textContainerInset = UIEdgeInsetsZero;
- } else {
- // Position it horizontally so it fills the parent.
- [self.view
- addConstraints:[NSLayoutConstraint
- constraintsWithVisualFormat:@"H:|-(0)-[_textView]-(0)-|"
- options:0
- metrics:nil
- views:NSDictionaryOfVariableBindings(_textView)]];
- }
- // If we have a view place it below that.
- [self.view addConstraints:[NSLayoutConstraint
- constraintsWithVisualFormat:@"V:[_photoButton]-[_textView]-(0)-|"
- options:0
- metrics:nil
- views:NSDictionaryOfVariableBindings(
- _photoButton, _textView)]];
- }
- - (UIButton *)createButton:(SEL)selector title:(NSString *)title {
- // Create a button to show the autocomplete widget.
- UIButton *button = [UIButton buttonWithType:UIButtonTypeSystem];
- [button setTitle:title forState:UIControlStateNormal];
- // Set the text color to adapt to light and dark mode on iOS 13+ devices
- // Otherwise, set the text color to black
- #if defined(__IPHONE_13_0) && (__IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_13_0)
- if (@available(iOS 13.0, *)) {
- [button setTitleColor:[UIColor labelColor] forState:UIControlStateNormal];
- } else {
- [button setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
- }
- #else
- self.view.backgroundColor = [UIColor whiteColor];
- #endif // defined(__IPHONE_13_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_13_0
- [button addTarget:self action:selector forControlEvents:UIControlEventTouchUpInside];
- button.translatesAutoresizingMaskIntoConstraints = NO;
- [self.view addSubview:button];
- // Position the button from the top of the view.
- [button.centerXAnchor constraintEqualToAnchor:self.view.centerXAnchor].active = YES;
- [button.topAnchor constraintEqualToAnchor:self.view.topAnchor constant:kButtonTopMargin].active =
- YES;
- [button.heightAnchor constraintEqualToConstant:kButtonHeight].active = YES;
- [button.widthAnchor constraintEqualToConstant:kButtonWidth].active = YES;
- return button;
- }
- - (void)showPhotosButtonTapped {
- [_textView setIsAccessibilityElement:NO];
- [_textView setHidden:YES];
- [_photoButton setIsAccessibilityElement:NO];
- [_photoButton setHidden:YES];
- [_photoView setHidden:NO];
- }
- // Preload the photos to be displayed.
- - (void)preloadPhotoList:(NSArray<GMSPlacePhotoMetadata *> *)photos {
- __block NSMutableArray *attributedPhotos = [NSMutableArray array];
- __block NSInteger photoRequestsInFlight = photos.count;
- for (GMSPlacePhotoMetadata *photo in photos) {
- [[GMSPlacesClient sharedClient] loadPlacePhoto:photo
- callback:^(UIImage *photoImage, NSError *error) {
- photoRequestsInFlight--;
- if (photoImage == nil) {
- NSLog(@"Photo request failed with error: %@", error);
- } else {
- AttributedPhoto *attributedPhoto =
- [[AttributedPhoto alloc] init];
- attributedPhoto.image = photoImage;
- attributedPhoto.attributions = photo.attributions;
- [attributedPhotos addObject:attributedPhoto];
- }
- if (photoRequestsInFlight == 0) {
- _photoView.photoList = attributedPhotos;
- [_photoButton setEnabled:YES];
- }
- }];
- }
- }
- @end
|