iOS开发之剖析"秘密"App内容页面效果(二)

@前些天写了一篇"秘密"的Cell效果文章,但是与在工作中想要的效果还是有差距,而且扩展性很不好,于是重写封装,把整体视图都放到scrollView中,基本是和secret app 一模一样的效果了.

@代码如下:(模糊效果的类就不写了,大家可以搜"UIImage+ImageEffects",还要导入Accelerate.framework)

1.MTSecretAppEffect.h

#import <Foundation/Foundation.h>

@interface MTSecretAppEffect : NSObject

/**
 *  创建整体的scrollView,把headScrollView和tableView全部加载在上面,靠它来上下滑动,其余的滑动全部禁止
 *
 *  @return mainScrollView
 */
- (UIScrollView *)createMainScrollView;

/**
 *  创建headScrollView
 *
 *  @return headScrollView
 */
- (UIScrollView *)createHeadScrollView;

/**
 *  创建头部的模糊view
 *
 *  @param scrollview headScrollView
 *
 *  @return blurImageView
 */
- (UIImageView *)createBlurImageViewOfView:(UIScrollView *)scrollview;

/**
 *  在- (void)scrollViewDidScroll:(UIScrollView *)scrollView 中调用的方法
 *
 *  @param scrollView
 *  @param mainScrollView
 *  @param tableView
 *  @param headScrollView
 *  @param blurImageView
 */
- (void)scrollDidScrollView:(UIScrollView *)scrollView withMainScrollView:(UIScrollView *)mainScrollView withTableView:(UITableView *)tableView withHeadScrollView:(UIScrollView *)headScrollView withBlurImageView:(UIImageView *)blurImageView;
@end

2.MTSecretAppEffect.m

#import "MTSecretAppEffect.h"
#import "UIImage+ImageEffects.h"
#import <QuartzCore/QuartzCore.h>

#define HEADER_HEIGHT 200.0f
#define HEADER_INIT_FRAME CGRectMake(0, 0, 320, HEADER_HEIGHT)

const CGFloat kBarHeight = 50.0f;
const CGFloat kBackgroundParallexFactor = 0.5f;
const CGFloat kBlurFadeInFactor = 0.015f;

@implementation MTSecretAppEffect

// 欠缺:调用者设置代理
- (UIScrollView *)createMainScrollView{

    // 和Self.view同大小的底部ScrollView
    UIScrollView *mainScrollView = [[UIScrollView alloc] initWithFrame:[UIApplication sharedApplication].keyWindow.frame];
    mainScrollView.bounces = YES;
    mainScrollView.alwaysBounceVertical = YES;
    mainScrollView.contentSize = CGSizeZero;
    mainScrollView.showsVerticalScrollIndicator = YES;
    mainScrollView.scrollIndicatorInsets = UIEdgeInsetsMake(50.0f, 0, 0, 0);

    return mainScrollView;

}

- (UIScrollView *)createHeadScrollView{

    UIScrollView *headScrollView = [[UIScrollView alloc] initWithFrame:HEADER_INIT_FRAME];
    headScrollView.scrollEnabled = NO;
    headScrollView.contentSize = CGSizeMake(320, 1000);

    return headScrollView;
}

- (UIImageView *)createBlurImageViewOfView:(UIScrollView *)scrollview{

    UIGraphicsBeginImageContextWithOptions(scrollview.bounds.size, scrollview.opaque, 0.0);
    [scrollview.layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage *img = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    UIImageView *blurImageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 320, HEADER_HEIGHT)];
    blurImageView.image = [img applyBlurWithRadius:12 tintColor:[UIColor colorWithWhite:0.8 alpha:0.4] saturationDeltaFactor:1.8 maskImage:nil];
    blurImageView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
    blurImageView.alpha = 0;
    blurImageView.backgroundColor = [UIColor clearColor];

    return blurImageView;
}

