iOS: 悬浮的条件筛选框使用二

一、介绍:

在前面已经介绍了一种条件悬浮框,使用的是tableView的Plain分组样式实现的,因为这是tableView本身就具备的功能,分组悬浮效果。这次我来介绍第二种更加简单的方法,采用两个ScrollView来实现。

二、实现技术:

(1)两个ScrollView,一个是左右滚动,成为内容视图,另一个是上下滚动,作为容器视图;

(2) 创建头视图,头视图中有banner图和条件筛选框,标记banner图的高;

(3)合理设置上下滚动的容器视图的frame,它承载头视图和内容视图,不过需要禁止它的弹簧效果,实现悬浮框功能。

三、代码如下:

HeadView.h

//  HeadView.h
//  SuspensionViewDemo
//
//  Created by 夏远全 on 16/11/25.
//  Copyright ? 2016年 广州市东德网络科技有限公司. All rights reserved.
//

#import <UIKit/UIKit.h>

@interface HeadView : UIView
/**
 *  类方法创建头视图
 */
+(instancetype)createHeadView:(CGRect)frame;
@property (strong,nonatomic)UIView *animationView;          //下划线动画视图
@end

HeadView.m

//  HeadView.m
//  SuspensionViewDemo
//
//  Created by 夏远全 on 16/11/25.
//  Copyright ? 2016年 广州市东德网络科技有限公司. All rights reserved.
//

#import "HeadView.h"
#import "ViewController.h"

#define padding 10
#define Width       [[UIScreen mainScreen] bounds].size.width
#define Height      [[UIScreen mainScreen] bounds].size.height

@interface HeadView ()
@property (strong,nonatomic)UIImageView  *bannerView;       //banner图
@property (strong,nonatomic)NSMutableArray *buttonNames;    //标题按钮数组
@end

@implementation HeadView

/**
 *  懒加载
 */
-(NSMutableArray *)buttonNames{
    if (!_buttonNames) {
        _buttonNames = [NSMutableArray arrayWithObjects:@"运动",@"电玩",@"养生",@"娱乐",nil];
    }
    return _buttonNames;
}

-(UIImageView *)bannerView{
    if (!_bannerView) {

        _bannerView = [[UIImageView alloc]initWithFrame:CGRectMake(0,0,Width,160)];
        _bannerView.image = [UIImage imageNamed:@"demo"];
    }
    return _bannerView;
}

-(UIView *)animationView{

    if (!_animationView) {
        _animationView = [[UIView alloc]initWithFrame:CGRectMake(0, CGRectGetMaxY(self.bannerView.frame)+40+padding/2, Width/4, padding/2)];
        _animationView.backgroundColor = [UIColor redColor];
    }
    return _animationView;
}

