Files
FSPopoverView/PopoverView/PopoverViewCell.m
T
2018-01-23 15:03:02 +08:00

101 lines
4.3 KiB
Objective-C

#import "PopoverViewCell.h"
// extern
float const PopoverViewCellHorizontalMargin = 15.f; ///< 水平边距
float const PopoverViewCellVerticalMargin = 3.f; ///< 垂直边距
float const PopoverViewCellTitleLeftEdge = 8.f; ///< 标题左边边距
@interface PopoverViewCell ()
@property (nonatomic, strong) UIButton *button;
@property (nonatomic, weak) UIView *bottomLine;
@end
@implementation PopoverViewCell
#pragma mark - Life Cycle
- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
if (!(self = [super initWithStyle:style reuseIdentifier:reuseIdentifier])) return nil;
self.backgroundColor = [UIColor clearColor];
self.contentView.backgroundColor = self.backgroundColor;
self.selectionStyle = UITableViewCellSelectionStyleNone;
// initialize
[self initialize];
return self;
}
- (void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated {
[super setHighlighted:highlighted animated:animated];
if (highlighted) {
self.backgroundColor = _style == PopoverViewStyleDefault ? [UIColor colorWithRed:0.90 green:0.90 blue:0.90 alpha:1.00] : [UIColor colorWithRed:0.23 green:0.23 blue:0.23 alpha:1.00];
} else {
[UIView animateWithDuration:0.3f animations:^{
self.backgroundColor = [UIColor clearColor];
}];
}
}
#pragma mark - Setter
- (void)setStyle:(PopoverViewStyle)style {
_style = style;
_bottomLine.backgroundColor = [self.class bottomLineColorForStyle:style];
if (_style == PopoverViewStyleDefault) {
[_button setTitleColor:UIColor.blackColor forState:UIControlStateNormal];
} else {
[_button setTitleColor:UIColor.whiteColor forState:UIControlStateNormal];
}
}
#pragma mark - Private
// 初始化
- (void)initialize {
// UI
_button = [UIButton buttonWithType:UIButtonTypeCustom];
_button.userInteractionEnabled = NO; // has no use for UserInteraction.
_button.translatesAutoresizingMaskIntoConstraints = NO;
_button.titleLabel.font = [self.class titleFont];
_button.backgroundColor = self.contentView.backgroundColor;
_button.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft;
[_button setTitleColor:UIColor.blackColor forState:UIControlStateNormal];
[self.contentView addSubview:_button];
// Constraint
[self.contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-margin-[_button]-margin-|" options:kNilOptions metrics:@{@"margin" : @(PopoverViewCellHorizontalMargin)} views:NSDictionaryOfVariableBindings(_button)]];
[self.contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-margin-[_button]-margin-|" options:kNilOptions metrics:@{@"margin" : @(PopoverViewCellVerticalMargin)} views:NSDictionaryOfVariableBindings(_button)]];
// 底部线条
UIView *bottomLine = [[UIView alloc] init];
bottomLine.backgroundColor = [UIColor colorWithRed:0.75 green:0.75 blue:0.75 alpha:1.00];
bottomLine.translatesAutoresizingMaskIntoConstraints = NO;
[self.contentView addSubview:bottomLine];
_bottomLine = bottomLine;
// Constraint
[self.contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[bottomLine]|" options:kNilOptions metrics:nil views:NSDictionaryOfVariableBindings(bottomLine)]];
[self.contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[bottomLine(lineHeight)]|" options:kNilOptions metrics:@{@"lineHeight" : @(1/[UIScreen mainScreen].scale)} views:NSDictionaryOfVariableBindings(bottomLine)]];
}
#pragma mark - Public
/*! @brief 标题字体 */
+ (UIFont *)titleFont {
return [UIFont systemFontOfSize:15.f];
}
/*! @brief 底部线条颜色 */
+ (UIColor *)bottomLineColorForStyle:(PopoverViewStyle)style {
return style == PopoverViewStyleDefault ? [UIColor colorWithRed:0.75 green:0.75 blue:0.75 alpha:1.00] : [UIColor colorWithRed:0.4 green:0.4 blue:0.4 alpha:1.00];
}
- (void)setAction:(PopoverAction *)action {
[_button setImage:action.image forState:UIControlStateNormal];
[_button setTitle:action.title forState:UIControlStateNormal];
_button.titleEdgeInsets = action.image ? UIEdgeInsetsMake(0, PopoverViewCellTitleLeftEdge, 0, -PopoverViewCellTitleLeftEdge) : UIEdgeInsetsZero;
}
- (void)showBottomLine:(BOOL)show {
_bottomLine.hidden = !show;
}
@end