菜鸟教程小白 发表于 2022-12-13 02:50:38

ios - UIView 动画返回原点


                                            <p><p>我在 UITableViewCell 中有一个 UILabel。当用户点击单元格时,我正在尝试使标签向右移动。我有这个代码:</p>

<pre><code>CGRect otherFrame = cellLabel.frame;
otherFrame.origin.x +=50;
[UIView animateWithDuration:1.0f animations:^{
    cellLabel.frame = otherFrame;   
}];
</code></pre>

<p>发生的奇怪事情是标签向左跳跃 50 像素并以动画方式返回其原点( Action 开始前的位置)。</p>

<p>实际上,我在本周早些时候进行了这项工作,并且没有遇到任何问题,并且在浏览了修订历史之后,我无法弄清楚我哪里出错了。我一定是错过了什么愚蠢的东西。</p>

<p><strong>编辑:</strong>
根据 Jakub 的回答,我发现这是可行的:</p>

<pre><code>[UIView animateWithDuration:0.01f animations:^{}
completion:^(BOOL finished)
{
   CGRect otherFrame = cellLabel.frame;
   otherFrame.origin.x += 50;
   [UIView animateWithDuration:1.0f animations:^{
            cellLabel.frame = otherFrame;
    }];

}];
</code></pre>

<p>奇怪的是,如果我将所有逻辑移动到一个完成处理程序中,该处理程序在第一个完成后执行一个新动画(第一个实际上没有做任何事情),那么一切都会正确动画。这是 superhacky,我对此一点也不满意。</p>

<p>谁能想到什么会导致初始动画将帧移动到预期目标的负偏移量,只是将其动画回原点,以及为什么触发新动画作为空动画的完成处理程序会工作吗?</p>

<p><strong>编辑 2:</strong></p>

<p>我会将邓肯的答案标记为正确的答案,因为它为我指明了正确的方向,但我仍然对为什么/如何会出现这些症状感到困惑:</p>

<ol>
<li>动画将帧移动到负偏移
目的地,然后将其动画回原点(而不是从
始发地到目的地)</li>
<li>运行一个空的动画 block ,但将另一个动画添加到第一个 block 的完成处理程序可以正确动画</li>
</ol>

<p><em>尝试回答的信息:</em></p>

<ol 开始=“3”>
<li>我必须为项目使用自动布局,据我所知,我
无法为单个 View 禁用它</li>
<li>我没有在后台线程上放任何东西。我没有尝试专门分派(dispatch)到主线程,但我想我已经在那里了。不是所有可见的 UI 总是在主线程上吗?动画效果很好,只是不如预期。</li>
<li>我一开始没有走改变约束的路线的原因是我正在使用原型(prototype)单元,而 IB 不允许您从原型(prototype)单元创建 IBOutlets。遍历一个约束列表并检测一个特定的约束列表需要做一些工作,所以我将约束留空并尝试为框架设置动画(正如我所说,它在本周早些时候工作——并且在从动画 block 的完成处理程序)。</li>
</ol>

<p>所以最终的解决方案是给容器单元格添加约束(这里重要的是前导),然后要制作动画,我必须找到约束:</p>

<pre><code>NSLayoutConstraint *titleLeadingConstraint = nil;
for( NSLayoutConstraint *constraint in cellLabel.superview.constraints )
{
    if( constraint.firstItem == cellLabel &amp;&amp; constraint.firstAttribute == NSLayoutAttributeLeading )
    {
      titleLeadingConstraint = constraint;
    }
}
</code></pre>

<p>然后设置约束常量:</p>

<pre><code>titleLeadingConstraint.constant = 55.0;
</code></pre>

<p>然后设置动画 block :</p>

<pre><code>[UIView animateWithDuration:1.0f animations:^{
    ;
}];
</code></pre>

<p>这个解决方案应该比移动框架更能证明 future (并且健壮、可靠和稳定),但事实证明它需要大量的发现工作。</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>您是否错误地在 Storyboard 或 XIB 中设置了自动布局? (默认开启)。如果是这样,您需要关闭 AutoLayout 或为约束设置动画,而不是操作 View 的框架。</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - UIView 动画返回原点,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/26571433/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/26571433/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - UIView 动画返回原点