这让我发疯了。我正在使用 s CATransform3D 为 View 的主层设置动画(以应用透视效果)。我有一个名为 ApplyPerspective 的函数来设置它,还有 ClearPerspective 将层的转换属性重置为 CATransform3DIdentity。
这是我的代码:
ApplyPerspective(self.mainContentView);
[UIView animateWithDuration:self.animationDuration
delay:0.0
options:UIViewAnimationOptionCurveEaseOut
animations:^{
ClearPerspective(self.mainContentView);
}
completion:nil];
我遇到的问题是 ApplyPerspective 应用的透视变换不正确。如果我删除 -animateWithDuration 调用,但保留 ApplyPerspective 调用,则层将按预期呈现。我不确定为什么动画时行为会发生变化。
我已经尝试更改持续时间、动画曲线、展平函数调用,但我无法追踪此错误的来源。
更新以添加 ApplyPerspective() 和 ClearPerspective() 的主体:
void ApplyPerspective(UIView *aView) {
// Magic numbers derived using debug sliders
CGFloat zDist, rotRads, xOffset, yOffset, scale, shift;
if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) {
zDist = 172.5378;
rotRads = 2.6531;
xOffset = -13.0;
yOffset = 402;
shift = -241;
}
else {
zDist = 513.4995;
rotRads = 1.0007;
xOffset = 0.0;
yOffset = -100.0;
scale = 1.0;
shift = 0.0;
}
CATransform3D p = CATransform3DIdentity;
p = CATransform3DTranslate(p, xOffset, yOffset, 0.0);
p.m34 = 1.0 / -zDist;
p = CATransform3DRotate(p, rotRads, 1.0, 0.0, 0);
p = CATransform3DTranslate(p, 0, shift, 0.0);
aView.layer.transform = p;
}
void ClearPerspective(UIView *aView, UIView *parentView) {
aView.layer.transform = CATransform3DIdentity;
}
这是 View 层次结构:mainContentView 是 ViewController Root View 的 subview ,它使用自动布局。约束使得 mainContentView 填充 Root View 。 mainContentView 有一个兄弟 ImageView ,在动画期间用作背景。
最佳答案
我终于解决了!显然某些转换会影响自动布局,并且 mainContentView 的框架正在被布局引擎修改,即使转换被重置为恒等转换。
修复方法是将 -layoutIfNeeded 发送到父 View (在我的例子中是 self.view)以强制布局,并在动画完成后再次发送。我发布这个是因为其他人可能会遇到类似的事情。
如果您的转换看起来不正确,请发送 -layoutIfNeeded。
关于ios - 动画时 CALayer 变换不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19018503/
这里有一个很好的答案解释了如何在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返回它复制的字节数,但是当我还没有下
我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的
Unity自动旋转动画1.开门需要门把手先动,门再动2.关门需要门先动,门把手再动3.中途播放过程中不可以再次进行操作觉得太复杂?查看我的文章开关门简易进阶版效果:如果这个门可以直接打开的话,就不需要放置"门把手"如果门把手还有钥匙需要旋转,那就可以把钥匙放在门把手的"门把手",理论上是可以无限套娃的可调整参数有:角度,反向,轴向,速度运行时点击Test进行测试自己写的代码比较垃圾,命名与结构比较拉,高手轻点喷,新手有类似的需求可以拿去做参考上代码usingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;u
1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里
我基本上来自Java背景并且努力理解Ruby中的模运算。(5%3)(-5%3)(5%-3)(-5%-3)Java中的上述操作产生,2个-22个-2但在Ruby中,相同的表达式会产生21个-1-2.Ruby在逻辑上有多擅长这个?模块操作在Ruby中是如何实现的?如果将同一个操作定义为一个web服务,两个服务如何匹配逻辑。 最佳答案 在Java中,模运算的结果与被除数的符号相同。在Ruby中,它与除数的符号相同。remainder()在Ruby中与被除数的符号相同。您可能还想引用modulooperation.
RSpec似乎按顺序匹配方法接收的消息。我不确定如何使以下代码工作:allow(a).toreceive(:f)expect(a).toreceive(:f).with(2)a.f(1)a.f(2)a.f(3)我问的原因是a.f的一些调用是由我的代码的上层控制的,所以我不能对这些方法调用添加期望。 最佳答案 RSpecspy是测试这种情况的一种方式。要监视一个方法,用allowstub,除了方法名称之外没有任何约束,调用该方法,然后expect确切的方法调用。例如:allow(a).toreceive(:f)a.f(2)a.f(1)
print"Enteryourpassword:"pass=STDIN.noecho(&:gets)puts"Yourpasswordis#{pass}!"输出:Enteryourpassword:input.rb:2:in`':undefinedmethod`noecho'for#>(NoMethodError) 最佳答案 一开始require'io/console'后来的Ruby1.9.3 关于ruby-为什么不能使用类IO的实例方法noecho?,我们在StackOverflow上
A/ctohttp://wiki.nginx.org/CoreModule#usermaster进程曾经以root用户运行,是否可以以不同的用户运行nginxmaster进程? 最佳答案 只需以非root身份运行init脚本(即/etc/init.d/nginxstart),就可以用不同的用户运行nginxmaster进程。如果这真的是你想要做的,你将需要确保日志和pid目录(通常是/var/log/nginx&/var/run/nginx.pid)对该用户是可写的,并且您所有的listen调用都是针对大于1024的端口(因为绑定(
有没有办法在sinatra的beforedoblock中停止执行并返回不同的值?beforedo#codeishere#Iwouldliketo'return"Message"'#Iwouldlike"/home"tonotgetcalled.end//restofthecodeget'/home'doend 最佳答案 beforedohalt401,{'Content-Type'=>'text/plain'},'Message!'end如果你愿意,你可以只指定状态,这里有状态、标题和正文的例子
我想用sunspot重现以下原始solr查询q=exact_term_text:fooORterm_textv:foo*ORalternate_text:bar*但我无法通过标准的太阳黑子界面理解这是否可能以及如何实现,因为看起来:fulltext方法似乎不接受多个文本/搜索字段参数我不知道将什么参数作为第一个参数传递给fulltext,就好像我通过了"foo"或"bar"结果不匹配如果我传递一个空参数,我得到一个q=*:*范围过滤器(例如with(:term).starting_with('foo*')(顾名思义)作为过滤器查询应用,因此不参与评分。似乎可以手动编写字符串(或者可能使