// 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