新浪微博客户端(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
复制代码

 

最终效果:

 



如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我最大的写作动力!欢迎各位转载,但是未经作者本人同意,转载文章之后必须在文章页面明显位置给出作者和原文连接,否则保留追究法律责任的权利。
posted @   夜行过客  阅读(487)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
点击右上角即可分享
微信分享提示