- (void)scrollDidScrollView:(UIScrollView *)scrollView withMainScrollView:(UIScrollView *)mainScrollView withTableView:(UITableView *)tableView withHeadScrollView:(UIScrollView *)headScrollView withBlurImageView:(UIImageView *)blurImageView{

    CGFloat y = 0.0f;
    CGRect rect = HEADER_INIT_FRAME;
    if (scrollView.contentOffset.y < 0.0f) {
        // 下拉变大效果
        y = fabs(MIN(0.0f, mainScrollView.contentOffset.y));
        headScrollView.frame = CGRectMake(CGRectGetMinX(rect) - y / 2.0f, CGRectGetMinY(rect) - y, CGRectGetWidth(rect) + y, CGRectGetHeight(rect) + y);

    }
    else {

        y = mainScrollView.contentOffset.y;
        blurImageView.alpha = MIN(1 , y * kBlurFadeInFactor);
        CGFloat backgroundScrollViewLimit = headScrollView.frame.size.height - kBarHeight;

        if (y > backgroundScrollViewLimit) {
            headScrollView.frame = (CGRect) {.origin = {0, y - headScrollView.frame.size.height + kBarHeight}, .size = {320, HEADER_HEIGHT}};
            tableView.frame = (CGRect){.origin = {0, CGRectGetMinY(headScrollView.frame) + CGRectGetHeight(headScrollView.frame)}, .size = tableView.frame.size };
            tableView.contentOffset = CGPointMake (0, y - backgroundScrollViewLimit);
            CGFloat contentOffsetY = -backgroundScrollViewLimit * kBackgroundParallexFactor;
            [headScrollView setContentOffset:(CGPoint){0,contentOffsetY} animated:NO];
        }
        else {
            headScrollView.frame = rect;
            tableView.frame = (CGRect){.origin = {0, CGRectGetMinY(rect) + CGRectGetHeight(rect)}, .size = tableView.frame.size };
            [tableView setContentOffset:(CGPoint){0,0} animated:NO];
            [headScrollView setContentOffset:CGPointMake(0, -y * kBackgroundParallexFactor)animated:NO];
        }
    }

}

@end

3.main.m

#import "RootViewController.h"
#import "CommentCell.h"
#import "MTSecretAppEffect.h"

#define HEADER_HEIGHT 200.0f

@interface RootViewController () <UIScrollViewDelegate, UITableViewDataSource, UITableViewDelegate>

@property (nonatomic,strong) MTSecretAppEffect *secretEffect;     // secretApp 效果对象
@property (nonatomic,strong) UIScrollView *mainScrollView;        // 与view相同大小的scrollView
@property (nonatomic,strong) UIScrollView *headScrollView;        //
@property (nonatomic,strong) UIImageView  *blurImageView;         //
@property (nonatomic,strong) UITableView *tableView;              //

@end

@implementation RootViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    // 0.创建SecretApp effect 效果对象
    self.secretEffect = [[MTSecretAppEffect alloc] init];
    // 1.主底部scrollView
    self.mainScrollView = [self.secretEffect createMainScrollView];
    self.mainScrollView.delegate = self;
    self.view = self.mainScrollView;
    // 2.head背景View
    self.headScrollView = [self.secretEffect createHeadScrollView];
    // 3.背景图片视图
    UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 320, HEADER_HEIGHT)];
    imageView.image = [UIImage imageNamed:@"secret.png"];
    imageView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
    [self.headScrollView  addSubview:imageView];
    // 4.模糊视图
    _blurImageView = [self.secretEffect createBlurImageViewOfView:self.headScrollView];
    [self.headScrollView addSubview:_blurImageView];
    // 5.tableView
    self.tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, HEADER_HEIGHT, CGRectGetWidth(self.view.frame), CGRectGetHeight(self.view.frame) - 50 ) style:UITableViewStylePlain];
    self.tableView.scrollEnabled = NO;
    self.tableView.delegate = self;
    self.tableView.dataSource = self;
    self.tableView.tableFooterView = [[UIView alloc] initWithFrame:CGRectZero];
    self.tableView.separatorColor = [UIColor clearColor];
    // 6.添加视图
    [self.view addSubview:self.headScrollView];
    [self.view addSubview:self.tableView];
    // 7.设置一下
    self.mainScrollView.contentSize = CGSizeMake(320, self.tableView.contentSize.height + CGRectGetHeight(self.headScrollView.frame));

}

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {

    // 8.调用方法
    [self.secretEffect scrollDidScrollView:scrollView withMainScrollView:self.mainScrollView withTableView:self.tableView withHeadScrollView:self.headScrollView withBlurImageView:self.blurImageView];
}

#pragma mark - 隐藏状态栏
- (BOOL)prefersStatusBarHidden {
    return YES;
}

