电影项目 (四)

一.子类化UICollectionViewFlowLayout:

代码如下 :

//
//  LargeCollectionViewLayout.m
//  Movie 2.0
//
//  Created by mac1 on 15/10/12.
//  Copyright (c) 2015年 www.iphonetrain.com. All rights reserved.
//

#import "LargeCollectionViewLayout.h"
#import "Common.h"

@implementation LargeCollectionViewLayout

- (id)init{

    self = [super init];
    if (self) {

        //布局信息
        self.itemSize =
        CGSizeMake(kScreenWidth * 0.75,
                   kScreenHeight - kNavigationBarHeight - kTabBarHeight -
                   kMovieHeaderViewHeight - kMovieFooterViewHeight);
        //上下分别留出来其他两个部分的位置,
        //减去距离CollectionView顶部和底部空余的空间

        // flowLayout.minimumInteritemSpacing = 0;
        self.minimumLineSpacing = 0;

        self.scrollDirection = UICollectionViewScrollDirectionHorizontal;

    }

    return self;

}

二.设置放大缩小:

//当bounds发生变化时,是否继续布局
- (BOOL)shouldInvalidateLayoutForBoundsChange:(CGRect)newBounds{

    return YES;

}

//设置一定范围内,CollectionView元素(Cell、装饰视图、补充视图)的布局属性
- (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect {

    //先获取rect范围内这些元素,之前的布局信息
    NSArray *array = [super layoutAttributesForElementsInRect:rect];

    //可见的范围
    CGRect visibleRect;
    visibleRect.origin = self.collectionView.contentOffset;
    visibleRect.size = self.collectionView.bounds.size;

    //数组中保存的所有的元素的布局信息 UICollectionViewLayoutAttributes
    for (UICollectionViewLayoutAttributes *attribute in array) {
        // NSLog(@"att = %@", attribute);
        // attribute.transform = CGAffineTransformMakeScale(0.5, 0.5);

        //判断两个rect是否有交集,如果单元格frame和rect有交叉,修改transform
        if (CGRectIntersectsRect(attribute.frame, rect)) {

            // 单元格移动的距离 = 可见范围的中心 - 单元格frame的中心
            // CGRectGetMidX(rect)获取rect的中心点的x坐标
            CGFloat distance = CGRectGetMidX(visibleRect) - attribute.center.x;

            CGFloat disScale = distance / 200;

            if (ABS(distance) < 200) { // ABS(a)取a的绝对值
                //放大的比例
                CGFloat scale = 1 + 0.1 * (1 - ABS(disScale));

                // transform3D 是三维坐标系统的变化
                // CATransform3DMakeScale 分别对三个坐标轴进行缩放
                // sz参数是第三个坐标轴,垂直于屏幕为坐标轴
                attribute.transform3D = CATransform3DMakeScale(scale, scale, 1);

                // zIndex是z轴方向上的坐标值
                attribute.zIndex = 1;
            }
        }
    }

    //将修改后的布局信息返回
    return array;
}

//返回一个目标偏移量(最终停留的位置)
- (CGPoint)targetContentOffsetForProposedContentOffset:(CGPoint)proposedContentOffset withScrollingVelocity:(CGPoint)velocity{

    //ProposedContentOffset 如果没有对齐的效果本来应该停留的位置

    //找屏幕的中心,取到所有单元格,单元格的中心和屏幕的中心进行比较,找到最接近屏幕中心的单元格
    //根据这个单元格,去推算目标偏移量

    CGFloat horizontalCenter = (self.collectionView.bounds.size.width / 2) + proposedContentOffset.x;
    //指定当前显示的范围
    CGRect rect = CGRectMake(proposedContentOffset.x, 0, self.collectionView.bounds.size.width, self.collectionView.bounds.size.height);
    NSArray *array = [super layoutAttributesForElementsInRect:rect];

    CGFloat minimumValue = MAXFLOAT; //单元格和屏幕中心差值的最小值

    for (UICollectionViewLayoutAttributes *attribute in array) {
        CGFloat itemCenter = attribute.center.x;
        if (ABS(itemCenter - horizontalCenter) < ABS(minimumValue)) {
            minimumValue = itemCenter - horizontalCenter; //最终有一个最接近屏幕中心的单元格
        }
    }

    //之前偏移量 + (单元格的中心距离当前停留的中心的距离)
    CGPoint targetContentOffset = CGPointMake(proposedContentOffset.x + minimumValue, proposedContentOffset.y);
    return targetContentOffset;
}
时间: 2024-10-21 16:52:40

电影项目 (四)的相关文章

android 实践项目四

android 实践项目四 本周主要是开发android baidumap实现公交的查询 1.权限的取得和对屏幕的支持 1 <uses-permission android:name="android.permission.BAIDU_LOCATION_SERVICE" > 2 </uses-permission> 3 <uses-permission android:name="android.permission.ACCESS_NETWORK

16周(项目四 动态数组)

/* *copyright(c) 2014,烟台大学计算机学院 *All rights reserved. *文件名称:16周(项目四 动态数组) *作者:王忠 *完成日期:2014.12.15 *版本号:v1.0 * *问题描述:新增一个恰当长度的动态数组,将原数组中的数据"复制"到新数组,接着再输入新的数据.增加新数据后的数组,成为保存数据的新数组. *输入描述:输入成绩,学生数 *程序输出:新增的学生数 成绩 #include <iostream> using nam

MVC4商城项目四:应用Bundle捆绑压缩技术

从MVC4开始,我们就发现,项目中对Global.asax进行了优化,将原来在MVC3中使用的代码移到了[App_Start]文件夹下,而Global.asax只负责初始化.其中的BundleConfig类就有个很牛X的功能:合并与压缩.想到以前做ASP.NET的时候要通过工具压缩,手动合并,很麻烦.通过BundleConfig可以大大的提高工作效率和项目性能. 一.基本的使用 1.1.Global.asax文件的初始化 protected void Application_Start() {

docker 运行jenkins及vue项目与springboot项目(四.docker运行nginx)

docker 运行jenkins及vue项目与springboot项目: 一.安装docker 二.docker运行jenkins为自动打包运行做准备 三.jenkins的使用及自动打包vue项目 四.docker运行nginx 五.jenkins打包springboot服务且在docker中运行 准备配置 创建 /home/jenkins/docker/nginx/nginx.conf 文件及/home/docker/nginx/log文件夹 其nginx.conf 文件为在原nginx.co

微信小程序豆瓣电影项目的改造过程经验分享

在学习微信小程序开发过程中,一部分的难点是前端逻辑的处理,也就是对前端JS的代码编辑:一部分的难点是前端界面的设计展示:本篇随笔基于一个豆瓣电影接口的小程序开源项目进行重新调整,把其中遇到的相关难点和改进的地方进行讨论介绍,希望给大家提供一个参考的思路,本篇随笔是基于前人小程序的项目基础上进行的改进,因此在开篇之前首先对原作者的辛劳致敬及感谢. 1.豆瓣电影接口的小程序项目情况 豆瓣电影接口提供了很多相关的接口给我们使用,豆瓣电影接口的API地址如下所示:https://developers.d

P2P理财项目四个月开发总结

目前项目情况 这个项目从元旦开始开发到现在已经有四个多月的时间了,上线期限也是一拖再拖,从整个项目开发情况来看造成项目延期的原因有很多,简单分析和总结一下这个项目的优缺点,以及在这个项目中的成长. 项目进展分析 需求方面 需求变动在原因里面占用20%,通过个人感觉这个项目需求变动造成的时间浪费在20%左右,一般项目在代码写了一部分后基本上需求是不会再变了,可是这个项目再开发了两个月之后,需求又大变了一次,导致很多代码重新开发或者从新编译,开发重复劳动情绪也收到影响,当然项目慢也不能完全推给需求,

电影项目 (三)

一.创建海报视图 : - (void)_createPosterView{ // _posterView = [[UIView alloc] initWithFrame:self.view.bounds]; // _posterView.backgroundColor = [UIColor orangeColor]; // _posterView.hidden = NO; // // [self.view addSubview:_posterView]; //布局对象 UICollectionV

项目四:Java秒杀系统方案优化-高性能高并发实战

技术栈 前端:Thymeleaf.Bootstrap.JQuery 后端:SpringBoot.JSR303.MyBatis 中间件:RabbitMQ.Redis.Druid 功能模块 分布式会话,商品列表页,商品详情页,订单详情页,系统压测,缓存优化,消息队列,接口安全. 一.项目框架搭建 1.Spring Boot环境搭建 2.集成Thymeleaf,Result结果封装 3.集成Mybatis+Druid 4.集成Jedis+Redis安装+通用缓存Key封装 二.实现登录功能 1.数据库

第十一周 项目四 类族的设计】

项目4 - 类族的设计] 按以下的提示,由基类的设计和测试开始,逐渐地完成各个类的设计,求出圆格柱体的表面积.体积并输出并且完成要求的计算任务: (1)先建立一个Point(点)类,包含数据成员x,y(坐标点),实现需要的成员函数,并设计main函数完成测试: (2)以Point为基类,派生出一个Circle(圆)类,增加数据成员r(半径),以及求面积的成员函数area,实现其他需要的成员函数,设计main函数完成测试: (3)再以Circle类为直接基类,派生出一个Cylinder(圆柱体)类