mirror of
https://github.com/material-components/material-components-ios.git
synced 2026-02-20 08:27:32 +08:00
234 lines
9.3 KiB
Objective-C
234 lines
9.3 KiB
Objective-C
// Copyright 2016-present the Material Components for iOS authors. 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 "MaterialButtons+ButtonThemer.h"
|
|
#import "MaterialButtons+ColorThemer.h"
|
|
#import "MaterialButtons+Theming.h"
|
|
#import "MaterialButtons+TypographyThemer.h"
|
|
#import "MaterialButtons.h"
|
|
#import "MaterialContainerScheme.h"
|
|
#import "MaterialTypography.h"
|
|
|
|
#import "supplemental/ButtonsTypicalUseSupplemental.h"
|
|
|
|
const CGSize kMinimumAccessibleButtonSize = {64.0, 48.0};
|
|
|
|
@interface ButtonsTypicalUseExampleViewController ()
|
|
@property(nonatomic, strong) MDCFloatingButton *floatingButton;
|
|
@end
|
|
|
|
@implementation ButtonsTypicalUseExampleViewController
|
|
|
|
- (id)init {
|
|
self = [super init];
|
|
if (self) {
|
|
self.colorScheme =
|
|
[[MDCSemanticColorScheme alloc] initWithDefaults:MDCColorSchemeDefaultsMaterial201804];
|
|
self.shapeScheme =
|
|
[[MDCShapeScheme alloc] initWithDefaults:MDCShapeSchemeDefaultsMaterial201809];
|
|
self.typographyScheme =
|
|
[[MDCTypographyScheme alloc] initWithDefaults:MDCTypographySchemeDefaultsMaterial201804];
|
|
self.containerScheme = [[MDCContainerScheme alloc] init];
|
|
self.containerScheme.colorScheme = self.colorScheme;
|
|
self.containerScheme.shapeScheme = self.shapeScheme;
|
|
self.containerScheme.typographyScheme = self.typographyScheme;
|
|
}
|
|
return self;
|
|
}
|
|
|
|
- (MDCContainerScheme *)containerScheme {
|
|
MDCContainerScheme *scheme = [[MDCContainerScheme alloc] init];
|
|
scheme.colorScheme = self.colorScheme;
|
|
scheme.shapeScheme = self.shapeScheme;
|
|
scheme.typographyScheme = self.typographyScheme;
|
|
return scheme;
|
|
}
|
|
|
|
- (void)viewDidLoad {
|
|
[super viewDidLoad];
|
|
|
|
self.view.backgroundColor = [UIColor whiteColor];
|
|
|
|
MDCButtonScheme *buttonScheme = [[MDCButtonScheme alloc] init];
|
|
buttonScheme.colorScheme = self.colorScheme;
|
|
buttonScheme.shapeScheme = self.shapeScheme;
|
|
buttonScheme.typographyScheme = self.typographyScheme;
|
|
|
|
// Contained button
|
|
|
|
MDCButton *containedButton = [[MDCButton alloc] init];
|
|
[containedButton setTitle:@"Button" forState:UIControlStateNormal];
|
|
[containedButton applyContainedThemeWithScheme:self.containerScheme];
|
|
[containedButton sizeToFit];
|
|
CGFloat containedButtonVerticalInset =
|
|
MIN(0, -(kMinimumAccessibleButtonSize.height - CGRectGetHeight(containedButton.bounds)) / 2);
|
|
CGFloat containedButtonHorizontalInset =
|
|
MIN(0, -(kMinimumAccessibleButtonSize.width - CGRectGetWidth(containedButton.bounds)) / 2);
|
|
containedButton.hitAreaInsets =
|
|
UIEdgeInsetsMake(containedButtonVerticalInset, containedButtonHorizontalInset,
|
|
containedButtonVerticalInset, containedButtonHorizontalInset);
|
|
[containedButton addTarget:self
|
|
action:@selector(didTap:)
|
|
forControlEvents:UIControlEventTouchUpInside];
|
|
[self.view addSubview:containedButton];
|
|
|
|
// Disabled contained button
|
|
|
|
MDCButton *disabledContainedButton = [[MDCButton alloc] init];
|
|
[disabledContainedButton setTitle:@"Button" forState:UIControlStateNormal];
|
|
[disabledContainedButton applyContainedThemeWithScheme:self.containerScheme];
|
|
[disabledContainedButton sizeToFit];
|
|
[disabledContainedButton addTarget:self
|
|
action:@selector(didTap:)
|
|
forControlEvents:UIControlEventTouchUpInside];
|
|
[disabledContainedButton setEnabled:NO];
|
|
[self.view addSubview:disabledContainedButton];
|
|
|
|
// Text button
|
|
|
|
MDCButton *textButton = [[MDCButton alloc] init];
|
|
[textButton applyTextThemeWithScheme:self.containerScheme];
|
|
[textButton setTitle:@"Button" forState:UIControlStateNormal];
|
|
[textButton sizeToFit];
|
|
CGFloat textButtonVerticalInset =
|
|
MIN(0, -(kMinimumAccessibleButtonSize.height - CGRectGetHeight(textButton.bounds)) / 2);
|
|
CGFloat textButtonHorizontalInset =
|
|
MIN(0, -(kMinimumAccessibleButtonSize.width - CGRectGetWidth(textButton.bounds)) / 2);
|
|
textButton.hitAreaInsets =
|
|
UIEdgeInsetsMake(textButtonVerticalInset, textButtonHorizontalInset,
|
|
textButtonVerticalInset, textButtonHorizontalInset);
|
|
[textButton addTarget:self
|
|
action:@selector(didTap:)
|
|
forControlEvents:UIControlEventTouchUpInside];
|
|
[self.view addSubview:textButton];
|
|
|
|
// Disabled Text button
|
|
|
|
MDCButton *disabledTextButton = [[MDCButton alloc] init];
|
|
[disabledTextButton setTitle:@"Button" forState:UIControlStateNormal];
|
|
[disabledTextButton applyTextThemeWithScheme:self.containerScheme];
|
|
[disabledTextButton sizeToFit];
|
|
[disabledTextButton addTarget:self
|
|
action:@selector(didTap:)
|
|
forControlEvents:UIControlEventTouchUpInside];
|
|
[disabledTextButton setEnabled:NO];
|
|
[self.view addSubview:disabledTextButton];
|
|
|
|
// Outlined button
|
|
|
|
MDCButton *outlinedButton = [[MDCButton alloc] init];
|
|
[outlinedButton setTitle:@"Button" forState:UIControlStateNormal];
|
|
[outlinedButton applyOutlinedThemeWithScheme:self.containerScheme];
|
|
[outlinedButton sizeToFit];
|
|
CGFloat outlineButtonVerticalInset =
|
|
MIN(0, -(kMinimumAccessibleButtonSize.height - CGRectGetHeight(outlinedButton.frame)) / 2);
|
|
CGFloat outlineButtonHorizontalInset =
|
|
MIN(0, -(kMinimumAccessibleButtonSize.width - CGRectGetWidth(outlinedButton.frame)) / 2);
|
|
outlinedButton.hitAreaInsets =
|
|
UIEdgeInsetsMake(outlineButtonVerticalInset, outlineButtonHorizontalInset,
|
|
outlineButtonVerticalInset, outlineButtonHorizontalInset);
|
|
[outlinedButton addTarget:self
|
|
action:@selector(didTap:)
|
|
forControlEvents:UIControlEventTouchUpInside];
|
|
[self.view addSubview:outlinedButton];
|
|
|
|
// Disabled outlined button
|
|
|
|
MDCButton *disabledOutlinedButton = [[MDCButton alloc] init];
|
|
[disabledOutlinedButton setTitle:@"Button" forState:UIControlStateNormal];
|
|
[disabledOutlinedButton applyOutlinedThemeWithScheme:self.containerScheme];
|
|
[disabledOutlinedButton sizeToFit];
|
|
[disabledOutlinedButton addTarget:self
|
|
action:@selector(didTap:)
|
|
forControlEvents:UIControlEventTouchUpInside];
|
|
[disabledOutlinedButton setEnabled:NO];
|
|
[self.view addSubview:disabledOutlinedButton];
|
|
|
|
// Floating action button
|
|
|
|
self.floatingButton = [[MDCFloatingButton alloc] init];
|
|
[self.floatingButton sizeToFit];
|
|
[self.floatingButton addTarget:self
|
|
action:@selector(didTap:)
|
|
forControlEvents:UIControlEventTouchUpInside];
|
|
|
|
UIImage *plusImage =
|
|
[[UIImage imageNamed:@"Plus"] imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
|
|
[self.floatingButton setImage:plusImage forState:UIControlStateNormal];
|
|
[self.floatingButton applySecondaryThemeWithScheme:[self containerScheme]];
|
|
self.floatingButton.accessibilityLabel = @"Create";
|
|
[self.view addSubview:self.floatingButton];
|
|
|
|
self.buttons = @[
|
|
containedButton, disabledContainedButton, textButton, disabledTextButton, outlinedButton,
|
|
disabledOutlinedButton,self.floatingButton
|
|
];
|
|
|
|
[self setupExampleViews];
|
|
|
|
NSMutableArray *accessibilityElements = [@[] mutableCopy];
|
|
for (NSUInteger index = 0; index < self.buttons.count; ++index) {
|
|
[accessibilityElements addObject:self.labels[index]];
|
|
[accessibilityElements addObject:self.buttons[index]];
|
|
}
|
|
self.view.accessibilityElements = [accessibilityElements copy];
|
|
}
|
|
|
|
- (void)setupExampleViews {
|
|
UILabel *containedButtonLabel = [self addLabelWithText:@"Contained"];
|
|
UILabel *disabledContainedButtonLabel = [self addLabelWithText:@"Disabled Contained"];
|
|
UILabel *textButtonLabel = [self addLabelWithText:@"Text button"];
|
|
UILabel *disabledTextButtonLabel = [self addLabelWithText:@"Disabled text button"];
|
|
UILabel *outlinedButtonLabel = [self addLabelWithText:@"Outlined"];
|
|
UILabel *disabledOutlinedButtonLabel = [self addLabelWithText:@"Disabled Outlined"];
|
|
UILabel *floatingButtonLabel = [self addLabelWithText:@"Floating Action"];
|
|
|
|
self.labels = @[
|
|
containedButtonLabel, disabledContainedButtonLabel, textButtonLabel, disabledTextButtonLabel,
|
|
outlinedButtonLabel, disabledOutlinedButtonLabel, floatingButtonLabel
|
|
];
|
|
}
|
|
|
|
- (void)didTap:(id)sender {
|
|
NSLog(@"%@ was tapped.", NSStringFromClass([sender class]));
|
|
if (!UIAccessibilityIsVoiceOverRunning()) {
|
|
if (sender == self.floatingButton) {
|
|
[self.floatingButton
|
|
collapse:YES
|
|
completion:^{
|
|
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)),
|
|
dispatch_get_main_queue(), ^{
|
|
[self.floatingButton expand:YES completion:nil];
|
|
});
|
|
}];
|
|
}
|
|
}
|
|
}
|
|
|
|
- (void)viewWillAppear:(BOOL)animated {
|
|
[super viewWillAppear:animated];
|
|
if (animated && !UIAccessibilityIsVoiceOverRunning()) {
|
|
[self.floatingButton collapse:NO completion:nil];
|
|
}
|
|
}
|
|
|
|
- (void)viewDidAppear:(BOOL)animated {
|
|
[super viewDidAppear:animated];
|
|
if (animated && !UIAccessibilityIsVoiceOverRunning()) {
|
|
[self.floatingButton expand:YES completion:nil];
|
|
}
|
|
}
|
|
|
|
@end
|