首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >iOS核心动画-折叠一层

问iOS核心动画-折叠一层
EN

Stack Overflow用户
提问于 2011-08-08 06:07:45
回答 3查看 9.5K关注 0票数 14

使用核心动画,我想折叠一个UIView (即它是CALayer)在它的中心。也就是说,我会将锚点设置为(0.5,0.5),并折叠这一层。我在Photoshop中创作的这张照片可能会给我带来我想要的效果-

​

​

所以,正在发生的是,层被折叠在它的中心,当折叠发生的时候,应用了一点透视图(臭名昭著的m34!)。最初,视图在X平面上是平行的,Z轴直视用户.当褶皱发生时,下半部分和上半部分同时向后移动(有一定的视角,以给出深度和3D效果),直到整个层在X平面上(平行)。注意,一旦该层在X平面上平行,用户将无法再看到该层。但没关系,这就是我想要的效果。一个UIView通过折叠在它的中心消失。

怎样才能在iOS中做到这一点呢?不使用两个不同的层(对于底部和顶部)?任何帮助都是非常感谢的。

更新:如@miamk所指出,这是“我们的选择”应用程序或"Flipboard"应用程序中使用的相同的UI效果。

更新:,为了得到更具体的答案,我已经在这方面提供了赏金。我很想看看-

  1. 代码样本。
  2. 从做过这种事的人那里得到建议。
  3. 即使是以一种详细的方式(algo)实现这一目标的方式也是非常值得赞赏的。
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-08-09 08:03:30

CALayer是平面,不能折叠。除非你为它写了一个核心图像过滤器,比如页面卷曲效果,但是如果是私有API而不是你的一个选项。

您需要将视图拆分为两个视图,并通过同时转换两个CALayer来伪造折叠。

默认情况下,图层转换没有透视图,因此还必须设置如下:

代码语言:javascript
复制
 transform.m34 = 1.0 / -2000;

OK,让我们更加清楚:将视图分割成两部分,并折叠它们:

根据您发布的图片,您的视图如下所示:

代码语言:javascript
复制
+ UIView      - Root view
    + UIImageView - The persons face
    + UILabel     - The label with title
    + UILabel     - The label with company name
    + UILabel     - The label with a short description.
    + UILabel     - The label with e-mail
    + UILabel     - The label with web address
    + UILabel     - The label with phone number

因此,在此视图层次结构中引入两个新视图,用于折叠,如下所示:

代码语言:javascript
复制
+ UIView    - Root view
    + UIView      - Top half of the card
        + UIImageView - The persons face
        + UILabel     - The label with title
        + UILabel     - The label with company name
        + UILabel     - The label with a short description.
    + UIView      - Bottom half of the view
        + UILabel     - The label with e-mail
        + UILabel     - The label with web address
        + UILabel     - The label with phone number

不要太难。现在,只动画两个视图用于分组上和下半部。

我不会为您编写代码,但是还有一个重要的技巧可以让您轻松:将视图的锚点更改为动画!你不想让它们按自己的中心旋转,相反,把旋转的中心移动到它们之间的边对齐。

代码语言:javascript
复制
 topView.layer.anchorPoint = CGPointMake(0.5f, 1.0f);
 bottomView.layer.anchorPoint = CGPointMake(0.5f, 0.0f);
票数 20
EN

Stack Overflow用户

发布于 2011-08-17 14:06:38

这类工作流呢?

从视图中获取图像

代码语言:javascript
复制
UIGraphicsBeginImageContext(self.bounds.size);
[self.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

然后使用以下方法创建2个图像(顶部和底部)

代码语言:javascript
复制
CGImageCreateWithImageInRect( CGImageRef, CGRect);

这给你留下了做你想做的事所需要的资产。动态创建可以动画的顶部和底部图像。

票数 11
EN

Stack Overflow用户

发布于 2011-08-08 18:24:09

做了一项小小的研究,偶然发现了这个令人敬畏的项目:AFKPageFlipper。最近,你知道这件事吗?它本质上是Flipboard的动画,完全用简单简单的核心动画来完成。

看看它,它令人惊讶地容易完成代码,它可能只是给您提供了一些关于如何实现所需内容的指导。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6978312

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档