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) > 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) > 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]