UIwindow的学习

UIwindow 的学习

 

层级关系测试代码:

 

@interface AppDelegate ()

@property (nonatomic, strong) UIWindow *arlewWindow;
@property (nonatomic, strong) UIWindow *norWindow;
@property (nonatomic, strong) UIWindow *statusWindow;

@end

 

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // UIStoryboard中没有设置了程序入口箭头
    self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
    self.window.backgroundColor = [UIColor greenColor];
    UIStoryboard *story = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
    UIViewController *oneView = [story instantiateViewControllerWithIdentifier:@"123"];
    self.window.rootViewController = oneView;
    NSLog(@"%f",self.window.windowLevel);
    [self.window makeKeyAndVisible];
    
    // 最低级别
    UIWindow *norWindow = [[UIWindow alloc] initWithFrame:CGRectMake(0, 0, 320, 520)];
    self.norWindow = norWindow;
    norWindow.windowLevel = UIWindowLevelNormal + 1;
    norWindow.backgroundColor = [UIColor redColor];
    NSLog(@"norWindow.windowLevel:%f",norWindow.windowLevel);
    [norWindow makeKeyAndVisible];
    
    // 中等级别
    UIWindow *statusWindow = [[UIWindow alloc] initWithFrame:CGRectMake(0, 50, 100, 100)];
    self.statusWindow = statusWindow;
    statusWindow.windowLevel = UIWindowLevelStatusBar;
    statusWindow.backgroundColor = [UIColor grayColor];
    NSLog(@"statusWindow.windowLevel:%f",statusWindow.windowLevel);
    [statusWindow makeKeyAndVisible];
    
    // 最高级别
    UIWindow *arlewWindow = [[UIWindow alloc] initWithFrame:CGRectMake(0, 100, 320, 30)];
    self.arlewWindow = arlewWindow;
    arlewWindow.windowLevel = UIWindowLevelAlert;
    arlewWindow.backgroundColor = [UIColor yellowColor];
    NSLog(@"arlewWindow.windowLevel:%f",arlewWindow.windowLevel);
    [arlewWindow makeKeyAndVisible];
    
    // 经过总结,self.window.windowLevel默认是UIWindowLevelNormal,window按照层级级别来显示,不管谁先谁后makeKeyAndVisible,层级最高的总是显示在前面,如果是相同层级的window,按照显示顺序是按照 [_window makeKeyAndVisible];的顺序显示,最后makeKeyAndVisible的window显示在最前面。小技巧:如果想要设置不大不小的层级级别,可以norWindow.windowLevel = UIWindowLevelNormal + 1;来增加级别权限。
    // 如果是非ARC模式测验则没问题,但是在ARC模式下测验则会不显示其他window,只会显示self.window,因为其他的window没有strong进行引用,没有人持有,会被释放掉,如果想在ARC下测试,则要将window定义为类的属性
    
    
    return YES;
}

 

// 通过遍历以及打印信息提取自己想要的app中得window
for (UIWindow *window in [UIApplication sharedApplication].windows) {
        NSLog(@"window:%@, %f",window, window.windowLevel);
        
        
    }
    // 取出self.window
    UIWindow *window = [[UIApplication sharedApplication].windows objectAtIndex:2];
    // 增加self.window的层级权限
    window.windowLevel = UIWindowLevelNormal + 30;

 

 

如果你的window在某个类中做为属性创建,并且使用完后保证没有其他地方strong引用window的话,那么这个类释放的时候,window属性自然就释放了。

 

[UIApplication sharedApplication].windows  // 在本应用中打开的UIWindow列表

[UIApplication sharedApplication].keyWindow  //(获取应用程序的主窗口)

//UIScreen屏幕属性

@property(nonatomic,retain) UIScreen *screen

 

keyWindow

 官方解释keyWindow是唯一一个可以接受响应的Window,在一个应用程序中只有唯一一个keyWindow

    但是iOS7.0检验发现非keyWindow也是可以接受键盘消息,这一点和文档上说的不太一样。

 

层级

// UIWindowLevel属性(层级高度)

@property(nonatomic) UIWindowLevel windowLevel; 

// 定义UIWindow展示优先级不同层次的选择 ,根据window显示级别优先的原则,级别高的灰显示在上面,级别低的在下面,我们程序正常显示的位于最底层

UIKIT_EXTERN const UIWindowLevel UIWindowLevelNormal; //默认的window就是Normal级别,优先级值这个层次的值为0,通常我们程序的界面都是处于这个Normal级别的

UIKIT_EXTERN const UIWindowLevel UIWindowLevelAlert; //屏幕的statusBar处于中等水平,优先级值为1000

UIKIT_EXTERN const UIWindowLevel UIWindowLevelStatusBar;// alert级别的,通常是UIAlertView和UIAlertSheet这些用来中断正常流程,提醒用户等操作的。优先级值为2000.按照这样说来,alertView弹框出来下面也是一层UIWindow,只不过是优先级最高的alert级别,所以是keyWindow,当前只能交互alert,这就是为什么弹框出来其他界面都不可交互的原因 (UIAlertView为1996,UIAlertSheet为2001)

 

方法

 

- (void)becomeKeyWindow; // 调用窗口,使之变成关键窗口(设置当前window变成主window

- (void)resignKeyWindow;  //  调用窗口,使之取消关键窗口(设置当前window变成主window

- (void)makeKeyWindow;     // 使之成为主窗口(让当前window变成keyWindow)

