iOS实现组件录屏视频不可见,用户肉眼可见(类似系统键盘效果)

系统键盘在密码框输入时,如果用户开启录屏,键盘在录屏得到的视频里会不可见,但是用户在录屏时却能看到。

为了实现这个效果,利用UItextfield在录屏下视频不可见的特性,将实现这一效果的私有UIview,也就是_UITextLayoutCanvasView提取出来,作为背景,其他组件在这个背景上显示。objective c代码如下

-(UIView *)initWithFrame:(CGRect)frame{
    
    UITextField * root=[[UITextField alloc] initWithFrame:frame];
    if(root){
        root.secureTextEntry=YES;//利用密码框录屏不可见的特性
    UIView *textLayoutCanvasView=root.subviews.firstObject;//获取_UITextLayoutCanvasView
    if (textLayoutCanvasView.subviews.count) {
        [textLayoutCanvasView.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)];
    }
    textLayoutCanvasView.frame=frame;
    textLayoutCanvasView.userInteractionEnabled=YES;
        textLayoutCanvasView.backgroundColor=[UIColor clearColor];
    return textLayoutCanvasView;
    }
    
    return root.subviews.firstObject;
}

需要注意的是,目前是利用通过获取指定位置的 UITextField 的 subview 来获取私有 view ,如果后期 UITextField 的 subview 位置变更就要再做处理。而且_UITextLayoutCanvasView作为私有成员是不能被添加成员变量和函数的,只能作为背景。例如要实现自定义键盘和系统键盘类似的录屏不可见效果,我目前只能这样想到做:

CustomKeyboard *keyboard=[[CustomKeyboard alloc]init];//你的自定义键盘类
UIView *shield=[self initWithFrame:keyboard.frame];//实现录屏不可见的_UITextLayoutCanvasView
[shield addSubview:keyboard];//让键盘基于_UITextLayoutCanvasView
shield.userInteractionEnabled=YES;//允许交互,不然无法点击
UITexrField.inputView=shield;//设置UITextField的inputView

然后如果出现点击事件传递不到button的原因,是因为事件在更上一层view被拦截了,传递touch或者直接在更上一层处理都行。

swift实现请参考:
//juejin.cn/post/7066341701815631909#heading-8