#pragma mark - UITableView dataSource

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return 20;
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {

    return 40;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    CommentCell *cell = [tableView dequeueReusableCellWithIdentifier:[NSString stringWithFormat:@"Cell %ld", indexPath.row]];
    if (!cell) {
        cell = [[CommentCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:[NSString stringWithFormat:@"Cell %ld", indexPath.row]];
    }
    cell.textLabel.text = [NSString stringWithFormat:@"section = %ld row = %ld",indexPath.section,indexPath.row];

    return cell;
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end

@效果图:

iOS开发之剖析"秘密"App内容页面效果(二)

时间: 2024-11-08 19:07:44

iOS开发之剖析"秘密"App内容页面效果(二)的相关文章

iOS开发之剖析&quot;秘密&quot;App内容页面效果

最近在玩"秘密",发现点击主界面的Cell进去后的页面效果不错,就写了个Demo来演示下. 它主要效果:下拉头部视图放大,上拉视图模糊而且到一定位置固定不动,其他Cell可以继续上移. @封装的主要效果类:MTHeadEffect.m(.h文件省略,很简单的) #import "MTHeadEffect.h" #import <QuartzCore/QuartzCore.h> #import <Accelerate/Accelerate.h>

iOS开发实用技巧—打包app发给测试人员测试

iOS开发实用技巧—打包app发给测试人员测试 说明:在项目开发过程中经常需要开发人员将项目打包成ipa包后,发给测试人员进行测试.本文贴图对打包的过程简单介绍. 一.Product ->archive (注意,不能是模拟器状态,如果当前调试状况是模拟器的话,则archive为灰色不可点击) 模拟器情况下: 剩余步骤: 选择 证书 生成ipa包 保存 注意:在打包的同时保存xcarchive文件,以备将来查看应用的crash日志.

ios开发 上传到App Store 时出错. iTunes Store Operation Failed, An Error occurred uploading to the iTunes store.

ios开发 上传到App Store 时出错. iTunes Store Operation Failed,    An Error occurred uploading to the iTunes store. 的解决方法,网上找了很多. 如下(当然没有解决我的问题,可以一试): 今天在提交app的时候,最后一步报错, An error occurred uploading to the iTunes Store! 后来上网查了查资料,在这里整理一下: 第一: 有可能是中文编码的问题,需要把编

iOS开发练习之UIPickerView实现歌词翻滚效果

麻雀虽小,五脏俱全.在平时的项目中,任何一个模块或者功能里其实都隐藏着许多我们平时注意不到的知识点,其实很多东西大家每天都在用,但很多时候都是知其然,而不知其所以然.时间久了,也就懒得去想到底是什么原因了,怎么实现的之类.回想自己的学习路程,也基本都这样混过来,实在愧对光阴,近日抽空,查看过往笔记,顺手写了个小代码练习,感觉温故知新.现分享代码,以供新手入门参考,尤其其中错误的部分也很有广泛性.同时也欢迎各路成精的老鸟们喷吐,能够指正,这样也促进我再进步一点. ViewController.m文

iOS开发实用技巧—项目新特性页面的处理

iOS开发实用技巧篇—项目新特性页面的处理 说明:本文主要说明在项目开发中会涉及到的最最简单的新特性界面(实用UIScrollView展示多张图片的轮播)的处理. 代码示例: 新建一个专门的处理新特性界面的控制器,可以实用代码也可以用xib,在这里实用纯代码方式,创建一个控制器NewfeatureViewController. 头文件代码: 1 // 2 // JMNewfeatureViewController.h 3 // 4 5 #import <UIKit/UIKit.h> 6 7 t

iOS开发——使用MBProgressHUD来增加用户体验(二)

我在上一篇博客<iOS开发--使用MBProgressHUD来增加用户体验>主要实现了使用别人已经封装的MBProgressHUD来进行加载提示,可以说是相当的方便.今天我们使用Github上原生的MBProgressHUD第三方库来进行加载提示,会比别人已经封装的麻烦一点点.代码已经上传至:https://github.com/chenyufeng1991/UseMBProgressHUD.实现步骤如下: (1)同样是使用网络请求号码归属地来实现.(请看注释) - (IBAction)sou

iOS开发之旅之App的生命周期

在iOS App中,入口函数并不在根目录下,而是在"Supporting Files"目录的main.m文件的main函数中.这很容易理解,C/C++都是以main为入口. int main(int argc, char * argv[]) { @autoreleasepool { return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); } } 这个函数比较简单,只是调用了UI

iOS开发之资讯类App常用分类控件的封装与实现(CollectionView+Swift3.0+)

今天博客中,我们就来实现一下一些常用资讯类App中常用的分类选择的控件的封装.本篇博客中没有使用到什么新的技术点,如果非得说用到了什么新的技术点的话,那么勉强的说,用到了一些iOS9以后UICollectionView添加的一些新的特性.本篇博客所涉及的技术点主要有UICollectionView的Cell移动,手势识别,控件封装,闭包回调,面向接口编程,Swift中的泛型等等.这些技术点在之前的博客中也多次使用到,只不过本篇博客使用这些技术点来完成我们的具体需求. 一.实例运行效果 先入为主,

iOS开发关于真机—App发布证书和调试证书配置

发布证书.真机调试证书.测试证书.推送证书详细过程 更重要的是让你彻底明白为什么要这样配置证书 一:发布证书 遵旨:哪个开发者的哪台电脑要发布哪个app (这句话可以多读几遍) 通过上边的遵旨可以得出要发布app需要哪些文件,为什么配置过程中要上传或者生成那些文件,结论如下 申请开发者账号,即花费了99刀给apple的账号,这是你可以登录developer.apple.com这个网站了 证书签名请求文件(CSR:CertificateSigningRequest) 让你的电脑具备了发布app的功