菜鸟教程小白 发表于 2022-12-13 03:40:07

ios - 相应地移动 View uivew 折叠/展开动画


                                            <p><p>我有一个具有展开/折叠动画的自定义 View 横幅,类似于此处所述 <a href="https://stackoverflow.com/questions/5151250/iphone-expand-and-collapse-a-uiview-programmatically" rel="noreferrer noopener nofollow">iphone: expand and collapse a UIView programmatically</a> . </p>

<p>当我将该 View 集成到任何现有的 ViewController 时,当它扩展以向下推现有 View 时,我想要什么。现在只是重叠了。</p>

<p>如何在 iOS 中实现这一点?在 Android 中,我使用 Visibility.Gone 完成了它,但在这里我找不到类似的东西。横幅可以在任何 View 层次结构中,直接是主视图的 subview ,但是当它展开时,我希望所有 View 都向下移动,以使其在展开时向下推所有内容。 </p>

<p>这里是使用 Visibility.Gone 的 Android 方法的链接 <a href="https://stackoverflow.com/questions/4946295/android-expand-collapse-animation" rel="noreferrer noopener nofollow">Android: Expand/collapse animation</a> </p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>您可以通过操作横幅 View 的框架属性及其在横幅 View 层次结构中的 sibling 来获得结果。所有这些都可以包含在横幅 View 对象中。 <code>frame</code> 属性是可动画的。</p>

<p>将 BannerView 作为 UIView 的子类。向它的公共(public) <code>@interface</code> 添加一些方法:</p>

<pre><code>    - (void) collapse;
    - (void) expand;
    - (void) toggle;
</code></pre>

<p>您将需要横幅的展开和折叠框架的几个属性:</p>

<pre><code>@property (nonatomic, assign) CGRect expandedFrame;
@property (nonatomic, assign) CGRect collapsedFrame;
</code></pre>

<p>这些可以放在(公共(public))@interface 或(私有(private))类别扩展中。在 BannerView 的初始化过程中设置它们:</p>

<pre><code>    //initialising in code
    - (id)initWithFrame:(CGRect)frame{
      if (self = ) {
            ;
      }
      return self;
    }

    //initialising from XIB/Storyboard
    - (void)awakeFromNib {
      ;
    }

    - (void)initialiseFrames:(CGRect)frame {
      self.expandedFrame = frame;
      frame.size.height = 0;
      self.collapsedFrame = frame;
    }
</code></pre>

<p>当你展开或折叠你的bannerView时,它可以使用迭代表单迭代它的兄弟 View </p>

<pre><code>for (UIView* view in self.superview.subviews) {}
</code></pre>

<p>通过设置它们各自的 <code>frame</code> 属性相应地向上或向下移动它们。要升高和降低框架,请增加或减少横幅 View 的高度...</p>

<pre><code>- (CGRect)lowerFrame:(CGRect)frame {
    frame.origin.y += CGRectGetHeight(self.expandedFrame);
    return frame;
}

- (CGRect)raiseFrame:(CGRect)frame {
    frame.origin.y -= CGRectGetHeight(self.expandedFrame);
    return frame;
}
</code></pre>

<p>将这些部分放在一起,您可以制作折叠和展开动画方法,通过设置它们的框架将兄弟 View 移动到正确的位置,然后通过设置 <em>it's</em> 框架折叠/展开横幅 View :</p>

<pre><code>- (void) collapse {
    if (CGRectEqualToRect(self.frame, self.collapsedFrame)) return;
    [UIView animateWithDuration:0.5 animations:^{
      for (UIView* view in self.superview.subviews) {
            if (CGRectGetMinY(view.frame) &gt; CGRectGetMaxY(self.frame))
                view.frame = ;
      }
      self.frame = self.collapsedFrame;
    }];

}

- (void) expand {
    if (CGRectEqualToRect(self.frame, self.expandedFrame)) return;
    [UIView animateWithDuration:0.5 animations:^{
      for (UIView* view in self.superview.subviews) {
            if (CGRectGetMinY(view.frame) &gt; CGRectGetMaxY(self.frame))
                view.frame = ;
      }
      self.frame = self.expandedFrame;
    }];

}
</code></pre>

<p>...以及在两种状态之间移动的切换方法</p>

<pre><code>- (void) toggle {
    if (CGRectEqualToRect(self.frame, self.collapsedFrame))
      ;
    else ;
}
</code></pre></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 相应地移动 Viewuivew 折叠/展开动画,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/18397533/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/18397533/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 相应地移动 View uivew 折叠/展开动画