我正在制作自定义键盘。我想根据 View 的宽度和高度生成键(UIButtons)的宽度和高度。
最初加载键盘时,viewDidAppear 会正确确定 View 的高度。 (375 x 216)
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
self.renderKeys()
}
当旋转到横向时,它会调用 viewWillTransition
override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
super.viewWillTransition(to: size, with: coordinator)
NSLog("toSize \(size.width) x \(size.height)")
coordinator.animate(alongsideTransition: {(_ context: UIViewControllerTransitionCoordinatorContext) -> Void in
NSLog("animating \(self.view.frame.width) x \(self.view.frame.height)")
}, completion: {(_ context: UIViewControllerTransitionCoordinatorContext) -> Void in
NSLog("animationCompleted \(self.view.frame.width) x \(self.view.frame.height)")
self.renderKeys()
})
}
旋转回纵向结果。
我发现 viewWillTransition 的大小没有正确确定 View 的大小,或者我只是误解了该函数的用法。即使在动画之后,我也无法获得正确的 View 宽度和高度。
这是调试日志的顺序。
[28651:1348399] Calling viewDidAppear
[28651:1348399] Cleaning keys
[28651:1348399] toSize 667.0 x 216.0
[28651:1348399] animating 667.0 x 216.0
[28651:1348399] animationCompleted 667.0 x 216.0
[28651:1348399] Cleaning keys
[28651:1348399] toSize 375.0 x 162.0
[28651:1348399] animating 375.0 x 162.0
[28651:1348399] animationCompleted 375.0 x 162.0
最佳答案
我也在使用自定义键盘,发现了类似的问题。
经过几个小时的实验,我了解到以下内容:
application(didFinishLaunchingWithOptions:),applicationDidBecomeActive ), 等被执行)viewWillTransition(to size:) 中捕获。例如在 iPhone 8+ 中,这将报告大小为 (414.0, 736.0) 或 (736.0, 414.0)现在,将项目作为键盘目标运行: -
应用程序(didFinishLaunchingWithOptions:),
applicationDidBecomeActive等不报
ViewController。viewDidLoad 中捕获 viewSize 可能会很棘手,因为您可能需要延迟(使用
Timer.scheduledTimer(withTimeInterval:),至少在第一次迭代中updateViewConstraints() 中报告了 viewSize,但该大小似乎并不完全可靠。每次过渡到之后
纵向,它可以报告大小为 414 x 736 (ScreenSize) 或 414
x 226(正确的键盘尺寸)。如果是 iPhone 8+viewWillTransition 方法在从 Portrait 转到时不会执行
到横向或从横向到纵向(我想这与每次旋转都会中断的 View 生命周期有关)。 所以,我正在做的是在延迟后在 viewDidLoad 中捕获屏幕尺寸,而忘记 updateViewConstraints 或 viewWillTransition(to size:)
Timer.scheduledTimer(withTimeInterval: 0.2, repeats: false) { (nil) in
print("Load Size: \(self.view.frame.size)")
}
注意* 这种延迟似乎只在第一次加载时需要(在这种情况下,甚至 updateViewConstraints 在 viewDidLoad 之前执行。在 viewDidLoad 的后续迭代中,它是不需要。此外。您可能想试验延迟,并在实际设备和模拟器中进行测试
引用表:
设备-(屏幕)-(KeyboardPortrait)-(KeyboardLandscape)
iPhone X - (375 x 812) - (375 x 141) - (662 x 131)
iPhone 8+ - (414 x 736) - (414 x 226) - (736 x 162)
iPhone 7+/8+ - (414 x 736) - (414 x 226) - (736 x 162)
iPhone 7/8 - (375 x 667) - (375 x 216) - (667 x 162)
6/6s/6+/6s+ - 与 iPhone 7/8 相同
iPhone SE - (320 x 568) - (320 x 216) - (568 x 162)
希望对你有所帮助。问候... e
关于ios - viewWillTransition 给出了错误的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41309308/
我的目标是转换表单输入,例如“100兆字节”或“1GB”,并将其转换为我可以存储在数据库中的文件大小(以千字节为单位)。目前,我有这个:defquota_convert@regex=/([0-9]+)(.*)s/@sizes=%w{kilobytemegabytegigabyte}m=self.quota.match(@regex)if@sizes.include?m[2]eval("self.quota=#{m[1]}.#{m[2]}")endend这有效,但前提是输入是倍数(“gigabytes”,而不是“gigabyte”)并且由于使用了eval看起来疯狂不安全。所以,功能正常,
大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje
我遵循MichaelHartl的“RubyonRails教程:学习Web开发”,并创建了检查用户名和电子邮件长度有效性的测试(名称最多50个字符,电子邮件最多255个字符)。test/helpers/application_helper_test.rb的内容是:require'test_helper'classApplicationHelperTest在运行bundleexecraketest时,所有测试都通过了,但我看到以下消息在最后被标记为错误:ERROR["test_full_title_helper",ApplicationHelperTest,1.820016791]test
我是rails的新手,想在form字段上应用验证。myviewsnew.html.erb.....模拟.rbclassSimulation{:in=>1..25,:message=>'Therowmustbebetween1and25'}end模拟Controller.rbclassSimulationsController我想检查模型类中row字段的整数范围,如果不在范围内则返回错误信息。我可以检查上面代码的范围,但无法返回错误消息提前致谢 最佳答案 关键是您使用的是模型表单,一种显示ActiveRecord模型实例属性的表单。c
我正在尝试编写一个将文件上传到AWS并公开该文件的Ruby脚本。我做了以下事情:s3=Aws::S3::Resource.new(credentials:Aws::Credentials.new(KEY,SECRET),region:'us-west-2')obj=s3.bucket('stg-db').object('key')obj.upload_file(filename)这似乎工作正常,除了该文件不是公开可用的,而且我无法获得它的公共(public)URL。但是当我登录到S3时,我可以正常查看我的文件。为了使其公开可用,我将最后一行更改为obj.upload_file(file
我克隆了一个rails仓库,我现在正尝试捆绑安装背景:OSXElCapitanruby2.2.3p173(2015-08-18修订版51636)[x86_64-darwin15]rails-v在您的Gemfile中列出的或native可用的任何gem源中找不到gem'pg(>=0)ruby'。运行bundleinstall以安装缺少的gem。bundleinstallFetchinggemmetadatafromhttps://rubygems.org/............Fetchingversionmetadatafromhttps://rubygems.org/...Fe
在Cooper的书BeginningRuby中,第166页有一个我无法重现的示例。classSongincludeComparableattr_accessor:lengthdef(other)@lengthother.lengthenddefinitialize(song_name,length)@song_name=song_name@length=lengthendenda=Song.new('Rockaroundtheclock',143)b=Song.new('BohemianRhapsody',544)c=Song.new('MinuteWaltz',60)a.betwee
这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下
我是Google云的新手,我正在尝试对其进行首次部署。我的第一个部署是RubyonRails项目。我基本上是在关注thisguideinthegoogleclouddocumentation.唯一的区别是我使用的是我自己的项目,而不是他们提供的“helloworld”项目。这是我的app.yaml文件runtime:customvm:trueentrypoint:bundleexecrackup-p8080-Eproductionconfig.ruresources:cpu:0.5memory_gb:1.3disk_size_gb:10当我转到我的项目目录并运行gcloudprevie
我有两个Rails模型,即Invoice和Invoice_details。一个Invoice_details属于Invoice,一个Invoice有多个Invoice_details。我无法使用accepts_nested_attributes_forinInvoice通过Invoice模型保存Invoice_details。我收到以下错误:(0.2ms)BEGIN(0.2ms)ROLLBACKCompleted422UnprocessableEntityin25ms(ActiveRecord:4.0ms)ActiveRecord::RecordInvalid(Validationfa