| // Copyright 2014 The Flutter Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #import "NativeViewController.h" |
| |
| @interface NativeViewController () |
| |
| @end |
| |
| @implementation NativeViewController { |
| int _counter; |
| UILabel* _incrementLabel; |
| } |
| |
| - (instancetype)initWithDelegate:(id<NativeViewControllerDelegate>)delegate { |
| self = [super initWithNibName:nil bundle:nil]; |
| if (self) { |
| self.delegate = delegate; |
| } |
| return self; |
| } |
| |
| - (instancetype)initWithCoder:(NSCoder *)aDecoder { |
| return [self initWithDelegate:nil]; |
| } |
| |
| -(instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { |
| return [self initWithDelegate:nil]; |
| } |
| |
| - (void)viewDidLoad { |
| [super viewDidLoad]; |
| |
| self.title = @"Native iOS View"; |
| self.view.backgroundColor = UIColor.lightGrayColor; |
| self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] |
| initWithTitle:@"Back" |
| style:UIBarButtonItemStylePlain |
| target:nil |
| action:nil]; |
| |
| _incrementLabel = [self addIncrementLabel]; |
| UIStackView* footer = [self addFooter]; |
| |
| _incrementLabel.translatesAutoresizingMaskIntoConstraints = false; |
| footer.translatesAutoresizingMaskIntoConstraints = false; |
| UILayoutGuide* marginsGuide = self.view.layoutMarginsGuide; |
| NSMutableArray* array = [[NSMutableArray alloc] init]; |
| [array addObject:[_incrementLabel.centerXAnchor |
| constraintEqualToAnchor:self.view.centerXAnchor]]; |
| [array addObject:[_incrementLabel.centerYAnchor |
| constraintEqualToAnchor:self.view.centerYAnchor]]; |
| [array addObject:[footer.centerXAnchor |
| constraintEqualToAnchor:self.view.centerXAnchor]]; |
| [array addObject:[footer.widthAnchor |
| constraintEqualToAnchor:marginsGuide.widthAnchor]]; |
| [array addObject:[footer.bottomAnchor |
| constraintEqualToAnchor:marginsGuide.bottomAnchor]]; |
| |
| [NSLayoutConstraint activateConstraints:array]; |
| [self updateIncrementLabel]; |
| } |
| |
| /// Adds a label to the view that will contain the counter text. |
| /// |
| /// - Returns: The new label. |
| -(UILabel*) addIncrementLabel { |
| UILabel* incrementLabel = [[UILabel alloc] init]; |
| incrementLabel.font = [UIFont preferredFontForTextStyle:UIFontTextStyleBody]; |
| incrementLabel.textColor = UIColor.blackColor; |
| incrementLabel.accessibilityIdentifier = @"counter_on_iOS"; |
| [self.view addSubview:incrementLabel]; |
| return incrementLabel; |
| } |
| |
| /// Adds a horizontal stack to the view, anchored to the bottom. |
| /// |
| /// - Returns: The new stack. |
| -(UIStackView*) addFooter { |
| UILabel* mainLabel = [self createMainLabel]; |
| UIButton* incrementButton = [self createIncrementButton]; |
| UIStackView* stackView = [[UIStackView alloc] initWithFrame:self.view.frame]; |
| [stackView addArrangedSubview:mainLabel]; |
| [stackView addArrangedSubview:incrementButton]; |
| stackView.axis = UILayoutConstraintAxisHorizontal; |
| stackView.alignment = UIStackViewAlignmentBottom; |
| [self.view addSubview:stackView]; |
| return stackView; |
| } |
| |
| /// Creates a label identifying this view. Does not add it to the view. |
| /// |
| /// - Returns: The new label. |
| -(UILabel*) createMainLabel { |
| UILabel* mainLabel = [[UILabel alloc] init]; |
| mainLabel.font = [UIFont preferredFontForTextStyle:UIFontTextStyleTitle1]; |
| mainLabel.textColor = UIColor.blackColor; |
| mainLabel.text = @"Native"; |
| return mainLabel; |
| } |
| |
| /// Creates a button that will increment a counter. Does not add it to the view. |
| /// |
| /// - Returns: The new button. |
| -(UIButton*) createIncrementButton { |
| UIButton *incrementButton = [UIButton buttonWithType:UIButtonTypeSystem]; |
| incrementButton.titleLabel.font = [UIFont preferredFontForTextStyle:UIFontTextStyleTitle2]; |
| [incrementButton setTitle:@"Add" forState:UIControlStateNormal]; |
| incrementButton.accessibilityLabel = @"Increment via iOS"; |
| incrementButton.layer.cornerRadius = 15.0; |
| [incrementButton addTarget:self |
| action:@selector(handleIncrement:) |
| forControlEvents:UIControlEventTouchUpInside]; |
| return incrementButton; |
| } |
| |
| // MARK: - Actions |
| |
| /// Action triggered from tapping on the increment button. Triggers a corresponding event in the |
| /// delegate if one is available, otherwise increments our internal counter. |
| -(void) handleIncrement:(UIButton*)sender { |
| if (self.delegate) { |
| [self.delegate didTapIncrementButton]; |
| } else { |
| [self didReceiveIncrement]; |
| } |
| } |
| |
| /// Updates the increment label text to match the increment counter. |
| -(void) updateIncrementLabel { |
| _incrementLabel.text = [NSString |
| stringWithFormat:@"%@ tapped %d %@.", |
| self.delegate == nil ? @"Button" : @"Flutter button", |
| _counter, _counter == 1 ? @"time" : @"times"]; |
| } |
| |
| /// Increments our internal counter and updates the view. |
| -(void) didReceiveIncrement { |
| _counter += 1; |
| [self updateIncrementLabel]; |
| } |
| |
| @end |