iOS實現元件錄屏視訊不可見,使用者肉眼可見(類似系統鍵盤效果)

白葉Stuart發表於2022-03-07

系統鍵盤在密碼框輸入時,如果使用者開啟錄屏,鍵盤在錄屏得到的視訊裡會不可見,但是使用者在錄屏時卻能看到。

為了實現這個效果,利用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

相關文章