| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167 |
- //
- // TopPopupView.m
- // AIIM
- //
- // Created by qitewei on 2025/6/17.
- //
- #import "TopPopupView.h"
- #import "GroupNetApi.h"
- static const CGFloat kPopupHeight = 80.0f;
- static const CGFloat kPopupCornerRadius = 20.0f;
- static const NSTimeInterval kPopupShowDuration = 0.3;
- static const NSTimeInterval kPopupHideDuration = 0.3;
- static const NSTimeInterval kPopupDisplayTime = 3.0;
- @interface TopPopupView ()
- @property (nonatomic, strong) UIImageView * avatar;
- @property (nonatomic, strong) UILabel *nicknameLabel;
- @property (nonatomic, strong) UILabel *messageLabel;
- @property (nonatomic, strong) NSTimer *dismissTimer;
- @property (nonatomic, assign) BOOL isDismissing;
- @end
- @implementation TopPopupView
- + (void)showWithNickname:(NSString *)nickname avatar:(nonnull NSString *)avatar message:(NSString *)message chatId:(nonnull NSString *)chatId type:(NSInteger)type clickBlock:(PopupClickBlock)clickBlock {
- // 确保在主线程执行
- dispatch_async(dispatch_get_main_queue(), ^{
- // 移除可能已经存在的弹窗
- UIWindow *keyWindow = [UIApplication sharedApplication].delegate.window;
- for (UIView *subview in keyWindow.subviews) {
- if ([subview isKindOfClass:[TopPopupView class]]) {
- [subview removeFromSuperview];
- }
- }
-
- // 创建新弹窗
- TopPopupView *popup = [[TopPopupView alloc] initWithFrame:CGRectMake(20, -kPopupHeight, keyWindow.bounds.size.width - 40, kPopupHeight)];
- popup.clickBlock = clickBlock;
- [popup setupWithNickname:nickname avatar:avatar message:message chatId:chatId type:type];
- [keyWindow addSubview:popup];
-
- // 显示动画
- [popup show];
- });
- }
- - (instancetype)initWithFrame:(CGRect)frame {
- self = [super initWithFrame:frame];
- if (self) {
- [self setupUI];
- }
- return self;
- }
- - (void)setupUI {
- // 背景设置
- self.backgroundColor = [UIColor whiteColor];
- self.layer.cornerRadius = kPopupCornerRadius;
- self.layer.shadowColor = [UIColor blackColor].CGColor;
- self.layer.shadowOffset = CGSizeMake(0, 2);
- self.layer.shadowOpacity = 0.2;
- self.layer.shadowRadius = 4;
-
- self.avatar = [[UIImageView alloc] init];
- [self addSubview:self.avatar];
- self.avatar.layer.cornerRadius = 30.f;
- self.avatar.layer.masksToBounds = YES;
-
- // 昵称标签
- self.nicknameLabel = [[UILabel alloc] init];
- self.nicknameLabel.font = [UIFont boldSystemFontOfSize:16];
- self.nicknameLabel.textColor = [UIColor blackColor];
- [self addSubview:self.nicknameLabel];
-
- // 消息标签
- self.messageLabel = [[UILabel alloc] init];
- self.messageLabel.font = [UIFont systemFontOfSize:14];
- self.messageLabel.textColor = [UIColor blackColor];
- self.messageLabel.numberOfLines = 2;
- [self addSubview:self.messageLabel];
-
- // 添加点击手势
- UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap)];
- [self addGestureRecognizer:tap];
-
- // 添加上滑手势
- UISwipeGestureRecognizer *swipe = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipe)];
- swipe.direction = UISwipeGestureRecognizerDirectionUp;
- [self addGestureRecognizer:swipe];
- }
- - (void)setupWithNickname:(NSString *)nickname avatar:(nonnull NSString *)avatar message:(NSString *)message chatId:(NSString *)chatId type:(NSInteger)type{
- self.nicknameLabel.text = nickname;
- self.messageLabel.text = message;
- if (avatar) {
- [self.avatar sd_setImageWithURL:getURL(avatar)];
- }
-
- // 布局
- CGFloat padding = 12.0f;
- CGFloat labelWidth = self.bounds.size.width - 2 * padding;
-
- self.avatar.frame = CGRectMake(padding, padding, 60, 60);
- self.nicknameLabel.frame = CGRectMake(padding+60+padding, padding, labelWidth, 20);
- self.messageLabel.frame = CGRectMake(padding+60+padding, CGRectGetMaxY(self.nicknameLabel.frame) + 4, labelWidth, 40);
- }
- - (void)show {
- // 初始位置在屏幕外
- CGRect startFrame = self.frame;
-
- // 动画目标位置
- CGRect endFrame = startFrame;
- endFrame.origin.y = [UIApplication sharedApplication].statusBarFrame.size.height + 10;
-
- // 执行显示动画
- [UIView animateWithDuration:kPopupShowDuration delay:0 options:UIViewAnimationOptionCurveEaseOut animations:^{
- self.frame = endFrame;
- } completion:^(BOOL finished) {
- // 启动自动消失计时器
- [self startDismissTimer];
- }];
- }
- - (void)startDismissTimer {
- self.dismissTimer = [NSTimer scheduledTimerWithTimeInterval:kPopupDisplayTime target:self selector:@selector(dismiss) userInfo:nil repeats:NO];
- }
- - (void)dismiss {
- if (self.isDismissing) return;
- self.isDismissing = YES;
-
- // 取消计时器
- [self.dismissTimer invalidate];
- self.dismissTimer = nil;
-
- // 动画目标位置
- CGRect endFrame = self.frame;
- endFrame.origin.y = -kPopupHeight;
-
- // 执行消失动画
- [UIView animateWithDuration:kPopupHideDuration delay:0 options:UIViewAnimationOptionCurveEaseIn animations:^{
- self.frame = endFrame;
- } completion:^(BOOL finished) {
- [self removeFromSuperview];
- }];
- }
- - (void)handleTap {
- if (self.clickBlock) {
- self.clickBlock();
- }
- [self dismiss];
- }
- - (void)handleSwipe {
- [self dismiss];
- }
- - (void)dealloc {
- [self.dismissTimer invalidate];
- }
- @end
|