- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有一个 UIView,我像这样以编程方式添加到我的 UIViewController 中:
if let myView = Bundle.main.loadNibNamed("MyView", owner: self, options: nil)?.first as? MyView
{
self.view.addSubview(myView)
myView.translatesAutoresizingMaskIntoConstraints = false
//Horizontal orientation
self.view.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|-10-[view]-10-|", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: ["view":myView]))
}
很好, View 在 View Controller 的 (0,0) 左右添加了所需的空间。
我想要实现的是 View 从 View Controller 的底部到中心进行动画处理,然后从中心到顶部进行动画处理。所以首先我尝试将它设置为从当前位置 (0,0) 居中
所以我做的是:
UIView.animate(withDuration: 1.0,
animations:
{
let center = NSLayoutConstraint(item: myView, attribute: .centerY, relatedBy: .equal, toItem: self.view, attribute: .centerY, multiplier: 1, constant: CGFloat(0.0))
self.view.addConstraint(center)
})
好吧, View 位于中心,但它不是动画。它直接跳转到它。
我搜索并找到了很多答案说我必须设置约束的常量然后调用 layoutIfNeeded()
但所有这些示例都使用对之前设置为 IBOutlet 的约束的引用,我没有,因为我以编程方式添加我的 View 。
如何正确地为 View 设置动画,从底部到中心然后从中心到顶部?
已经谢谢你了!
问候
编辑 1
好吧,我要更进一步解释我想要实现的目标。在我的 View Controller 上,在向用户显示 5 秒计时器后,我想一个接一个地显示几个问题。
我想要一个问题从底部滑入中心,得到回答,然后从中心滑出到顶部。然后下一个问题从底部到中心出现,回答滑出等等。
因此,在 5 秒计时器后,我调用了名为 slideInQuestion 的方法,该方法创建了一个问题并将其设置为动画:
func slideInQuestion()
{
let question:QuestionView = createQuestion()
UIView.animate(withDuration: 1.0,
animations:
{
self.yConstraint?.constant = CGFloat(0.0)
self.view.layoutIfNeeded()
})
createQuestion 方法实例化问题 View 并为其分配约束
func createQuestion() -> QuestionView
{
if let questionView = Bundle.main.loadNibNamed("QuestionView", owner: self, options: nil)?.first as? QuestionView
{
self.view.addSubview(questionView)
questionView.translatesAutoresizingMaskIntoConstraints = false
//Horizontal orientation
self.view.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|-10-[view]-10-|", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: ["view":questionView]))
yConstraint = NSLayoutConstraint(item: questionView,
attribute: .centerY,
relatedBy: .equal,
toItem: self.view,
attribute: .centerY,
multiplier: 1,
constant: CGFloat(UIScreen.main.bounds.height))
self.view.addConstraint(yConstraint!)
return questionView
}
return QuestionView()
}
之前,我按照 Duncan C 的建议将 yConstraint 定义为实例变量,如下所示:
var yConstraint:NSLayoutConstraint?
所以我期望我现在拥有的是:
问题 View 已创建,它的中心位于 View Controller 的中心 + 屏幕的高度。这使得它在屏幕底部的可见 View 之外。然后在1秒内从这个位置滑到屏幕的centerY(0.0)。
但它现在所做的是从屏幕顶部滑动到屏幕的 centerY 并且同时它调整到左右边距,就像在第一个约束中设置的那样
self.view.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|-10-[view]-10-|", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: ["view":questionView]))
我现在完全糊涂了,希望我的解释能有所帮助,希望有人有想法。
谢谢!
最佳答案
因为我不知道你的 View 是如何从你的包中创建的,所以我已经根据你的代码拼凑了一个简单的例子。
关键是 self.view.layoutIfNeeded()
被调用了两次。添加 View 后一次,第二次在动画 block 中。并且约束的修改不在动画 block 内。
import UIKit
class ViewController: UIViewController {
var yConstraint:NSLayoutConstraint?
override func viewWillAppear(_ animated: Bool) {
self.createView()
self.view.layoutIfNeeded()
self.yConstraint?.constant = 32
UIView.animate(withDuration: 1.0) {
self.view.layoutIfNeeded()
}
}
func createView(){
let questionView = UIView()
questionView.backgroundColor = UIColor.red
let heightConstraint = NSLayoutConstraint(item: questionView, attribute: .height, relatedBy: .equal, toItem: nil, attribute: .height, multiplier: 1, constant: self.view.bounds.height-64)
questionView.addConstraint(heightConstraint)
self.view.addSubview(questionView)
questionView.translatesAutoresizingMaskIntoConstraints = false
//Horizontal orientation
self.view.addConstraints(
NSLayoutConstraint.constraints(withVisualFormat: "H:|-10-[view]-10-|", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: ["view":questionView]))
yConstraint = NSLayoutConstraint(item: questionView,
attribute: .top,
relatedBy: .equal,
toItem: self.view,
attribute: .top,
multiplier: 1,
constant: CGFloat(UIScreen.main.bounds.height))
self.view.addConstraint(yConstraint!)
}
}
关于ios - 以编程方式添加后,使用约束为 UIView 设置动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42447423/
我一直在阅读有关汇编函数的内容,但对于是使用进入和退出还是仅使用调用/返回指令来快速执行,我感到很困惑。一种方式快而另一种方式更小吗?例如,在不内联函数的情况下,在汇编中执行此操作的最快(stdcal
我正在处理一个元组列表,如下所示: res = [('stori', 'JJ'), ('man', 'NN'), ('unnatur', 'JJ'), ('feel', 'NN'), ('pig',
最近我一直在做很多网络或 IO 绑定(bind)操作,使用线程有助于加快代码速度。我注意到我一直在一遍又一遍地编写这样的代码: threads = [] for machine, user, data
假设我有一个名为 user_stats 的资源,其中包含用户拥有的帖子、评论、喜欢和关注者的数量。是否有一种 RESTful 方式只询问该统计数据的一部分(即,对于 user_stats/3,请告诉我
我有一个简单的 api,它的工作原理是这样的: 用户创建一个请求 ( POST /requests ) 另一个用户检索所有请求 ( GET /requests ) 然后向请求添加报价 ( POST /
考虑以下 CDK Python 中的示例(对于这个问题,不需要 AWS 知识,这应该对基本上任何构建器模式都有效,我只是在这个示例中使用 CDK,因为我使用这个库遇到了这个问题。): from aws
Scala 中管理对象池的首选方法是什么? 我需要单线程创建和删除大规模对象(不需要同步)。在 C++ 中,我使用了静态对象数组。 在 Scala 中处理它的惯用和有效方法是什么? 最佳答案 我会把它
我有一个带有一些内置方法的类。这是该类的抽象示例: class Foo: def __init__(self): self.a = 0 self.b = 0
返回和检查方法执行的 Pythonic 方式 我目前在 python 代码中使用 golang 编码风格,决定移动 pythonic 方式 例子: import sys from typing imp
我正在开发一个 RESTful API。其中一个 URL 允许调用者通过 id 请求特定人员的记录。 返回该 id 不存在的记录的常规值是什么?服务器是否应该发回一个空对象或者一个 404,或者其他什
我正在使用 pathlib.Path() 检查文件是否存在,并使用 rasterio 将其作为图像打开. filename = pathlib.Path("./my_file-name.tif") 但
我正在寻找一种 Pythonic 方式来从列表和字典创建嵌套字典。以下两个语句产生相同的结果: a = [3, 4] b = {'a': 1, 'b': 2} c = dict(zip(b, a))
我有一个正在操裁剪理设备的脚本。设备有时会发生物理故障,当它发生时,我想重置设备并继续执行脚本。我有这个: while True: do_device_control() device
做组合别名的最pythonic和正确的方法是什么? 这是一个假设的场景: class House: def cleanup(self, arg1, arg2, kwarg1=False):
我正在开发一个小型客户端服务器程序来收集订单。我想以“REST(ful)方式”来做到这一点。 我想做的是: 收集所有订单行(产品和数量)并将完整订单发送到服务器 目前我看到有两种选择: 将每个订单行发
我知道在 Groovy 中您可以使用字符串调用类/对象上的方法。例如: Foo."get"(1) /* or */ String meth = "get" Foo."$meth"(1) 有没有办法
在 ECMAScript6 中,您可以使用扩展运算符来解构这样的对象 const {a, ...rest} = obj; 它将 obj 浅拷贝到 rest,不带属性 a。 有没有一种干净的方法可以在
我有几个函数返回数字或None。我希望我的包装函数返回第一个不是 None 的结果。除了下面的方法之外,还有其他方法吗? def func1(): return None def func2(
假设我想设计一个 REST api 来讨论歌曲、专辑和艺术家(实际上我就是这样做的,就像我之前的 1312414 个人一样)。 歌曲资源始终与其所属专辑相关联。相反,专辑资源与其包含的所有歌曲相关联。
这是我认为必须经常出现的问题,但我一直无法找到一个好的解决方案。假设我有一个函数,它可以作为参数传递一个开放资源(如文件或数据库连接对象),或者需要自己创建一个。如果函数需要自己打开文件,最佳实践通常
我是一名优秀的程序员,十分优秀!