菜鸟教程小白 发表于 2022-12-12 13:23:26

ios - 使用 AutoLayout 将 UIImageView 从中心动画到父 UIView 顶部的 20 点


                                            <p><p>当我对 UIImageView 和父 UIView 顶部之间的距离使用约束时,动画本身可以工作,而无需垂直和水平居中。</p>

<p>UIImageView 的约束:</p>

<ul>
<li>宽度:240</li>
<li>高度:128</li>
<li>Top Layout 的顶部空间:200 --> 连接到 logoImageViewVerticalSpaceConstraint</li>
</ul>

<p>当我使用这个动画时效果很好:</p>

<pre><code>self.logoImageViewVerticalSpaceConstraint.constant = 20;

[UIView animateWithDuration: 1.0
                      delay: 0
                  options:(UIViewAnimationOptionCurveEaseInOut|UIViewAnimationOptionAllowUserInteraction)                     
               animations:^{;}
               completion:^(BOOL finished) {NSLog(@&#34;Finished animation&#34;); }];
</code></pre>

<p>当我不想使用静态空间来顶部布局约束时,问题就出现了,因为 ImageView 需要居中以用于 3.5 和 4 英寸设备。为了解决这个问题,我想从垂直和水平中心约束开始。 </p>

<ul>
<li>宽度:240</li>
<li>高度:128</li>
<li>将中心 x 对齐到:superview --> 连接到 logoImageViewYCenterConstraint</li>
<li>将中心 y 对齐到:superview</li>
</ul>

<p>现在我想我可以简单地删除 y 中心约束并自己将空间添加到 20pt 的顶部布局约束:</p>

<pre><code>;

NSLayoutConstraint *topSpaceConstraint = [NSLayoutConstraint
constraintWithItem:self.view                                                                         attribute:NSLayoutAttributeTop
relatedBy:NSLayoutRelationEqual                                                                                    toItem:self.logoImageView
attribute:NSLayoutAttributeTop                                                                              multiplier:1
constant:20];
    ;

    [UIView animateWithDuration: 1.0
                        delay: 0
                        options:(UIViewAnimationOptionCurveEaseInOut|UIViewAnimationOptionAllowUserInteraction)                     
                        animations:^{
                           ;
                        }
                        completion:^(BOOL finished) {
                           NSLog(@&#34;Finished animate&#34;);
                        }];
</code></pre>

<p>结果是 UIImageView 保持居中并且有点爆炸。
这与我期望发生的完全相反,因为我删除了 x 中心约束。将距离为 20pt 的顶部约束添加到父 UIView 的顶部,我没有触及任何其他约束(如宽度和高度)。</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>一个 <code>NSLayoutConstraint</code> 有一个或两个被它约束的 View 。在您的情况下, View 是 <code>self.logoImageView</code> 和 <code>self.view</code>。</p>

<p>要产生任何效果,约束必须安装在 View 上,而不仅仅是任何 View 。约束必须安装在<strong>两个受约束 View 的共同祖先</strong>上。 (请注意, View 被认为是其自身的祖先。)当您移除约束时,<strong>您必须将其从安装它的 View 中移除</strong>。</p>

<p>您正试图从 <code>self.logoImageView</code> 中移除居中约束,但该约束无法安装在该 View 上。</p>

<p>从 iOS 8.0 开始,卸载约束的首选(也是最简单)方法是将其 <code>active</code> 属性设置为 <code>NO</code>:</p>

<pre><code>self.logoImageViewYCenterConstraint.active = NO;
</code></pre>

<p>在 iOS 8.0 之前,您必须从安装它的 View 中删除它。约束可能安装在 <code>self.view</code> 上。所以试试这个:</p>

<pre><code>;
</code></pre>

<p>另请注意,如果您想将 ImageView 动画化回中心,则需要卸载 <code>topSpaceConstraint</code> 并重新安装 <code>self.logoImageViewYCenterConstraint</code>。</p>

<p>解决此问题的另一种方法是同时安装<strong>两个</strong>约束,但给其中一个较低的优先级。当你需要改变 ImageView 的位置时,改变约束的优先级。因此:</p>

<pre><code>- (void)viewDidLoad {
    ;
    if (self.topSpaceConstraint == nil) {
      self.topSpaceConstraint = ;
      self.topSpaceConstraint.priority = 1;
      ;
    }
}

- (void)setImageViewCenteredVertically:(BOOL)isCentered animated:(BOOL)animated {
    if (isCentered) {
      self.topSpaceConstraint.priority = 1;
      self.logoImageViewYCenterConstraint.priority = UILayoutPriorityRequired;
    } else {
      self.topSpaceConstraint.priority = UILayoutPriorityRequired;
      self.logoImageViewYCenterConstraint.priority = 1;
    }

    if (animated) {
      [UIView animateWithDuration:1 delay:0
            options:UIViewAnimationOptionCurveEaseInOut | UIViewAnimationOptionAllowUserInteraction
            animations:^{
                ;
            }
            completion:nil];
    }
}
</code></pre></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 使用 AutoLayout 将 UIImageView 从中心动画到父 UIView 顶部的 20 点,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/18112769/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/18112769/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 使用 AutoLayout 将 UIImageView 从中心动画到父 UIView 顶部的 20 点