123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173 |
- //
- // FLEXExplorerToolbarItem.m
- // Flipboard
- //
- // Created by Ryan Olson on 4/4/14.
- // Copyright (c) 2020 FLEX Team. All rights reserved.
- //
- #import "FLEXColor.h"
- #import "FLEXExplorerToolbarItem.h"
- #import "FLEXUtility.h"
- @interface FLEXExplorerToolbarItem ()
- @property (nonatomic) FLEXExplorerToolbarItem *sibling;
- @property (nonatomic, copy) NSString *title;
- @property (nonatomic) UIImage *image;
- @property (nonatomic, readonly, class) UIColor *defaultBackgroundColor;
- @property (nonatomic, readonly, class) UIColor *highlightedBackgroundColor;
- @property (nonatomic, readonly, class) UIColor *selectedBackgroundColor;
- @end
- @implementation FLEXExplorerToolbarItem
- #pragma mark - Public
- + (instancetype)itemWithTitle:(NSString *)title image:(UIImage *)image {
- return [self itemWithTitle:title image:image sibling:nil];
- }
- + (instancetype)itemWithTitle:(NSString *)title image:(UIImage *)image sibling:(FLEXExplorerToolbarItem *)backupItem {
- #if !TARGET_OS_TV
- NSParameterAssert(title); NSParameterAssert(image);
- #endif
-
- FLEXExplorerToolbarItem *toolbarItem = [self buttonWithType:UIButtonTypeSystem];
- toolbarItem.sibling = backupItem;
- toolbarItem.title = title;
- toolbarItem.image = image;
- toolbarItem.tintColor = FLEXColor.iconColor;
- toolbarItem.backgroundColor = self.defaultBackgroundColor;
- toolbarItem.titleLabel.font = [UIFont systemFontOfSize:12.0];
- [toolbarItem setTitle:title forState:UIControlStateNormal];
- [toolbarItem setImage:image forState:UIControlStateNormal];
- #if !TARGET_OS_TV
- [toolbarItem setTitleColor:FLEXColor.primaryTextColor forState:UIControlStateNormal];
- #endif
- [toolbarItem setTitleColor:FLEXColor.deemphasizedTextColor forState:UIControlStateDisabled];
- return toolbarItem;
- }
- - (FLEXExplorerToolbarItem *)currentItem {
- if (!self.enabled && self.sibling) {
- return self.sibling.currentItem;
- }
-
- return self;
- }
- #pragma mark - Display Defaults
- + (NSDictionary<NSString *, id> *)titleAttributes {
- return @{ NSFontAttributeName : [UIFont systemFontOfSize:12.0] };
- }
- + (UIColor *)highlightedBackgroundColor {
- return FLEXColor.toolbarItemHighlightedColor;
- }
- + (UIColor *)selectedBackgroundColor {
- return FLEXColor.toolbarItemSelectedColor;
- }
- + (UIColor *)defaultBackgroundColor {
- return UIColor.clearColor;
- }
- + (CGFloat)topMargin {
- return 20.0;
- }
- #pragma mark - State Changes
- - (void)setHighlighted:(BOOL)highlighted {
- super.highlighted = highlighted;
- [self updateColors];
- }
- - (void)setSelected:(BOOL)selected {
- super.selected = selected;
- [self updateColors];
- }
- - (void)setEnabled:(BOOL)enabled {
- if (self.enabled != enabled) {
- if (self.sibling) {
- if (enabled) { // Replace sibling with myself
- UIView *superview = self.sibling.superview;
- [self.sibling removeFromSuperview];
- self.frame = self.sibling.frame;
- [superview addSubview:self];
- } else { // Replace myself with sibling
- UIView *superview = self.superview;
- [self removeFromSuperview];
- self.sibling.frame = self.frame;
- [superview addSubview:self.sibling];
- }
- }
-
- super.enabled = enabled;
- }
- }
- + (id)_selectedIndicatorImage { return nil; }
- - (void)updateColors {
- // Background color
- if (self.highlighted) {
- self.backgroundColor = self.class.highlightedBackgroundColor;
- } else if (self.selected) {
- #if !TARGET_OS_TV
- self.backgroundColor = self.class.selectedBackgroundColor;
- #endif
- } else {
- self.backgroundColor = self.class.defaultBackgroundColor;
- }
- }
- #pragma mark - UIButton Layout Overrides
- - (CGRect)titleRectForContentRect:(CGRect)contentRect {
-
- CGFloat padding = 0;
- CGFloat titleBottomPadding = 0;
- #if TARGET_OS_TV
- padding = 30;
- titleBottomPadding = 5;
- #endif
- NSDictionary *attrs = [[self class] titleAttributes];
- // Bottom aligned and centered.
- CGRect titleRect = CGRectZero;
- CGSize titleSize = [self.title boundingRectWithSize:contentRect.size
- options:0
- attributes:attrs
- context:nil].size;
- titleSize = CGSizeMake(ceil(titleSize.width), ceil(titleSize.height));
- titleRect.size = titleSize;
- titleRect.origin.y = contentRect.origin.y + CGRectGetMaxY(contentRect) - titleSize.height - titleBottomPadding;
- titleRect.origin.x = contentRect.origin.x + FLEXFloor((contentRect.size.width-padding - titleSize.width) / 2.0);
- return titleRect;
- }
- #if !TARGET_OS_TV
- - (CGRect)imageRectForContentRect:(CGRect)contentRect {
- CGSize imageSize = self.image.size;
- CGRect titleRect = [self titleRectForContentRect:contentRect];
- CGFloat availableHeight = contentRect.size.height - titleRect.size.height - [[self class] topMargin];
- CGFloat originY = [[self class] topMargin] + FLEXFloor((availableHeight - imageSize.height) / 2.0);
- CGFloat originX = FLEXFloor((contentRect.size.width - imageSize.width) / 2.0);
- CGRect imageRect = CGRectMake(originX, originY, imageSize.width, imageSize.height);
- return imageRect;
- }
- #endif
- @end
|