- (void)makeKeyAndVisible;  // 使之成为主窗口,并且显示(让当前window变成keyWindow,并显示出来

 

类的属性

 

@property(nonatomic,retain) UIViewController *rootViewController // 根控制器(设置UIViewController为根控制器

 

// 当产生一个事件时,先传递给UIApplication,而UIAppliaction将这个事件传递UIWindow进行处理,然后由UIWindow将这个时间传递给特定的对象,即first responder,而UIWindow就是通过sendEvent寻找first responder,经过sendEvent分发到合适的对象,sendEvent就相当于时间的中转站。

- (void)sendEvent:(UIEvent *)event;

 

通知

 

// window变化的四个通知

UIKIT_EXTERN NSString *const UIWindowDidBecomeVisibleNotification; //当window显示就会调用

UIKIT_EXTERN NSString *const UIWindowDidBecomeHiddenNotification;  //window被隐藏之后调用,需要注意的是,当程序进入后台时,这两个通知不会被调用,即使应用转到后台,窗口不会显示,窗口应用下的上下文中仍然被认为是可见的

UIKIT_EXTERN NSString *const UIWindowDidBecomeKeyNotification;     //window成为主窗口调用

UIKIT_EXTERN NSString *const UIWindowDidResignKeyNotification;     //window撤销主窗口调用

 

// 监听键盘变化的通知

UIKIT_EXTERN NSString *const UIKeyboardWillShowNotification; //当键盘将要显示的时候调用

UIKIT_EXTERN NSString *const UIKeyboardDidShowNotification; //当键盘已经显示的时候调用

UIKIT_EXTERN NSString *const UIKeyboardWillHideNotification; //当键盘将要隐藏的时候调用

UIKIT_EXTERN NSString *const UIKeyboardDidHideNotification; //当键盘隐藏完毕的时候调用

 

// 关于监听键盘通知的一些userInfo消息

UIKIT_EXTERN NSString *const UIKeyboardFrameBeginUserInfoKey       NS_AVAILABLE_IOS(3_2); //动画前键盘的位置,包含CGRectNSValue 可以在通知方法中写得到位置

CGRect rect = [[notif.userInfo objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue];

UIKIT_EXTERN NSString *const UIKeyboardFrameEndUserInfoKey         NS_AVAILABLE_IOS(3_2); //动画结束后键盘的位置  包含CGRectNSValue

UIKIT_EXTERN NSString *const UIKeyboardAnimationDurationUserInfoKeyNS_AVAILABLE_IOS(3_0); //动画的持续时间,数值是NSNumber

UIKIT_EXTERN NSString *const UIKeyboardAnimationCurveUserInfoKey   NS_AVAILABLE_IOS(3_0); //动画的曲线类型(UIViewAnimationCurve),数值是NSNumber

 

// 监听键盘frame大小变化的通知

UIKIT_EXTERN NSString *const UIKeyboardWillChangeFrameNotification NS_AVAILABLE_IOS(5_0); //当键盘frame值将要改变的时候调用

UIKIT_EXTERN NSString *const UIKeyboardDidChangeFrameNotification  NS_AVAILABLE_IOS(5_0); //当键盘frame值已经改变的时候调用

转载于:https://www.cnblogs.com/pocket-mood/p/4479971.html

(1)普通用户端(全平台) 音乐播放核心体验: 个性化首页:基于 “听歌历史 + 收藏偏好” 展示 “推荐歌单(每日 30 首)、新歌速递、相似曲风推荐”,支持按 “场景(通勤 / 学习 / 运动)” 切换推荐维度。 播放页功能:支持 “无损音质切换、倍速播放(0.5x-2.0x)、定时关闭、歌词逐句滚动”,提供 “沉浸式全屏模式”(隐藏冗余控件,突出歌词与专辑封面)。 多端同步:自动同步 “播放进度、收藏列表、歌单” 至所有登录设备(如手机暂停后,电脑端打开可继续播放)。 音乐发现与管理: 智能搜索:支持 “歌曲名 / 歌手 / 歌词片段” 搜索,提供 “模糊匹配(如输入‘晴天’联想‘周杰伦 - 晴天’)、热门搜索词推荐”,结果按 “热度 / 匹配度” 排序。 歌单管理:创建 “公开 / 私有 / 加密” 歌单,支持 “批量添加歌曲、拖拽排序、一键分享到社交平台”,系统自动生成 “歌单封面(基于歌曲风格配色)”。 音乐分类浏览:按 “曲风(流行 / 摇滚 / 古典)、语言(国语 / 英语 / 日语)、年代(80 后经典 / 2023 新歌)” 分层浏览,每个分类页展示 “TOP50 榜单”。 社交互动功能: 动态广场:查看 “关注的用户 / 音乐人发布的动态(如‘分享新歌感受’)、好友正在听的歌曲”,支持 “点赞 / 评论 / 转发”,可直接点击动态中的歌曲播放。 听歌排行:个人页展示 “本周听歌 TOP10、累计听歌时长”,平台定期生成 “全球 / 好友榜”(如 “好友中你本周听歌时长排名第 3”)。 音乐圈:加入 “特定曲风圈子(如‘古典音乐爱好者’)”,参与 “话题讨论(如‘你心中最经典的钢琴曲’)、线上歌单共创”。 (2)音乐人端(创作者中心) 作品管理: 音乐上传:支持 “无损音频(FLAC/WAV)+ 歌词文件(LRC)+ 专辑封面” 上传,填写 “歌曲信息
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值