新浪微博客户端(7)-通过转换坐标系来调整首页下拉菜单的位置
DJDropdownMenu.h
#import <UIKit/UIKit.h> @interface DJDropdownMenu : UIView /** 构造方法 */ + (instancetype)menu; /** 显示 */ - (void)showFromView:(UIView *)view; /** 消失 */ - (void)dismiss; @property (nonatomic,weak) UIView *contentView; @property (nonatomic,strong) UIViewController *contentController; @end
DJDropdownMenu.m
#import "DJDropdownMenu.h" @interface DJDropdownMenu() /** 灰色背景 */ @property (nonatomic,weak) UIImageView *containerView; @end @implementation DJDropdownMenu - (UIImageView *)containerView { if (!_containerView) { UIImageView *imageView = [[UIImageView alloc] init]; imageView.image = [UIImage imageNamed:@"popover_background"]; [self addSubview:imageView]; _containerView = imageView; } return _containerView; } - (void)setContentView:(UIView *)contentView { _contentView = contentView; // 1. 设置contentView位置 contentView.x = 10; contentView.y = 15; // 2. 设置containerView高度(随contentView高度的变化而变化)和宽度 self.containerView.height = CGRectGetMaxY(contentView.frame)+12; self.containerView.width = CGRectGetMaxX(contentView.frame) + contentView.x; // 3.添加contentView至containerView; [self.containerView addSubview:contentView]; } - (void)setContentController:(UIViewController *)contentController { _contentController = contentController; [self setContentView:contentController.view]; } - (instancetype)initWithFrame:(CGRect)frame { if (self = [super initWithFrame:frame]) { // 1.设置背景颜色透明 self.backgroundColor = [UIColor clearColor]; // 2.设置containerView可以与用户交互 self.containerView.userInteractionEnabled = YES; } return self; } + (instancetype)menu { return [[self alloc] init]; } /** show即是将当前View添加到顶层窗口上 */ - (void)showFromView:(UIView *)view { // 1. 获取顶层窗口 UIWindow *window = [[UIApplication sharedApplication].windows lastObject]; // 2. 设置当前View大小 self.frame = window.bounds; // 3. 设置当前containerView位置 CGRect newFrame = [view.superview convertRect:view.frame toView:nil]; // 转换当前传入View的坐标系 self.containerView.centerX = CGRectGetMidX(newFrame); self.containerView.y = CGRectGetMaxY(newFrame); // 4. 添加当前View到顶层窗口 [window addSubview:self]; } /** dismiss即是将当前View从顶层窗口移除 */ - (void)dismiss { [self removeFromSuperview]; } - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { [self dismiss]; } @end
最终效果:
如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我最大的写作动力!欢迎各位转载,但是未经作者本人同意,转载文章之后必须在文章页面明显位置给出作者和原文连接,否则保留追究法律责任的权利。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库