首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >iOS暗键盘在UINavigationController推送/流行动画中有背景

iOS暗键盘在UINavigationController推送/流行动画中有背景
EN

Stack Overflow用户
提问于 2017-06-20 06:15:01
回答 1查看 264关注 0票数 4

在导航控制器推送/弹出动画期间,键盘比处于最后状态的键盘更暗。而在动画结束时,这个黑色的背景视图就消失了。轻(白色)键盘样式没有此效果。

我怎么才能摆脱这个黑色背景?

我已经尝试将窗口颜色设置为白色,并将导航控制器背景设置为白色。

视频:

https://www.dropbox.com/s/z1grj821fj306th/Untitled.mov?dl=0

截图:

EN

回答 1

Stack Overflow用户

发布于 2021-07-25 01:12:47

选项1

最简单的解决方案是通过将其背景颜色设置为黑色或白色(取决于您的键盘是亮的还是暗的)来禁用键盘的透明性:

代码语言:javascript
运行
AI代码解释
复制
myTextField.becomeFirstResponder()

guard UIDevice().userInterfaceIdiom == .phone else {
    return;
}

//keyboard window should be there now, look for it:
var keyboardWindow: UIWindow?
for window in UIApplication.shared.windows.reversed() {
    if String(describing: type(of: window)) == "UIRemoteKeyboardWindow" {
        keyboardWindow = window
        break
    }
}
keyboardWindow?.rootViewController?.view.subviews.first?.backgroundColor = .black

选项2

如果你不喜欢这一点,我有一个黑客似乎很好的工作,至少在iOS 14。它导致键盘幻灯片上升动画发生在幻灯片在推动画,而不是后。通过添加一个临时文本字段,它依赖于在推送之前显示键盘。

每当您想要推送VC时,请运行以下代码:

代码语言:javascript
运行
AI代码解释
复制
guard UIDevice().userInterfaceIdiom == .phone else {
    // fix doesn't apply to iPad, push or perform segue:
    self.performSegue(withIdentifier: "mySegue", sender: self)
    // navigationController?.pushViewController(destinationVC, animated: true)
    return;
}

//create text field with matching settings so keyboard will look the same as its destination
let tempTextField = UITextField.init()
tempTextField.keyboardType = .default
tempTextField.keyboardAppearance = .light
tempTextField.autocorrectionType = .default
view.addSubview(tempTextField)
    
//show keyboard, then right after push VC, then discard the text field
//make sure destination text field calls becomeFirstResponder() in its VC's viewDidLoad()
tempTextField.becomeFirstResponder()
DispatchQueue.main.asyncAfter(deadline: .now() + 1.0/60.0) {
    // push or perform segue:
    self.performSegue(withIdentifier: "mySegue", sender: self)
    // navigationController?.pushViewController(destinationVC, animated: true)
    }
    DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
        tempTextField.removeFromSuperview()
    }
}

选项3

我改进了选项2,将推送幻灯片动画复制到键盘上,本质上得到了您所要求的结果。也有一个选项,以保持滑动上升动画在幻灯片中,只要尝试一下。

当您想要推送时,在推动VC上运行以下代码:

代码语言:javascript
运行
AI代码解释
复制
guard UIDevice().userInterfaceIdiom == .phone else {
    // fix doesn't apply to iPad, push or perform segue:
    self.performSegue(withIdentifier: "mySegue", sender: self)
    // navigationController?.pushViewController(destinationVC, animated: true)
    return;
}

//create text field with matching settings so keyboard will look the same as its destination
let tempTextField = UITextField.init()
tempTextField.keyboardType = .default
tempTextField.keyboardAppearance = .light
tempTextField.autocorrectionType = .default
view.addSubview(tempTextField)
       
//show keyboard, then push VC, then remove the text field (see bottom)
//make sure destination text field calls becomeFirstResponder() in its VC's viewDidLoad()
UIView.setAnimationsEnabled(false) //set to false to disable slide up animation or true to keep it
tempTextField.becomeFirstResponder()
UIView.setAnimationsEnabled(true)

//find keyboard window
var keyboardWindow: UIWindow?
for window in UIApplication.shared.windows.reversed() {
    if String(describing: type(of: window)) == "UIRemoteKeyboardWindow" {
        keyboardWindow = window
        break
    }
}
keyboardWindow?.rootViewController?.view.isHidden = true //this prevents glitches

DispatchQueue.main.asyncAfter(deadline: .now() + 1.0/60.0) {
    // push or perform segue
    self.performSegue(withIdentifier: "mySegue", sender: self)
    // navigationController?.pushViewController(destinationVC, animated: true)
    
    keyboardWindow?.rootViewController?.view.isHidden = false

    //this spring animation is identical to default push slide animation
    let spring = CASpringAnimation(keyPath: "position")
    spring.damping = 500
    spring.mass = 3
    spring.initialVelocity = 0
    spring.stiffness = 1000
    spring.fromValue = CGPoint.init(x: self.view.frame.width, y:0) //you can enter e.g y:1000 to delay slide up animation
    spring.toValue = CGPoint.init(x: 0, y:0)
    spring.duration = 0.5
    spring.isAdditive = true
    keyboardWindow?.layer.add(spring, forKey: nil)
}
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
    tempTextField.removeFromSuperview()
}

