67 lines
2.4 KiB
Mathematica
67 lines
2.4 KiB
Mathematica
|
|
//
|
|||
|
|
// KBDirectionIndicatorView.m
|
|||
|
|
// keyBoard
|
|||
|
|
//
|
|||
|
|
// Created by Mac on 2025/11/5.
|
|||
|
|
//
|
|||
|
|
|
|||
|
|
#import "KBDirectionIndicatorView.h"
|
|||
|
|
#import "UIView+HW_Frame.h"
|
|||
|
|
|
|||
|
|
@interface KBDirectionIndicatorView ()
|
|||
|
|
@property (nonatomic, strong) UIView *leftView;
|
|||
|
|
@property (nonatomic, strong) UIView *rightView;
|
|||
|
|
@end
|
|||
|
|
|
|||
|
|
@implementation KBDirectionIndicatorView
|
|||
|
|
|
|||
|
|
- (instancetype)initWithFrame:(CGRect)frame {
|
|||
|
|
self = [super initWithFrame:CGRectZero];
|
|||
|
|
if (self) {
|
|||
|
|
self.backgroundColor = UIColor.clearColor;
|
|||
|
|
_leftView = [UIView new];
|
|||
|
|
_rightView = [UIView new];
|
|||
|
|
_leftView.backgroundColor = _rightView.backgroundColor = [UIColor colorWithWhite:0.85 alpha:1];
|
|||
|
|
[self addSubview:_leftView];
|
|||
|
|
[self addSubview:_rightView];
|
|||
|
|
}
|
|||
|
|
return self;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
- (CGSize)indicatorSize { return CGSizeMake(34, 13); }
|
|||
|
|
|
|||
|
|
- (void)setupSubviews {
|
|||
|
|
CGSize size = [self indicatorSize];
|
|||
|
|
self.hw_size = size;
|
|||
|
|
CGFloat h = 5, c = h/2.0;
|
|||
|
|
_leftView.frame = CGRectMake(0, 0, size.width/2 + c, h);
|
|||
|
|
_rightView.frame = CGRectMake(size.width/2 - c, 0, size.width/2 + c, h);
|
|||
|
|
_leftView.hw_centerY = _rightView.hw_centerY = self.hw_height/2.0;
|
|||
|
|
_leftView.layer.cornerRadius = MIN(_leftView.hw_width, _leftView.hw_height)/2;
|
|||
|
|
_rightView.layer.cornerRadius = MIN(_rightView.hw_width, _rightView.hw_height)/2;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 默认库会在很多时机传 HWIndicatorStateNormal,这里忽略,不改变我们基于状态的朝向
|
|||
|
|
- (void)didChangeToState:(HWIndicatorState)state {
|
|||
|
|
// no-op 或者根据需要做轻微弹性动画
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
- (void)applyPresentationState:(PresentationState)state {
|
|||
|
|
CGFloat angle = (CGFloat)(20.0 * M_PI / 180.0);
|
|||
|
|
void (^animate)(void) = ^{
|
|||
|
|
switch (state) {
|
|||
|
|
case PresentationStateShort: // 最低:指向上(∧)
|
|||
|
|
self.leftView.transform = CGAffineTransformMakeRotation(-angle);
|
|||
|
|
self.rightView.transform = CGAffineTransformMakeRotation(angle);
|
|||
|
|
break;
|
|||
|
|
case PresentationStateLong: // 最高:指向下(∨)
|
|||
|
|
default:
|
|||
|
|
self.leftView.transform = CGAffineTransformMakeRotation(angle);
|
|||
|
|
self.rightView.transform = CGAffineTransformMakeRotation(-angle);
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
[UIView animateWithDuration:0.25 delay:0 options:UIViewAnimationOptionBeginFromCurrentState|UIViewAnimationOptionCurveEaseOut animations:animate completion:nil];
|
|||
|
|
}
|
|||
|
|
@end
|