3d立体动画 ios

2018-07-25 15:43:45 sunnyaigd830 阅读数 368

iOS精选源码

iOS天气动画,包括太阳,云,雨,雷暴,雪动画。

image

较为美观的多级展开列表

image

3D立体相册,可以旋转的立方体

image

一个仪表盘Demo YGDashboardView

image

一个基于UIScrollView 实现的画轴异步分层动画展示界面

image

一个UIView扩展,可以显示燃烧视图的动画。

image

视图调试工具,视图的框架,并以2d / 3d样式显示

image

可修改系统相机和相册标题

image

GCD信号量与替代品Bolts(Facebook出品的第三方库)

image

仿微信朋友圈拍照/小视频

image


iOS优质博客

SDWebImage学习笔记之dispatch_sync

前言之前学习GCD的时候,在很多文章中看到过这段段代码:- (void)viewDidLoad {    ;    NSLog(@”1”);    dispatch_sync(di… 阅读原文

腾讯社招iOS面试记录

毕业好几年了,上周发送了简历给腾讯,参加了腾讯面试。具体部门这边就不说了。这次面试还是收获到了很多。一面电话面试:面试官主要是针对iOS相关的基础问题。先简单自我介绍一下自己对mrc和arc的理解谈谈对自动释放池的理解自动释放池在mrc和arc区别多层自动释放池嵌套的对象在哪一层释放对于block,理解,mrc和arc… 阅读原文

iOS 富文本如何添加图片

一、概念添加图片效果图富文本添加图片代码富文本总结直接拷贝代码就可以用二、添加图片效果图图1:三、富文本添加图片代码//  ViewController.m//  测试富文本////  Created by joyshow on&… 阅读原文

React Native中的动画过渡

最近我在为下一个动画设计试着找新灵感,并在一个网站上看到了一些。我很好奇能否用React Native实现这些过渡。 我们可以看到上图包含了几个动画,工具栏(展示/隐藏),底边条(展示/隐藏),移动选定物品,隐藏所有其他物品,展示物品细节等等。动画的时间轴这个过渡的难点是让这些动画同步。我们不能真的取消挂载列… 阅读原文

iOS网络请求优化

最近发现很多网络请求都有可以优化的地方,虽然开发和测试都没有发现问题,但是可以让代码更加的优雅。想到了有四个方面可以优化,亲测有效。1. 页面返回的时候取消网络请求在一个界面进行多个请求的时候,而有可能用户马上点击了返回按钮,那么如果是使用了AFNetworking的情况,此时ViewController不会马上销毁,… 阅读原文



欢迎扫码关注微信公众号

2016-10-10 16:40:44 qq_16578397 阅读数 355

1. 准备数据(都是网上一些图片网址)

self.imageUrls = @[@"http://g.hiphotos.baidu.com/image/pic/item/03087bf40ad162d9ec74553b14dfa9ec8a13cd7a.jpg",                       @"http://e.hiphotos.baidu.com/image/pic/item/14ce36d3d539b600be63e95eed50352ac75cb7ae.jpg",            @"http://b.hiphotos.baidu.com/image/pic/item/f703738da9773912825f6388fc198618377ae2da.jpg",                   @"http://pic1.win4000.com/pic/7/98/46ff752619.jpg",                      @"http://pic1.win4000.com/pic/9/2c/5ade1167912.jpg",             @"http://g.hiphotos.baidu.com/image/pic/item/03087bf40ad162d9ec74553b14dfa9ec8a13cd7a.jpg",              @"http://e.hiphotos.baidu.com/image/pic/item/14ce36d3d539b600be63e95eed50352ac75cb7ae.jpg"];

2. 初步显示图片

创建类 XCCollectionViewLayout 继承自 UICollectionViewFlowLayout,目的就是自定义 CollectionView的样式,对layout进行修改。

- (instancetype)init
{
    if (self = [super init]) {
        self.minimumLineSpacing = 20;//设置行间距
        self.scrollDirection = UICollectionViewScrollDirectionHorizontal;//设置水平滚动
    }
    return self;
}

接下来制订Cell,这边采用自定义Cell三种方法之一,在storyboard上直接加控件,再创建XCADCollectionViewCell类继承自UICollectionView

添加UICollectionViewDataSource的代理方法,使其显示数据!

 1. (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section
{
    return self.imageUrls.count;
}

 2. (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
    XCADCollectionViewCell* cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"cell" forIndexPath:indexPath];
    cell.layer.doubleSided = NO;
    [cell.adImageView sd_setImageWithURL:[NSURL URLWithString:self.imageUrls[indexPath.row]] placeholderImage:[UIImage imageNamed:@"1.jpg"]];
    return cell;
}

3. 图片水平排放

 4. (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath
{
    return CGSizeMake(200, collectionView.frame.size.height - 100);
}
这里宽度200是图片的尺寸,高度设置collectionView的高度-100是为了防止上图中两行图片挤压的情况,所以直接让一个cell的高度占满整个容器。
    5.

4. 顶端图片滑到中间

接下来我需要实现让第一张图片和最后一张图片都能滑到屏幕中点的位置,这应该是很常见的效果,实现起来也很简单,设置collectionview的内间距。

 - (UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout insetForSectionAtIndex:(NSInteger)section
{
    NSInteger itemCount = [self collectionView:collectionView numberOfItemsInSection:section];

    NSIndexPath *firstIndexPath = [NSIndexPath indexPathForItem:0 inSection:section];
    CGSize firstSize = [self collectionView:collectionView layout:collectionViewLayout sizeForItemAtIndexPath:firstIndexPath];

    NSIndexPath *lastIndexPath = [NSIndexPath indexPathForItem:itemCount - 1 inSection:section];
    CGSize lastSize = [self collectionView:collectionView layout:collectionViewLayout sizeForItemAtIndexPath:lastIndexPath];
    return UIEdgeInsetsMake(0, (collectionView.bounds.size.width - firstSize.width) / 2,
                            0, (collectionView.bounds.size.width - lastSize.width) / 2);
}

5. 居中图片放大显示

在前面创建的 XCCollectionViewLayout类里面,有个layoutAttributesForElementsInRect的方法,功能如其名,重写下,首先需要设置放大的比例,其次要根据图片大小和间距来设定一个合适的触发放大的区域宽度,当图滑入这个区域就进行缩放

这个方法一定要加,用来刷新布局的,不然看不到滑动放大的效果
- (BOOL)shouldInvalidateLayoutForBoundsChange:(CGRect)newBounds {
    return YES;
}
- (nullable NSArray<__kindof UICollectionViewLayoutAttributes *> *)layoutAttributesForElementsInRect:(CGRect)rect
{
    NSArray *array = [[NSArray alloc] initWithArray:[super layoutAttributesForElementsInRect:rect] copyItems:YES];// 处理警告的 对数组进行深拷贝
    CGRect visibleRect = (CGRect){self.collectionView.contentOffset, self.collectionView.bounds.size};
    for (UICollectionViewLayoutAttributes *attributes in array) {
        //如果cell在屏幕上则进行缩放
        if (CGRectIntersectsRect(attributes.frame, rect)) {
            attributes.alpha = 0.5;
            CGFloat distance = CGRectGetMidX(visibleRect) - attributes.center.x;//距离中点的距离
            CGFloat normalizedDistance = distance / 140;
            if (ABS(distance) < 140) {
                CGFloat zoom = 1 + 0.4 * (1 - ABS(normalizedDistance)); //放大渐变
                attributes.transform3D = CATransform3DMakeScale(zoom, zoom, 1);
                attributes.zIndex = 1;
                attributes.alpha = 1.0;
            }
        }
    }
    return array;
}

下面这部分是对滑动放大图片的优化

 - (CGPoint)targetContentOffsetForProposedContentOffset:(CGPoint)proposedContentOffset withScrollingVelocity:(CGPoint)velocity {
    CGFloat offsetAdjustment = MAXFLOAT;
    //是整个collectionView在滑动偏移后的当前可见区域的中点
    CGFloat centerX = proposedContentOffset.x + (CGRectGetWidth(self.collectionView.bounds) / 2.0);
    //所以这里对collectionView的具体尺寸不太理解,输出的是屏幕大小,但实际上宽度肯定超出屏幕的
    CGRect targetRect = CGRectMake(proposedContentOffset.x, 0.0, self.collectionView.bounds.size.width, self.collectionView.bounds.size.height);
    NSArray *array = [super layoutAttributesForElementsInRect:targetRect];
    for (UICollectionViewLayoutAttributes *layoutAttr in array) {
        CGFloat itemCenterX = layoutAttr.center.x;
        if (ABS(itemCenterX - centerX) < ABS(offsetAdjustment)) { // 找出最小的offset 也就是最中间的item 偏移量
            offsetAdjustment = itemCenterX - centerX;
        }
    }
    return CGPointMake(proposedContentOffset.x + offsetAdjustment, proposedContentOffset.y);
}

6. 增加图片点击效果

在viewcontroller添加CollectionViewDelegate的代理方法

- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath {
    [self.collectionView selectItemAtIndexPath:indexPath animated:YES scrollPosition:UICollectionViewScrollPositionNone];
    //滚动到中间
    [self.collectionView scrollToItemAtIndexPath:indexPath atScrollPosition:UICollectionViewScrollPositionCenteredHorizontally animated:YES];
}

广告栏->Demo

2017-04-02 14:09:58 u013749108 阅读数 3690

最近看到了一个3D旋转的动画,就想着自己去实现以下。那么,接下来就通过这边文章记录以下学习过程,慢慢深入了解以下3D旋转。

一、如何旋转

每个View都在系统的坐标系中,就手机屏幕来说,左上角为 (0 , 0),向右横向的为X轴正方向,向下纵向的为Y轴正方向,垂直于手机屏幕的方向既Z轴方向。
这里写图片描述

所以Z轴的旋转属于平面上的旋转,实现3D效果的前提就是有X轴或者Y轴的参与。

二、沿着Y轴旋转

先看一下CATransform3DMakeRotation的定义:

CA_EXTERN CATransform3D CATransform3DMakeRotation (CGFloat angle, CGFloat x, CGFloat y, CGFloat z)

angle:角度    x,y,z分别代表是三个方向的坐标

按照这个思路,于是我写下如下的代码:

CATransform3D rotate = CATransform3DMakeRotation(M_PI/6, 0, 1, 0);

self.imageView.layer.transform = rotate;

运行之后可以发现,imageView 并没有出现3D效果,只是单纯的在Y轴缩短了一些。为何会出现这样的效果?

查资料后发现,原来在CALayer的显示系统中,默认使用的是正交投影,没有远小近大效果,所以我们对 imageView 的旋转操作,只能造成Y轴上的缩放。而无法观察到3D 的效果。

其实这个时候 imageView 已经沿着Y轴旋转了 M_PI/6 ,但只是我们无法直接观察到这种效果。

三、添加3D效果

这时候我们需要用到透视投影。

先看每个矩阵里数字代表的含义:

 struct CATransform3D
 {

 CGFloat m11(x缩放), m12(y切变), m13(旋转), m14();

 CGFloat m21(x切变), m22(y缩放), m23(), m24();

 CGFloat m31(旋转), m32(), m33(), m34(透视效果);

 CGFloat m41(x平移), m42(y平移), m43(z平移), m44();

 };

我们所需要的正是 m34 。

构造一个旋转矩阵

CATransform3D rotate = CATransform3DMakeRotation(M_PI/6, 0, 1, 0);

构造一个透视矩阵

其中:M34属性 控制透视效果

正的值向下(左)方往里缩放 负的值上(右)方往里缩放

disZ 控制透视的强度 数字越小 深度越大 拉伸效果越明显

CGFloat disZ = 200;

CATransform3D scale = CATransform3DIdentity;

scale.m34 = -1.0f/disZ; 

然后把两个矩阵相乘 旋转矩阵*透视矩阵

CATransform3D transform = CATransform3DConcat(rotate, scale);    

把最后的结果赋给 imageView 的 layer 的 transform 。

self.imageView.layer.transform = transform;

运行起来,具有3D效果的一张图就展示在我们的眼前了,啧啧,是不是挺简单。

四、控制旋转中心轴

如果通过角度的递增,给我们的3D旋转加一个动画,我们就会明显的看到,默认的以平行于Y轴的 imageView 的中心轴进行旋转。那么如果让我们 imageView 以自己的左边线进行旋转呢?

其实也很简单,旋转是以layer的锚点为中心进行旋转的。默认是 (0.5 , 0.5) 。我们只需要改变锚点的位置就好了。

image.layer.anchorPoint = CGPointMake(0, 0.5); 
2016-08-05 13:14:31 mingenlong 阅读数 612
 iOS在图层上使用CATransform3D制做三维动画
http://mp.weixin.qq.com/s?__biz=MzIwOTQ3NzU0Mw==&mid=2247483768&idx=1&sn=80e91f400a3f642fd754551c67a09a2c&scene=0#wechat_redirect
 CoreAnimation变速齿轮旋转动画实现
http://mp.weixin.qq.com/s?__biz=MzIwOTQ3NzU0Mw==&mid=2247483768&idx=2&sn=6d08e15050e1e86573821836cbf91544&scene=0#wechat_redirect
 iOS+JSPatch在线修改app功能
http://mp.weixin.qq.com/s?__biz=MzIwOTQ3NzU0Mw==&mid=2247483768&idx=3&sn=03e3d4bd0960f113414cf88e40429fbb&scene=0#wechat_redirect
 仿iPhone的锁屏滚动动画
http://mp.weixin.qq.com/s?__biz=MzIwOTQ3NzU0Mw==&mid=2247483768&idx=4&sn=f2254d5c27de05dd557853b68d7cd0a2&scene=0#wechat_redirect
2016-08-10 20:31:15 baidu_31326173 阅读数 510

 

 

感受一下,效果很酷炫

 

 

#import "ViewController.h"

 

@interface ViewController (){

    NSArray *array; //图片数组

    NSInteger _index; //数组下标

}

 

@property (nonatomic,strong)UIImageView *image;

 

@end

 

@implementation ViewController

 

- (void)viewDidLoad {

    [super viewDidLoad];

    _index = 0;

    self.view.backgroundColor = [UIColor whiteColor];

    for (int i = 0; i < 2; i ++) {

        UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];

        button.frame = CGRectMake(50 + i * 160, 400, 60, 40);

        button.tag = 300 + i;

        button.backgroundColor = [UIColor orangeColor];

        [button addTarget:self action:@selector(action_button:) forControlEvents:UIControlEventTouchUpInside];

        [self.view addSubview:button];

    }

    

    array = @[@"1.jpg",@"2.jpg",@"3.jpg",@"4.jpg"];

    

    _image = [[UIImageView alloc]initWithFrame:CGRectMake(10, 120, 375 - 20, 200)];

    _image.image = [UIImage imageNamed:array[0]];

    [self.view addSubview:_image];

 

}

 

- (void)action_button:(UIButton *)sender{

    switch (sender.tag) {

        case 300:{

            /*

             TYPE 的类型

             pageCurl            向上翻一页

             pageUnCurl          向下翻一页

             rippleEffect        滴水效果

             suckEffect          收缩效果,如一块布被抽走

             cube                立方体效果

             oglFlip             上下翻转效果

             */

            

            if (_index > 0) {

                _index --;

            }else{

                _index = array.count - 1;

            }

            _image.image = [UIImage imageNamed:array[_index]];

            CATransition *animation = [CATransition animation];

            animation.type = @"oglFlip";

            animation.subtype = kCATransitionFromLeft;

            animation.duration = 1.0f;

            [_image.layer addAnimation:animation forKey:@""];

            

        }break;

        case 301:{

            if (_index < array.count - 1) {

                _index ++;

            }else{

                _index = 0;

            }

            _image.image = [UIImage imageNamed:array[_index]];

            CATransition *animation = [CATransition animation];

            animation.type = @"cube";

            animation.subtype = kCATransitionFromRight;

            animation.duration = 1.0f;

            [_image.layer addAnimation:animation forKey:@""];

        }break;

        default:

            break;

    }

}

 

 

@end

若有任何问题,请联系673636634@qq.com