您可以通过不禁用动画(在becomeFirstResponder()上面)来保持滑动的动画。如果您选择此选项,则可以通过将y:0替换为y:1000来延迟幻灯片上的动画。您可以使用此值。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44655534

复制
相关文章
【图像篇】OpenCV图像处理(二)---图像读取与显示
在上一篇文章中,我们简要介绍了图像的基础知识,包括图像彩色通道,像素,分辨率等知识,学会这些东西,我们才能更好的理解图像处理的各种操作,今天,我们将会用上一篇文章(【图像篇】opencv图像处理(一)---图像基础知识)提到的工具--OpenCV,并用python语言调用OpenCV接口来进行实际的代码操作,一起来看看吧!
用户5410712
2022/06/01
1.2K0
【图像篇】OpenCV图像处理(二)---图像读取与显示
c语言opencv读取图像_matlab读取一幅图像并显示
专栏地址:『youcans 的 OpenCV 例程300篇 – 总目录』 01. 图像的读取(cv2.imread) 02. 图像的保存(cv2.imwrite) 03. 图像的显示(cv2.imshow) 04. 用 matplotlib 显示图像(plt.imshow)
全栈程序员站长
2022/09/27
1.9K0
【python-opencv】读取、显示、写入图像
cv.waitKey()是一个键盘绑定函数。其参数是以毫秒为单位的时间。该函数等待任何键盘事件指定的毫秒。如果您在这段时间内按下任何键,程序将继续运行。如果0被传递,它将无限期地等待一次敲击键。它也可以设置为检测特定的按键,例如,如果按下键 a 等,我们将在下面讨论。
西西嘛呦
2020/08/26
1.6K0
Python+OpenCV的图像读取、显示、保存
一、图像的读取 图像的读取主要函数是cv2.imread()。 函数格式:Mat cv::imread (const String & filename, int flags = IMREAD_COLOR) 功能:读取图片文件。 参数: windows位图:后缀名为bmp JPEG文件:后缀名为jpeg/jpg JPEG2000:后缀名为jp2 便携式网络图像文件:后缀名为png TIFF文件:后缀名为tiff/tif 参数二是整型的flag,标志,默认值为IMREAD_COLOR,取值有如下几种: IMREAD_UNCHANGED:如果设置,则按原样返回加载的图像(带有Alpha通道,否则会被裁剪)。 IMREAD_GRAYSCALE:如果设置,总是将图像转换为单通道灰度图像读入。 IMREAD_COLOR:如果设置,总是将图像转换为3通道BGR彩色图像读入。 IMREAD_ANYDEPTH:如果设置,当输入具有相应深度时返回16位/ 32位图像,否则将其转换为8位。 IMREAD_ANYCOLOR:如果设置,图像将以任何可能的颜色格式读取。 IMREAD_LOAD_GDAL:如果设置,总是使用GDAL驱动程序加载图像。 IMREAD_REDUCED_GRAYSCALE_2:如果设置,总是将图像转换为单通道灰度图像,图像尺寸减小1/2。 IMREAD_REDUCED_COLOR_2:如果设置,总是将图像转换为3通道BGR彩色图像,图像尺寸减小1/2。 IMREAD_REDUCED_GRAYSCALE_4:如果设置,总是将图像转换为单通道灰度图像,图像尺寸减小1/4。 IMREAD_REDUCED_COLOR_4:如果设置,总是将图像转换为3通道BGR彩色图像,图像尺寸减小1/4。 IMREAD_REDUCED_GRAYSCALE_8:如果设置,总是将图像转换为单通道灰度图像,图像尺寸减小1/8。 IMREAD_REDUCED_COLOR_8:如果设置,总是将图像转换为3通道BGR彩色图像,图像尺寸减小1/8 常用的是前三种。因为flags是整型,所以传入数值也行: flags >0:等同于IMREAD_COLOR。 flags =0:等同于 IMREAD_GRAYSCALE。 flags <0: 等同于IMREAD_UNCHANGED。 通常是给1、0、-1,给其他整型也是可以的。 返回值:Mat类型。从opencv2开始,用于存放图像的数据类型就是Mat, 二、图像的显示 图像读取后,下一步就是再把图像显示出来,主要函数有:cv2.namedWindows()、cv2.imshow()。再另外再介绍三个函数cv2.waitKey()、cv2.destroyWindow()、cv2.destroyAllWindows()。 2.1 cv2.namedWindows函数介绍 void cv::namedWindow (const String & winname,int flags = WINDOW_AUTOSIZE ) 功能:创建一个窗口。 参数:参数一是winname,给创建的窗口起一个名字,以后通过这个名字调用该窗口;参数二整型的flags,定义窗口的属性,默认值是WINDOW_AUTOSIZE,其他取值如下所示: WINDOW_NORMAL:用户可以调整窗口大小(不受约束)/也可以使用将全屏窗口切换为正常大小。 WINDOW_AUTOSIZE:用户无法调整窗口大小,窗口大小随显示图像的大小而变化。 WINDOW_OPENGL:带有opengl支持的窗口。 WINDOW_FULLSCREEN:将窗口更改为全屏。 WINDOW_FREERATIO:不遵循图像的比例调整图像后在窗口显示 WINDOW_KEEPRATIO:根据图像的比例调整图像后在窗口中显示 2.2 cv2.imshow函数介绍 void cv::imshow (const String & winname, InputArray mat ) 功能:在指定窗口显示图像。 参数:参数一是窗口名;参数二设置为要显示的图像。 注意此函数之后应该跟随函数waitKey,指定窗口显示多少毫秒。 2.3 cv2.waitKey函数介绍 int cv::waitKey (int delay = 0) 功能:等待按键或延迟多少毫秒。 参数:整型的delay,默认值是0。设置为0表示永久等待按键,设置为非零,表示延迟delay毫秒。该函数仅在创建至少一个窗口并且窗口处于活动状态时才起作用。 2.4 cv2.destroyWind
菲宇
2019/11/12
3.8K0
OpenCV中图像的读取,显示与保存
相关函数:cv2.imread()、cv2.imshow()、cv2.imwrite()
py3study
2020/01/19
3.1K0
OpenCV 入门教程:图像读取和显示
在计算机视觉和图像处理领域,读取和显示图像是最基础且常见的操作之一。 OpenCV 作为一个强大的计算机视觉库,提供了丰富的功能来处理图像数据。本文将以读取和显示图像文件为中心,介绍使用 OpenCV 进行图像读取和显示的基本步骤和实例。
小蓝枣
2023/07/10
1.1K0
OpenCV 入门教程:图像读取和显示
【说站】php显示和实际时间不同的解决
1、使用“ini_set('date.timezone','PRC')”设置时区。
很酷的站长
2022/11/26
8250
【说站】php显示和实际时间不同的解决
matlab读取tif图像并显示_matlab关闭窗口
info = imfinfo(filename,fmt) %输入图像名,图像的格式
全栈程序员站长
2022/11/09
7590
Android App java 读取raw图像数据然后显示
src\main\java\com\wfh\canvasdemo\DataUtil.java
IT工作者
2022/05/20
6840
PHP读取163邮箱获取联系人
PHP读取163邮箱获取联系人 PHP环境:7.0以上 <?php error_reporting(0); //邮箱用户名(不带@163.com后缀的) $user = 'username
红目香薰
2022/11/29
5860
Python获取图像大小_如何读取0像素图片
但是在使用百度OCR进行文字识别的时候,文字识别的图片大小不能超过4M,在自动识别文字的时候,就避免不了读取图片的内存大小,如果是大于4M的话,要对图片进行压缩,下面是读取图片内存的代码:
全栈程序员站长
2022/11/04
1.4K0
Ex1:图像读取和显示以及像素操作
dev下搭建环境,详情见https://www.jianshu.com/p/d5e18b9b0333
平凡的学生族
2019/05/25
5330
C#获取摄像头拍照显示图像
之前有个需求,就是在web界面可以实现调用摄像头,用户把手机的个人二维码展示给摄像头,摄像头进行摄像识别用户。
zls365
2021/03/16
1.1K0
OpenCV-Python学习(2)—— OpenCV 图像的读取和显示
1. 学习目标 图像理解 图像读取与显示 2. 灰度图像 —— 单通道 1. 人眼中的灰度图像 2. 计算机中的灰度图像 [[ 72 72 71 ... 151 154 156] [ 75 73 69 ... 152 155 158] [ 78 73 66 ... 152 157 160] ... [ 94 94 94 ... 208 197 187] [ 92 92 93 ... 208 200 191] [ 96 96 97 ... 208 202 195]] 3
Rattenking
2022/09/30
1.3K0
OpenCV-Python学习(2)—— OpenCV 图像的读取和显示
php案例:获取到实际地址的控制器 方法 参数
贵哥的编程之路
2023/10/16
1540
php案例:获取到实际地址的控制器 方法 参数
使用PHP获取图像文件的EXIF信息
在我们拍的照片以及各类图像文件中,其实还保存着一些信息是无法直观看到的,比如手机拍照时会有的位置信息,图片的类型、大小等,这些信息就称为 EXIF 信息。一般 JPG 、 TIFF 这类的图片文件都会有这样的信息。EXIF 其实就是专门为这种数码照片所定制的,专门用于记录数码照片的属性信息和拍摄数据的,最初由日本制定。这个其实很好理解,日本对相机行业基本是垄断般的存在,所以这类的标准当然就是由他们制定啦!
硬核项目经理
2021/08/06
1.7K0
Windows下使用海康相机SDK获取图像并在Qt显示
点击上方蓝字可直接关注!方便下次阅读。如果对你有帮助,可以点个在看,让它可以帮助到更多同志
用户5908113
2020/03/11
5.3K2
Windows下使用海康相机SDK获取图像并在Qt显示
点击加载更多

相似问题

从国家代码中获取国家名称

819

从国家名称中获取ISO国家代码

40

如何从国家代码中获取国家名称?

11

如何从国家代码中获取国家名称?

43

如何从国家名称中获取国家代码?

20
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档