• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

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

[复制链接]
菜鸟教程小白 发表于 2022-12-13 03:40:07 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

我有一个具有展开/折叠动画的自定义 View 横幅,类似于此处所述 iphone: expand and collapse a UIView programmatically .

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

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

这里是使用 Visibility.Gone 的 Android 方法的链接 Android: Expand/collapse animation



Best Answer-推荐答案


您可以通过操作横幅 View 的框架属性及其在横幅 View 层次结构中的 sibling 来获得结果。所有这些都可以包含在横幅 View 对象中。 frame 属性是可动画的。

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

    - (void) collapse;
    - (void) expand;
    - (void) toggle;

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

@property (nonatomic, assign) CGRect expandedFrame;
@property (nonatomic, assign) CGRect collapsedFrame;

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

    //initialising in code
    - (id)initWithFrameCGRect)frame{
        if (self = [super initWithFrame:frame]) {
            [self initialiseFrames:frame];
        }
        return self;
    }

    //initialising from XIB/Storyboard
    - (void)awakeFromNib {
        [self initialiseFrames:self.frame];
    }

    - (void)initialiseFramesCGRect)frame {
        self.expandedFrame = frame;
        frame.size.height = 0;
        self.collapsedFrame = frame;
    }

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

for (UIView* view in self.superview.subviews) {}

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

- (CGRect)lowerFrameCGRect)frame {
    frame.origin.y += CGRectGetHeight(self.expandedFrame);
    return frame;
}

- (CGRect)raiseFrameCGRect)frame {
    frame.origin.y -= CGRectGetHeight(self.expandedFrame);
    return frame;
}

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

- (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 raiseFrame: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 lowerFrame:view.frame];
        }
        self.frame = self.expandedFrame;
    }];

}

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

- (void) toggle {
    if (CGRectEqualToRect(self.frame, self.collapsedFrame))
        [self expand];
    else [self collapseBanner];
}

关于ios - 相应地移动 View uivew 折叠/展开动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18397533/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap