zoukankan      html  css  js  c++  java
  • 搜索菜单栏侧滑效果控件SearchView

    搜索菜单栏侧滑效果控件SearchView

    本人视频教程系类   iOS中CALayer的使用

    效果1:

    效果2:

    项目中用到的图片 bgImg@2x.png:

    源码:

    SearchView.h + SearchView.m

    //
    //  SearchView.h
    //  SearchView
    //
    //  Created by YouXianMing on 14/12/25.
    //  Copyright (c) 2014年 YouXianMing. All rights reserved.
    //
    
    #import <UIKit/UIKit.h>
    
    #define SearchView_ScreenWidth    [[UIScreen mainScreen] bounds].size.width
    #define SearchView_ScreenHeight   [[UIScreen mainScreen] bounds].size.height
    
    @protocol SearchViewDelegate <NSObject>
    @optional
    - (void)searchViewTapEventString:(NSString *)string;
    @end
    
    @interface SearchView : UIView
    
    @property (nonatomic, weak)   id<SearchViewDelegate>   delegate;
    
    @property (nonatomic, assign) CGRect    startFrame;
    @property (nonatomic, assign) CGRect    endFrame;
    
    @property (nonatomic, strong) NSArray  *dataStringArray; // 数据源数组
    
    
    - (void)expendCellAnimated:(BOOL)animated;
    
    @end
    //
    //  SearchView.m
    //  SearchView
    //
    //  Created by YouXianMing on 14/12/25.
    //  Copyright (c) 2014年 YouXianMing. All rights reserved.
    //
    
    #import "SearchView.h"
    #import "SearchViewCell.h"
    
    static NSString *searchViewCell = @"searchViewCell";
    
    @interface SearchView ()<UITableViewDataSource, UITableViewDelegate>
    
    @property (nonatomic, strong) UITableView *tableView;
    @property (nonatomic, strong) NSArray     *stringArray; // 数据源
    
    @end
    
    @implementation SearchView
    
    - (instancetype)initWithFrame:(CGRect)frame
    {
        self = [super initWithFrame:frame];
        if (self) {
            // 初始化TableView
            self.tableView = [[UITableView alloc] initWithFrame:self.bounds
                                                          style:UITableViewStylePlain];
            self.tableView.delegate   = self;
            self.tableView.dataSource = self;
            self.tableView.backgroundColor = [[UIColor blackColor] colorWithAlphaComponent:0.75];
            
            self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
            [self.tableView registerClass:[SearchViewCell class]
                   forCellReuseIdentifier:searchViewCell];
            [self addSubview:self.tableView];
        }
        return self;
    }
    
    #pragma mark - 代理方法
    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
        return self.stringArray.count + 1;
    }
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
        SearchViewCell *cell = [tableView dequeueReusableCellWithIdentifier:searchViewCell];
        
        if (indexPath.row == 0) {
            cell.textLabel.text      = @"search...";
            cell.textLabel.textColor = [UIColor colorWithRed:0.780 green:0.800 blue:0.812 alpha:1];
            cell.textLabel.font      = [UIFont italicSystemFontOfSize:16.f];
            cell.selectionStyle      = UITableViewCellSelectionStyleNone;
            cell.backgroundColor     = [UIColor clearColor];
            cell.showLine            = YES;
            
            return cell;
        }
        
        // 获取文本
        cell.textLabel.text      = self.stringArray[indexPath.row - 1];
        cell.textLabel.textColor = [UIColor yellowColor];
        cell.backgroundColor     = [UIColor clearColor];
        
        return cell;
    }
    - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
        return 50.f;
    }
    
    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
        if (indexPath.row == 0) {
            if (_delegate && [_delegate respondsToSelector:@selector(searchViewTapEventString:)]) {
                [_delegate searchViewTapEventString:@"搜索"];
            }
            
        } else {
            if (_delegate && [_delegate respondsToSelector:@selector(searchViewTapEventString:)]) {
                [_delegate searchViewTapEventString:self.stringArray[indexPath.row - 1]];
            }
        }
        
        UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
        [cell setSelected:NO animated:YES];
    }
    - (void)expendCellAnimated:(BOOL)animated {
        // 如果为空,则直接返回
        if (self.dataStringArray == nil) {
            return;
        }
        
        self.stringArray = [NSArray arrayWithArray:self.dataStringArray];
        
        if (animated) {
            NSMutableArray *indexPathArray = [NSMutableArray array];
            
            for (int i = 0; i < self.stringArray.count; i++) {
                NSIndexPath *path = [NSIndexPath indexPathForRow:i+1 inSection:0];
                [indexPathArray addObject:path];
            }
            
            [self.tableView insertRowsAtIndexPaths:indexPathArray
                                  withRowAnimation:UITableViewRowAnimationTop];
        } else {
            [self.tableView reloadData];
        }
    }
    
    #pragma mark - 重写setter,getter方法
    @synthesize startFrame = _startFrame;
    - (void)setStartFrame:(CGRect)startFrame {
        _startFrame = startFrame;
        self.frame  = startFrame;
    }
    - (CGRect)startFrame {
        return _startFrame;
    }
    
    @end

    SearchViewCell.h + SearchViewCell.m

    //
    //  SearchViewCell.h
    //  SearchView
    //
    //  Created by YouXianMing on 14/12/25.
    //  Copyright (c) 2014年 YouXianMing. All rights reserved.
    //
    
    #import <UIKit/UIKit.h>
    
    @interface SearchViewCell : UITableViewCell
    
    @property (nonatomic, assign) BOOL showLine;
    
    @end
    //
    //  SearchViewCell.m
    //  SearchView
    //
    //  Created by YouXianMing on 14/12/25.
    //  Copyright (c) 2014年 YouXianMing. All rights reserved.
    //
    
    #import "SearchViewCell.h"
    
    @interface SearchViewCell ()
    
    @property (nonatomic, strong) UIView *line;
    
    @end
    
    @implementation SearchViewCell
    
    - (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
        self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
        if (self) {
            self.selectedBackgroundView    = [self createSelectedBackgroundView];
            
            // 线条view
            _line                 = [[UIView alloc] initWithFrame:CGRectMake(15, 49, 400, 1)];
            _line.backgroundColor = [UIColor redColor];
            _line.alpha           = 0;
            [self addSubview:_line];
        }
        
        return self;
    }
    
    - (UIView *)createSelectedBackgroundView {
        UIView *selectedView = [[UIView alloc] initWithFrame:CGRectMake(10, 0, 3, 50)];
        selectedView.backgroundColor = [UIColor purpleColor];
        
        return selectedView;
    }
    
    - (void)setSelected:(BOOL)selected animated:(BOOL)animated {
        [super setSelected:selected animated:animated];
    }
    
    @synthesize showLine = _showLine;
    - (void)setShowLine:(BOOL)showLine {
        _showLine   = showLine;
        if (showLine == YES) {
            _line.alpha = 1.f;
        } else {
            _line.alpha = 0.f;
        }
    }
    - (BOOL)showLine {
        return _showLine;
    }
    
    @end

    控制器源码:

    //
    //  ViewController.m
    //  SearchView
    //
    //  Created by YouXianMing on 14/12/25.
    //  Copyright (c) 2014年 YouXianMing. All rights reserved.
    //
    
    #import "ViewController.h"
    #import "SearchView.h"
    
    /**
     枚举值
     */
    typedef enum : NSUInteger {
        UIVIEW_BackgroundView = 0x19871220,
        UIVIEW_SearchView,
    } EnumViewController;
    
    @interface ViewController ()<SearchViewDelegate>
    
    @property (nonatomic, strong) SearchView  *searchView;
    
    @end
    
    #define ScreenWidth    [[UIScreen mainScreen] bounds].size.width
    #define ScreenHeight   [[UIScreen mainScreen] bounds].size.height
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        
        // 设置背景图
        self.view.layer.contents = (__bridge id)([UIImage imageNamed:@"bgImg"].CGImage);
        
        // 隐藏状态栏
        [UIApplication sharedApplication].statusBarHidden = YES;
     
        // 按钮
        UIButton *button = [[UIButton alloc] initWithFrame:self.view.bounds];
        [self.view addSubview:button];
        [button addTarget:self
                   action:@selector(buttonEvent:)
         forControlEvents:UIControlEventTouchUpInside];
    }
    
    /**
     *  代理方法
     *
     *  @param string 被点击的字符串
     */
    - (void)searchViewTapEventString:(NSString *)string {
        NSLog(@"%@", string);
    }
    
    /**
     *  创建出SearchView
     *
     *  @param duration 动画执行时间
     */
    - (void)createSearchViewWithAnimatedDuration:(CGFloat)duration {
        
        SearchView *searchView     = 
            [[SearchView alloc] initWithFrame:CGRectMake(ScreenWidth, 0, ScreenWidth, ScreenHeight)];
        searchView.alpha           = 0.f;
        searchView.delegate        = self;
        searchView.tag             = UIVIEW_SearchView;
        searchView.dataStringArray = @[@"YouXianMing", @"Soup", @"Y.X.M.", @"Play Game",
                                       @"WaKaLiMaXiDa.", @"E.T.", @"Q.L.", @"SLG"];
        [self.view addSubview:searchView];
        UIView *lineView         = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 3, ScreenHeight)];
        lineView.backgroundColor = [[UIColor redColor] colorWithAlphaComponent:0.5f];
        [searchView addSubview:lineView];
        
        [UIView animateWithDuration:duration
                              delay:0.f
             usingSpringWithDamping:1.f
              initialSpringVelocity:1.f
                            options:UIViewAnimationOptionLayoutSubviews
                         animations:^{
                             searchView.alpha = 1.f;
                             searchView.frame = CGRectMake(120, 0, ScreenWidth, ScreenHeight);
                         }
                         completion:^(BOOL finished) {
                             [searchView expendCellAnimated:YES];
                         }];
    }
    
    /**
     *  移除SearchView
     *
     *  @param duration 动画执行时间
     */
    - (void)removeSearchViewWithAnimatedDuration:(CGFloat)duration {
        UIView *searchView = [self.view viewWithTag:UIVIEW_SearchView];
        
        [UIView animateWithDuration:duration animations:^{
            searchView.frame = CGRectMake(ScreenWidth, 0, ScreenWidth, ScreenHeight);
            searchView.alpha = 0.f;
        } completion:^(BOOL finished) {
            [searchView removeFromSuperview];
        }];
    }
    
    /**
     *  创建出背景View
     *
     *  @param duration 动画执行时间
     */
    - (void)createBackgroundViewWithAnimatedDuration:(CGFloat)duration {
        UIView *backedgroundView                = [[UIView alloc] initWithFrame:self.view.bounds];
        backedgroundView.backgroundColor        = [UIColor blackColor];
        backedgroundView.tag                    = UIVIEW_BackgroundView;
        backedgroundView.alpha                  = 0.f;
        backedgroundView.userInteractionEnabled = NO;
        [self.view addSubview:backedgroundView];
        
        [UIView animateWithDuration:duration animations:^{
            backedgroundView.alpha = 0.35;
        }];
    }
    
    /**
     *  移除背景View
     *
     *  @param duration 动画执行时间
     */
    - (void)removeBackgroundViewWithAnimatedDuration:(CGFloat)duration {
        UIView *backedgroundView = [self.view viewWithTag:UIVIEW_BackgroundView];
        
        [UIView animateWithDuration:duration animations:^{
            backedgroundView.alpha = 0.f;
        } completion:^(BOOL finished) {
            [backedgroundView removeFromSuperview];
        }];
    }
    
    /**
     *  按钮点击事件
     *
     *  @param button 按钮
     */
    - (void)buttonEvent:(UIButton *)button {
        if (button.selected == NO) {
            button.selected = YES;
            [self createBackgroundViewWithAnimatedDuration:0.45];
            [self createSearchViewWithAnimatedDuration:0.45];
        } else {
            button.selected = NO;
            [self removeBackgroundViewWithAnimatedDuration:0.45];
            [self removeSearchViewWithAnimatedDuration:0.45];
        }
    }
    
    @end

    以下是需要注意的一些小地方:

  • 相关阅读:
    《命运赋》
    CSS3中的 transform (变形)+Transition(转换) = animation(动画)
    c#进阶之泛型
    正则表达式运用
    查询某时间段的统计数据
    很好用的request转换为实体方法还有判断实体所有参数不能为空的方法
    http 协议集合,超级简单
    今天无意发现jquery的一个以前的误导
    IFRAM随内部长宽高变化
    就最近学习MVC4.0的页面用法学到的东西
  • 原文地址:https://www.cnblogs.com/YouXianMing/p/4185406.html
Copyright © 2011-2022 走看看