评论

收藏

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

移动开发 移动开发 发布于:2022-03-07 15:50 | 阅读数:604 | 评论:0

系统键盘在密码框输入时,如果用户开启录屏,键盘在录屏得到的视频里会不可见,但是用户在录屏时却能看到。
为了实现这个效果,利用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实现请参考:
https://juejin.cn/post/7066341701815631909#heading-8


   
   
   
                        

关注下面的标签,发现更多相似文章