//重写初始化方法
-(instancetype)initWithFrame:(CGRect)frame{
    self = [super initWithFrame:frame];
    if (self) {

        //1.创建轮播图
        [self addSubview:self.bannerView];

        //2.创建标题
        for (int i=0; i<4; i++) {

            //按钮
            UIButton *btn = [[UIButton alloc]init];
            [btn setTitle:self.buttonNames[i] forState:UIControlStateNormal];
            [btn setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
            [btn addTarget:self action:@selector(buttonClick:) forControlEvents:UIControlEventTouchUpInside];
            btn.tag = i;
            btn.backgroundColor = [UIColor whiteColor];
            btn.titleLabel.font = [UIFont systemFontOfSize:14];

            //分割线
            UILabel *line = [[UILabel alloc]init];
            line.tag = i;
            line.backgroundColor = [UIColor lightGrayColor];

            //添加
            [self addSubview:line];
            [self addSubview:btn];
        }

        //3.创建动画视图
        [self addSubview:self.animationView];
    }
    return self;
}

//类方法
+(instancetype)createHeadView:(CGRect)frame{

    HeadView *headView = [[self alloc]initWithFrame:frame];
    return headView;
}

#pragma mark - 按钮被点击
//点击按钮
-(void)buttonClick:(UIButton *)btn{

    [UIView animateWithDuration:0.2 animations:^{

        //移动动画视图的frame
        CGRect frame = self.animationView.frame;
        frame = CGRectMake(Width/4*btn.tag,frame.origin.y,frame.size.width,frame.size.height);
        self.animationView.frame = frame;

        //移动scrollView的偏移位置
        ViewController *currentVC = (ViewController*)[self viewController];
        [currentVC.contentView setContentOffset:CGPointMake(Width*btn.tag, 0) animated:NO];
    }];
}

//获取当前视图所在的控制器
- (UIViewController*)viewController {
    for (UIView* next = [self superview]; next; next = next.superview) {
        UIResponder* nextResponder = [next nextResponder];
        if ([nextResponder isKindOfClass:[UIViewController class]]) {
            return (UIViewController*)nextResponder;
        }
    }
    return nil;
}

//设置frame
-(void)layoutSubviews{
    [super layoutSubviews];

    for (UIView *mysubView in self.subviews) {
        if ([mysubView isKindOfClass:[UIButton class]]) {

            //按钮
            UIButton *button = (UIButton *)mysubView;
            CGFloat X = (Width/4) * button.tag;
            button.frame = CGRectMake(X, CGRectGetMaxY(self.bannerView.frame)+padding/2, (Width/4), 40);
        }
        if ([mysubView isKindOfClass:[UILabel class]]) {

            //分割线
            UILabel *line = (UILabel *)mysubView;
            CGFloat X = (Width/4) * line.tag - 0.5;
            line.frame = CGRectMake(X, CGRectGetMaxY(self.bannerView.frame)+1.5*padding,1,20);
        }
    }
}

@end

ContentView.h

//  ContentView.h
//  SuspensionViewDemo
//
//  Created by 夏远全 on 16/11/25.
//  Copyright ? 2016年 广州市东德网络科技有限公司. All rights reserved.
//

#import <UIKit/UIKit.h>

@interface ContentView : UIScrollView

//类方法创建
+(instancetype)shareWithFrame:(CGRect)frame;
@end

ContentView.m

//  ContentView.m
//  SuspensionViewDemo
//
//  Created by 夏远全 on 16/11/25.
//  Copyright ? 2016年 广州市东德网络科技有限公司. All rights reserved.
//

#import "ContentView.h"

#define XYQColor(r, g, b)   [UIColor colorWithRed:(r)/255.0 green:(g)/255.0 blue:(b)/255.0 alpha:1.0]
#define XYQRandomColor      XYQColor(arc4random_uniform(256), arc4random_uniform(256), arc4random_uniform(256))
#define SCREEN_W            [[UIScreen mainScreen] bounds].size.width
#define SCREEN_H            [[UIScreen mainScreen] bounds].size.height

@implementation ContentView

//初始化
-(instancetype)initWithFrame:(CGRect)frame{
    self = [super initWithFrame:frame];
    if (self) {

        //放tableView
        for (int i=0; i<4; i++) {
            UIImageView *imgViw = [[UIImageView alloc]init];
            imgViw.backgroundColor = XYQRandomColor;
            imgViw.frame = CGRectMake(SCREEN_W*i, 0, SCREEN_W, SCREEN_H-110);
            [self addSubview:imgViw];
        }
    }
    return self;
}

//类方法创建
+(instancetype)shareWithFrame:(CGRect)frame{

    ContentView *contentView = [[self alloc]initWithFrame:frame];
    contentView.contentSize = CGSizeMake(SCREEN_W*4,frame.size.height);
    contentView.pagingEnabled = YES;
    contentView.bounces = NO;
    return contentView;
}
@end

ViewController.h

//  ViewController.h
//  SuspensionViewDemo
//
//  Created by 夏远全 on 16/11/25.
//  Copyright ? 2016年 广州市东德网络科技有限公司. All rights reserved.
//

#import <UIKit/UIKit.h>
#import "ContentView.h"

@interface ViewController : UIViewController

/**
 *  内容视图
 */
@property (strong,nonatomic)ContentView *contentView;

@end

ViewController.m

//  ViewController.m
//  SuspensionViewDemo
//
//  Created by 夏远全 on 16/11/25.
//  Copyright ? 2016年 广州市东德网络科技有限公司. All rights reserved.
//

#import "ViewController.h"
#import "HeadView.h"

#define SCREEN_WIDTH  [[UIScreen mainScreen] bounds].size.width
#define SCREEN_HEIGHT [[UIScreen mainScreen] bounds].size.height

@interface ViewController ()<UIScrollViewDelegate>{

    UIScrollView *_containView; //大容器视图(存放头视图和内容视图)
}
/**
 *  头视图
 */
@property (strong,nonatomic)HeadView *headView;

@end

@implementation ViewController

/**
 *  给定头视图的高
 */
static NSInteger const headHeight = 210;

- (void)viewDidLoad {
    [super viewDidLoad];
    [self.view setBackgroundColor:[UIColor whiteColor]];

    //创建控件
    [self setupControl];
}

//创建控件
-(void)setupControl{

    //1.设置容器视图
    _containView = [[UIScrollView alloc] initWithFrame:self.view.bounds];
    _containView.tag = -1;
    _containView.delegate = self;
    _containView.bounces = NO; //禁止它的弹簧效果
    _containView.contentSize = CGSizeMake(SCREEN_WIDTH, SCREEN_HEIGHT+160);
    [self.view addSubview:_containView];

    //2.创建头视图
    _headView = [HeadView createHeadView:CGRectMake(0,0,SCREEN_WIDTH,headHeight)];
    [_containView addSubview:_headView];

    //3.创建内容视图
    _contentView = [ContentView shareWithFrame:CGRectMake(0, headHeight, SCREEN_WIDTH, SCREEN_HEIGHT-110)];
    _contentView.tag = -2;
    _contentView.delegate = self;
    [_containView addSubview:_contentView];
}

#pragma mark - <UIScrollViewDeleagte>
//设置下划动画视图的frame
-(void)scrollViewDidScroll:(UIScrollView *)scrollView{

    if (scrollView.tag == -2) { //横向的滚动内容视图
        NSInteger page = scrollView.contentOffset.x/SCREEN_WIDTH;
        [UIView animateWithDuration:0.2 animations:^{
            CGRect frame = self.headView.animationView.frame;
            frame = CGRectMake(SCREEN_WIDTH/4*page,frame.origin.y,frame.size.width,frame.size.height);
            self.headView.animationView.frame = frame;
        }];
    }
}
@end

四、演示截图:(上拉到顶就悬浮了不能在上拉,下拉可以继续),点击按钮来回切换tableView

 

时间: 2024-10-25 03:45:06

iOS: 悬浮的条件筛选框使用二的相关文章

iOS: 悬浮的条件筛选下拉框的使用

1.介绍 app中条件筛选视图是很常用的功能,一般它搭配着tableView的表头悬浮滚动使用,点击按钮时,就会弹出下拉框显示条件,选择一个条件后,下拉框自动隐藏. 2.效果图如下 从中间点击弹出,然后滚动tableView随着移动,到顶部就悬浮着,下拉时仍然跟着滚动,一直滚动初始位置就停止...   3.实现方式 首先:采用分组的tableView,不过类型必须选择为Plain,这种类型本身就带悬浮效果.如果用Group类型,就没有悬浮效果: //设置tableView风格 -(instanc

iOS开发-UI 从入门到精通(二)

iOS开发-UI 从入门到精通(二)是对 iOS开发-UI 从入门到精通(一)知识点的巩固,主要以习题练习为主,增强实战经验,为以后做开发打下坚实的基础! ※开发环境和注意事项: 1.前期iOS-UI开发我们需要手动管理内存,所以我们要把ARC关掉(Xcode关掉ARC的步骤): (1)打开Xcode选中当前工程: (2)选中Build Settings: (3)在输入框内输入count: (4)选择Objective-C Automatic Reference Counting  将其设置为 

python基础一 -------如何在列表字典集合中根据条件筛选数据

如何在列表字典集合中根据条件筛选数据 一:列表 先随机生成一个列表,过滤掉负数 1,普通for循环迭代判断 2,filter()函数判断,filter(函数,list|tuple|string) 1 filter(lambda x:x>0,data) 3,列表推倒式 4,效率对比:还是列表推导式稍高 二:字典 1,跟列表类似,推导式 先生成随机的字典(key从1-20) 过滤掉value是负数的值 三:集合 随机生成10个元素的集合 过滤掉小于0的元素,跟字典类似

织梦CMS实现多条件筛选功能

用织梦实现筛选的功能,其实主要就是运用到了织梦的高级搜索功能,然后用ajax去post替换掉本来的结果就可以了. 其实筛选的话,主要有两个问题需要解决,一个是前台的筛选实现,一个是后台根据前台的点击,反馈出相应的结果. 于是在网上搜索了N多的资料了之后,先实现前台的功能,就是你点了之后会有一个筛选的效果出来,当然,也只是一个效果.具体可以参照:jquery仿京东筛选效果.下面就一步一步用织梦来实现这样的功能. 首先我们先在后台自定义模型(自定义模型都不会的同学,可以直接去面壁思过了) 看到参照网

Jquery特效之=》仿京东多条件筛选特效

仿京东多条件筛选特效 品牌: 全部 惠普(hp) 联想(Lenovo) 联想(ThinkPad) 宏基(acer) 华硕 戴尔 三星 索尼 东芝 Gateway 微星 海尔 清华同方 富士通 苹果(Apple) 神舟 方正 优雅 价格: 全部 1000-2999 3000-3499 3500-3999 4000-4499 4500-4999 5000-5999 6000-6999 7000-9999 10000以上 尺寸: 全部 8.9英寸及以下 11英寸 12英寸 13英寸 14英寸 15英寸

《iOS应用逆向工程》学习笔记(二)iOS系统目录结构(部分)

首先下载个iFile,可以用来直观地查看iOS系统的目录结构. 下面记录一些关键的iOS目录结构: /var:"variable"的简写,存放一些经常更改的文件,例如日志.用户数据.临时文件等.其中/var/mobile/Applications下存放了所有App Store App. /Applications:存放所有的系统App和来自Cydia的App,不包括App Store App.越狱的过程把/Applications变成了一个符号链接,实际指向/var/stash/App

HBase多条件筛选查询方案

最近的项目需要使用Hbase做实时查询,由于Hbase只支持一级索引,也就是使用rowkey作为索引查询,所以对于多条件筛选查询的支持不够,在不建立二级索引的情况下,只能使用Hbase API中提供的各种filter过滤器进行筛选,感觉查询效率不太理想,于是考虑建立二级索引的方案. 经过google学习网上前辈们的经验,暂时找到两种可用的方案: 使用Hbase协处理器Coprocessor在写入数据时,创建二级索引表,并将每条数据的索引写入二级索引表中,查询时先根据筛选条件查询二级索引表,获取相

提示框第三方库之MBProgressHUD iOS toast效果 动态提示框效果

提示框第三方库之MBProgressHUD iOS toast效果 动态提示框效果 2014-08-11 17:39 11614人阅读 评论(0) 收藏 举报  分类: iOS相关(20)  文章来自:http://blog.csdn.net/ryantang03/article/details/7877120 MBProgressHUD是一个开源项目,实现了很多种样式的提示框,使用上简单.方便,并且可以对显示的内容进行自定义,功能很强大,很多项目中都有使用到.到GitHub上可以下载到项目源码

关于进行条件筛选的SQL关键字的一点理解

概述 一般能够用于条件筛选的有三种: ON: 联结(join)筛选 WHERE: 一般条件筛选 HAVING: 分组后的条件筛选 ON JOIN – ON 语句的执行顺序: 例句: SELECT * FROM A LEFT JOIN B ON A.ID = B.ID AND A<>0 WHERE A.name = 'x' 注意在作on 连接后 的and 子句 和where 子句 . 他们有什么不同? 逻辑上解释:(不考虑执行计划中执行步骤和作嵌套连接等具体方式,这里只讨论如何思考逻辑上的步骤)