blob: 6b29ceb47546abc7ddab735a61eb5ed7af77ebf9 [file] [log] [blame]
// 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