iOS 页面置灰记录

文章介绍了iOS应用中实现页面置灰的几种方法,包括内置资源置灰、控件置灰、整体添加滤镜以及使用第三方库IMYAppGrayStyle进行全局和局部置灰的效果。通过添加滤镜到layer或使用私有API调整颜色,可以达到变灰效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

iOS App 页面置灰部分原理记录

一、资源置灰

1、App内置相关资源和主体图片,根据相关时间后台下发指令来触发相关主题生效时间

2、App采用线上资源包、皮肤,动态下发到端上

二、控件置灰

给主要控件置灰,比如UIImage/UIColor/UIWebView等

1、遍历视图,依次对相关控件处理

2、采用hook方式,对相关控件hook特殊处理

三、App整体添加滤镜

1、UIView.layer上 添加灰色滤镜

// 最顶层视图,承载滤镜,自身不接收、不拦截任何触摸事件
@interface UIViewOverLay : UIView
@end
 
@implementation UIViewOverLay
-(UIView*)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
    return nil;
}
@end
 
 
UIWindow *window = App的Window;
UIViewOverLay *overlay = [[UIViewOverLay alloc]initWithFrame:self.window.bounds];
overlay.translatesAutoresizingMaskIntoConstraints = false;
overlay.backgroundColor = [UIColor lightGrayColor];
overlay.layer.compositingFilter = @"saturationBlendMode";
[window addSubview:overlay];
 
最后通过各种方法,要保证overlay在最顶层.

2、私有API CAFilter添加滤镜

//获取RGBA颜色数值
CGFloat r,g,b,a;
[[UIColor lightGrayColor] getRed:&r green:&g blue:&b alpha:&a];
//创建滤镜
id cls = NSClassFromString(@"CAFilter");
id filter = [cls filterWithName:@"colorMonochrome"];
//设置滤镜参数
[filter setValue:@[@(r),@(g),@(b),@(a)] forKey:@"inputColor"];
[filter setValue:@(0) forKey:@"inputBias"];
[filter setValue:@(1) forKey:@"inputAmount"];
//设置给window
window.layer.filters = [NSArray arrayWithObject:filter];

四、效果展示

借助IMYAppGrayStyle Pod库,简单实现置灰效果

1、全局置灰

实现:AppDelegate 初始化处调用,IMYAppGrayStyle.open()

2、局部置灰

实现StudyManagerController 初始化地方,IMYAppGrayStyle.add(to: self.view)

参考:

### H5 页面生命周期中的刷新问题解决方案 H5页面在某些情况下可能会遇到生命周期管理不当而导致的刷新问题,尤其是在iOS设备上更为明显。以下是针对该问题的具体分析和解决方案。 #### 1. iOS 跳转页面回退不刷新的原因 在移动端浏览器中,尤其是iOS Safari环境下,页面缓存机制可能导致页面A的状态被保留下来而不会重新加载。这种行为通常发生在从页面B返回到页面A时[^2]。由于页面A并未触发`onload`事件或其他初始化逻辑,因此其UI状态(如按钮)会保持不变。 #### 2. 基于路由变化检测的解决方法 为了应对上述问题,可以通过监听路由的变化来强制刷新目标页面的内容。以下是一个基于`window.onhashchange`事件的实现方式: ```javascript // 使用 hash 变化事件监听器 window.onhashchange = function (e) { const newUrl = e.newURL; const oldUrl = e.oldURL; // 如果新 URL 中带有 reloadPage 参数,则执行刷新操作 if (newUrl.indexOf('reloadPage') > -1 && oldUrl.indexOf('reloadPage') === -1) { location.reload(); // 强制刷新当前页面 } }; ``` 此方法适用于从其他应用(如微信小程序)跳转回来的情况,在返回链接中附加特定参数以标记需要刷新的场景[^3]。 #### 3. React 应用中的特殊处理 对于采用React框架构建的应用程序来说,如果发现存在白屏或者未更新的问题,可以尝试以下几种优化手段: - **检查组件卸载逻辑**:确保离开某个页面前已清理掉所有的副作用函数。 - **动态导入懒加载模块**:减少初次渲染所需时间并提升性能表现。 - **错误边界捕获异常情况**:防止因个别子树崩溃影响整个界面展示效果[^4]。 #### 4. Uni-app 子组件数据同步策略 需要注意的是,在uni-app框架下开发跨平台应用程序时,尽管父级视图拥有完整的生命周期回调链路(如 `onLoad`, `onShow`),但是嵌套在其内部的孩子控件却缺乏类似的钩子函数可用。这就意味着即使主屏幕已经完成了一次新的展现周期,其中所含有的各个独立部件也可能依旧维持着先前记录下来的数值设定而不发生变化[^5]。对此类状况可考虑采取如下措施加以改善: - 将必要的业务流程转移到更高级别的容器之中统一调度; - 或者借助全局状态管理模式比如Vuex来进行集中式的属性传递与维护工作; 综上所述,通过合理运用前端技术栈特性以及针对性调整代码结构设计思路,完全可以有效规避由不同操作系统间差异引发的一系列棘手难题! ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值