三叶草 发表于 2022-3-7 15:50:07

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

系统键盘在密码框输入时,如果用户开启录屏,键盘在录屏得到的视频里会不可见,但是用户在录屏时却能看到。
为了实现这个效果,利用UItextfield在录屏下视频不可见的特性,将实现这一效果的私有UIview,也就是_UITextLayoutCanvasView提取出来,作为背景,其他组件在这个背景上显示。objective c代码如下
-(UIView *)initWithFrame:(CGRect)frame{
   
    UITextField * root=[ initWithFrame:frame];
    if(root){
      root.secureTextEntry=YES;//利用密码框录屏不可见的特性
    UIView *textLayoutCanvasView=root.subviews.firstObject;//获取_UITextLayoutCanvasView
    if (textLayoutCanvasView.subviews.count) {
      ;
    }
    textLayoutCanvasView.frame=frame;
    textLayoutCanvasView.userInteractionEnabled=YES;
      textLayoutCanvasView.backgroundColor=;
    return textLayoutCanvasView;
    }
   
    return root.subviews.firstObject;
}
需要注意的是,目前是利用通过获取指定位置的 UITextField 的 subview 来获取私有 view ,如果后期 UITextField 的 subview 位置变更就要再做处理。而且_UITextLayoutCanvasView作为私有成员是不能被添加成员变量和函数的,只能作为背景。例如要实现自定义键盘和系统键盘类似的录屏不可见效果,我目前只能这样想到做:
CustomKeyboard *keyboard=[init];//你的自定义键盘类
UIView *shield=;//实现录屏不可见的_UITextLayoutCanvasView
;//让键盘基于_UITextLayoutCanvasView
shield.userInteractionEnabled=YES;//允许交互,不然无法点击
UITexrField.inputView=shield;//设置UITextField的inputView
然后如果出现点击事件传递不到button的原因,是因为事件在更上一层view被拦截了,传递touch或者直接在更上一层处理都行。
swift实现请参考:
https://juejin.cn/post/7066341701815631909#heading-8


   
   
   
                        

https://www.cnblogs.com/BYGAO/p/15976204.html
页: [1]
查看完整版本: iOS实现组件录屏视频不可见,用户肉眼可见(类似系统键盘效果)