- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个乐谱的 pdf 查看器,它基于 PDFKit。 PDFKit 可以选择使用内部 UIPageViewController,但这是一个很大的问题 - 您无法设置转换类型,更糟糕的是,无法检查页面滑动是否成功或失败。您最终会看到一页,而报告的页面索引是另一页。
因此我决定创建自己的翻页方法。我添加了一个 UITapGestureRecognizer,当点击右边缘或左边缘时,页面会以编程方式翻转。为了实现 curl 动画,我添加了一个与其下方具有相同图像的 UIView,对 PDFView 执行 curl 动画,然后删除该 View 。这是部分代码:
// Function to flip pages with page curl
func flipPage (direction: String) {
let renderer = UIGraphicsImageRenderer(size: pdfView.bounds.size)
let image = renderer.image { ctx in
pdfView.drawHierarchy(in: pdfView.bounds, afterScreenUpdates: true)
}
let imageView = UIImageView(image: image)
imageView.frame = pdfView.frame
imageView.tag = 830
self.view.addSubview(imageView)
self.view.bringSubviewToFront(imageView)
if direction == "forward" && pdfView.canGoToNextPage() {
pdfView.goToNextPage(nil)
let currentImageView = self.view.subviews.filter({$0.tag == 830})
if currentImageView.count > 0 {
UIView.transition(from: currentImageView[0],
to: pdfView, duration: 0.3,
options: [.transitionCurlUp, .allowUserInteraction],
completion: {finished in
currentImageView[0].removeFromSuperview()
})
}
}
现在奇怪的部分来了。在我自己的 iPad Pro 12.9 英寸第一代上,这种翻转方法速度非常快。无论构建配置或优化级别如何,它都可以正常工作。如果我快速连续点击,页面就会随着我点击的速度快速翻动。
我的用户使用的是第二代 iPad Pro 12.9,当 UIView 绘制在 PDFView 之上时,他们遇到了严重的延迟。这种情况也会发生在所有构建配置上 - 它发生在发布构建中,并且当我在这样的设备上从我的计算机安装调试构建时也会发生这种情况(遗憾的是,我无法让设备进一步探索)。
应用程序中还有其他几个实例,我在顶部添加了 UIView - 添加半透明的面纱,或捕获 UIGestureRecognizers。在我自己的设备上,这些都非常快。在第二代 iPad 上,每一项都会导致延迟。顺便说一句,一位使用第三代 iPad Pro 的用户报告说,他的设备上的性能非常快,没有任何延迟。在模拟器上,动画有时不完整,但对于所有 iPad 型号来说,响应速度都足够快。
我搜索了答案,但发现完全没有提到这种奇怪的情况。有人经历过这样的事情吗?我的代码逻辑中有任何快速修复或明显的问题吗?
我担心,如果我尝试提前绘制自定义 UIView,并且只在需要时将它们带到前面,我最终会在后台得到大量可笑的 UIView,并且只需移动延迟其他地方。
最佳答案
经过一些研究,我可以为面临类似问题的人提供解决方案。问题似乎出在日程安排上。
事实上,我并没有遵循最佳实践。 UI 的更改应该始终发生在主线程中,因此如果遇到这样的延迟,请像这样封装 UIView 的实际添加和删除:
DispatchQueue.main.async {
self.view.addSubview(imageView)
self.view.bringSubviewToFront(imageView)
}
我的用户报告问题在那之后就消失了。
编辑
确保将 UIView 和动画 block 添加到同一个 DispatchQueue 段中,否则它们将竞争执行槽。我的最终代码如下所示:
func flipPage (direction: String) {
let renderer = UIGraphicsImageRenderer(size: pdfView.bounds.size)
let image = renderer.image { ctx in
pdfView.drawHierarchy(in: self.pdfView.bounds, afterScreenUpdates: true)
let imageView = UIImageView(image: image)
imageView.frame = pdfView.frame
if direction == "forward" && pdfView.canGoToNextPage() {
DispatchQueue.main.async {
self.view.addSubview(imageView)
self.view.bringSubviewToFront(imageView)
self.pdfView.goToNextPage(nil)
UIView.transition(from: imageView,
to: self.pdfView, duration: 0.3,
options: [.transitionCurlUp, .allowUserInteraction],
completion: {finished in
imageView.removeFromSuperview()
})
}
}
附言如果可能,请避免使用drawHierarchy - 它不是一个非常快的方法。
关于ios - 在特定 iPad 型号上添加 UIView Laggy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54904931/
在了解如何检测用户设备后:iOS - How to get device make and model? 我制作了一个快速测试应用程序以根据设备显示警报。我没有从这段代码中得到任何警告。我在这里错过了
我有一个名为 test.rb 的模型,当我在 Controller 中使用 @tests=Test.new 时,出现以下错误。有人可以解决这个问题吗? “Test:Module 的未定义方法‘新’”
我必须从不同的网络服务和我自己的数据库中获取数据,并在网站上显示之前组合这些数据。 执行此操作的最佳方法是什么?我更喜欢为 Web 服务和数据库编写单独的模型。如何将不同数据源的模型类组织到不同的文件
我必须从不同的网络服务和我自己的数据库中获取数据,并在网站上显示之前组合这些数据。 执行此操作的最佳方法是什么?我更喜欢为 Web 服务和数据库编写单独的模型。如何将不同数据源的模型类组织到不同的文件
我正在开发一种模糊搜索机制。我在数据库(mysql)(英文和俄文名称)中有汽车品牌/型号和城市 - 大约 1000 项。用户可以输入错误或翻译中的单词。现在我从 db 中检索所有这些单词,并将循环中的
问题 我在一家拥有大量现场员工的公司工作,他们都配发了 iPhone。但这些手机的型号各不相同,没有早于 iPhone 4 的。我需要一种快速的方法来确定哪个人拥有哪种型号的 iPhone,因为该数据
这个问题在这里已经有了答案: 关闭 9 年前。 Possible Duplicate: Determine device (iPhone, iPod Touch) with iPhone SDK H
我有我的应用程序的故障转储。我的应用程序失败,因为一些用户说“无效指令”试图执行我在那里的一些 SSSE 指令。 在 WinDBG 中,如何找出 CPU 型号,以便找出其指令集,并支持该指令集,或更新
这是我的想法(原谅 Django 格式): class VehicleMake(Model): name = CharField(max_length=50) class VehicleMod
我知道 before_filter 仅适用于 Rails 中的 Controller ,但我想要一个模型这样的东西:每当我的模型中的一个方法被调用时,我想运行一个方法来确定被调用的方法是否应该运行。从
我按以下方式编写代码 #define isiPhone6 ( [[UIScreen mainScreen] bounds].size.height == 667)?TRUE:FALSE #define
我正在使用 Apache Mahout 解决二进制分类问题。我使用的算法是 OnlineLogisticRegression,我目前拥有的模型强烈倾向于产生 1 或 0 的预测,没有任何中间值。 请提
我正在使用 mysql 查询返回适合 php 中某些汽车的产品数组,如下所示; array { [0]=> array(3) { ["sku"]=> string(16) "123a "
有谁知道在 Android 下获取绑定(bind)蓝牙设备的制造商和型号的方法吗?例如,如果我与蓝牙耳机配对,我希望能够确定该耳机的制造商和型号。 谢谢! 最佳答案 目前在 Android 中没有公共
如果我有 3 个模型要连接怎么办? 例如: 用户可以对许多不同的应用程序拥有许多不同的权限。 所以我需要一个表来存储: user_id permission_id application_id has
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 7年前关闭。 Improve thi
我正在尝试为 XS Max 定制设计。之前我只是通过检查 main.bound.screen.height 来识别设备,对于 XS Max,根据此网站:https://www.paintcodeapp
如果我使用 ng-model 作为输入字段并将其清空,则 Angular 将其设置为 '' 而不是 null,即使它之前为 null。 这对我来说是一个问题,因为如果输入字段为空,我需要将 null
我需要获取型号,例如:对于 iPhone 6,我想要的型号是 N61AP 而不是 iPhone 7,2。我在objective-c中需要这个。 我尝试了一些方法,但我得到的只是'iPhone 7,2'
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a software
我是一名优秀的程序员,十分优秀!