效果图如下:

 
1.h文件声明方法:
 
@interface IDSGameRoomSearchPage : UIView

@property (nonatomic,weak) BaseViewController *parentController;

- (instancetype)initWithParentControler:(BaseViewController *)controller;

- (void)prepareView;

@end

 
.
初始化方法
- (instancetype)initWithParentControler:(BaseViewController *)controller
{
    if (self = [superinit]) {
        _parentController = controller;
    }
    returnself;
}
.
 
声明collectionView
 
- (void)prepareView {
    self.frame = CGRectMake(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT);
    self.backgroundColor = NF_Color_C20;
    _page = 1;
    _gameRoomDataArray = [NSMutableArrayarray];
    _sessionArray = [NSMutableArrayarray];
    UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayoutalloc] init];
   
    layout.scrollDirection = UICollectionViewScrollDirectionVertical;
    layout.sectionInset = UIEdgeInsetsMake(10, 9, 15, 9);
    layout.minimumInteritemSpacing = 9;
    layout.minimumLineSpacing = 9;
   
   
    self.gameRoomCollectionView = [[UICollectionViewalloc]initWithFrame:CGRectMake(0, 44+20, SCREEN_WIDTH, SCREEN_HEIGHT-44-20) collectionViewLayout:layout];
    self.gameRoomCollectionView.delegate = self;
    self.gameRoomCollectionView.dataSource = self;
    self.gameRoomCollectionView.backgroundColor = NF_Color_C16;
    [self.gameRoomCollectionViewregisterClass:[IDSGameRoomHomePageChangeCellclass] forCellWithReuseIdentifier:@"THEcellid"];
    self.gameRoomCollectionView.showsVerticalScrollIndicator = NO;
    self.gameRoomCollectionView.showsHorizontalScrollIndicator = NO;
   
    MJRefreshFooter *footer = [IDSRefreshfooterWithRefreshingTarget:selfrefreshingAction:@selector(footerVoid)];
    _gameRoomCollectionView.mj_footer = footer;
    self.gameRoomCollectionView.mj_footer.hidden = YES;
   
    [selfaddSubview:_gameRoomCollectionView];
    [selfaddSearchBar];
    [_parentController.viewaddSubview:self];

}

.
 
搜索栏初始化方法:
 
-(void)addSearchBar{
    if (!self.searchBar) {
   
        self.searchBarBoundsY = 20;
        self.searchBar = [[UISearchBaralloc]initWithFrame:CGRectMake(0,self.searchBarBoundsY, [UIScreenmainScreen].bounds.size.width, 44)];
        self.searchBar.searchBarStyle      = UISearchBarStyleMinimal;
        self.searchBar.tintColor            = NF_Color_C27;
        self.searchBar.barTintColor        = NF_Color_C1;
        self.searchBar.delegate            = self;
        self.searchBar.placeholder          = @"搜索房号/房间名";
        [self.searchBarsetAutocorrectionType:UITextAutocorrectionTypeNo];
        [self.searchBarsetAutocapitalizationType:UITextAutocapitalizationTypeNone];
        [[UITextFieldappearanceWhenContainedIn:[UISearchBarclass], nil] setTextColor:[UIColorblackColor]];
       
    }
   
    if (![self.searchBarisDescendantOfView:self]) {
        [selfaddSubview:self.searchBar];
    }
   
    [self.searchBarsetShowsCancelButton:YESanimated:NO];
    [self.searchBarbecomeFirstResponder];
    if (![_queryNoticeTimerisValid]) {
        [selfstartQueryTimer];
    }
}
 
.
隐藏键盘增加取消键方法:
 
- (void)hiddenKeyBoard
{
    [self.searchBarsetShowsCancelButton:YESanimated:NO];
    [self.searchBarresignFirstResponder]; //searchBar失去焦点
    UIButton *cancelBtn = [self.searchBarvalueForKey:@"cancelButton"]; //首先取出cancelBtn
    cancelBtn.enabled = YES; //把enabled设置为yes
}
.
 
滑动时,隐藏键盘:
 
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    [selfhiddenKeyBoard];
}
.
 
移除View 方法:
 
- (void)removeAllSubviews
{
   
    for (UIView *oneView inself.subviews) {
        [oneView removeFromSuperview];
    }
}

- (void)removeView
{
   
    [selfremoveAllSubviews];
    [selfremoveFromSuperview];
}

.
 
搜索代理:
 
- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText{
    [selfstopQueryTimer];
   
    if (searchText.length>0) {
       
        self.searchBarActive = YES;
        _searchWord = searchText;
        [selfstartQueryTimer];
        [self.gameRoomCollectionViewreloadData];
    }else{
        self.searchBarActive = NO;
        [selfremoveEmptyView];
        [self.gameRoomDataArrayremoveAllObjects];
        [self.gameRoomCollectionViewreloadData];
    }
}

- (void)searchBarCancelButtonClicked:(UISearchBar *)searchBar{
    [selfcancelSearching];
}
- (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar{
    [selfhiddenKeyBoard];
   
}
- (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar{

    [self.searchBarsetShowsCancelButton:YESanimated:YES];
}
- (void)searchBarTextDidEndEditing:(UISearchBar *)searchBar{
   
    [selfhiddenKeyBoard];
    [selfdataRequest];
}
-(void)cancelSearching{

    [selfremoveView];
}

.
 
CollectionView 代理就省略啦
 
需要的代理:
<UICollectionViewDelegate,UICollectionViewDataSource,UISearchBarDelegate>
 
释放内存:
 
- (void)dealloc
{
    IDSLOG(@"IDSGameRoomSearchPage Dealloc.");
    [selfreleaseSelf];
}

- (void)releaseSelf
{
    self.gameRoomCollectionView.delegate = nil;
    self.gameRoomCollectionView.dataSource = nil;
    _gameRoomCollectionView = nil;
    self.searchBar = nil;
    [selfstopQueryTimer];
}

.
 
增加计时器方法:
 
Ps : 加入定时器是由于搜索会即时搜索,为了防止实时调用请求,给用户0.5s 时间不操作再请求网络,以防止用户输入 abc ,请求了3次网络,依次是搜索 a , ab, abc ,给用户0.5秒延时输入单词。
 
staticCGFloat sIntervalTime = 0.5f; //定时刷新时间间隔
- (void)startQueryTimer
{
    [selfstopQueryTimer];
   
    if (nil == _queryNoticeTimer) {
        _queryNoticeTimer = [NSTimerscheduledTimerWithTimeInterval:sIntervalTime
                                                             target:self
                                                           selector:@selector(dataRequest)
                                                           userInfo:nilrepeats:NO];
    }
}

- (void)stopQueryTimer
{
    if (self.queryNoticeTimer) {
       
        [self.queryNoticeTimerinvalidate];
        _queryNoticeTimer = nil;
    }
}

 
关于搜索文字,关键字变成红色是引用富文本方式实现,方法如下:
 
_searchWord 为搜索关键字,要传全局变量进入方法当中
 
 
- (void)setLineSpacing:(CGFloat)spacing label:(UILabel *)label
{
    if (!label.text.length) {
        return;
    }
    NSMutableAttributedString *attributedString = [[NSMutableAttributedStringalloc] initWithString:label.text];
    NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStylealloc] init];
    [paragraphStyle setLineSpacing:spacing];
    [attributedString addAttribute:NSParagraphStyleAttributeNamevalue:paragraphStyle range:NSMakeRange(0, [label.textlength])];
    if (_searchWord) {
        NSRange redRange = [[ [attributedString string] lowercaseString] rangeOfString:[_searchWordlowercaseString]];
        if (redRange.length <= [label.textlength]) {
            [attributedString setAttributes:@{NSForegroundColorAttributeName:NF_Color_C19,NSFontAttributeName:[UIFontsystemFontOfSize:Near_Final_Font_T9]}range:redRange];
        }
    }
   
   
    [label setAttributedText:attributedString];
    label.lineBreakMode = NSLineBreakByCharWrapping;
    [label sizeToFit];
}
 
明天说一下 collectionView cell 的实现方式
 
 

 

搜索栏+collectionView实现的更多相关文章

  1. 用collectionview实现瀑布流-转(后面附demo,供参考)

    算法总体思路 先说一下总体上的思路.既然图片的大小.位置各不一样,我们很自然地会想到需要算出每个item的frame,然后把这些frame赋值给当前item的UICollectionViewLayou ...

  2. CollectionView水平和竖直瀑布流的实现

    最近在项目中需要实现一个水平的瀑布流(即每个Cell的高度是固定的,但是长度是不固定的),因为需要重写系统 UICollectionViewLayout中的一些方法通过计算去实现手动布局,所以本着代码 ...

  3. tableViewCell嵌套collectionView,动态高度

    方法有很多,有通过内容高度,经过代理回调,刷新的,甚至还有计算cell个数,然后根据cell大小计算的,这里推荐iOS 8新特性,通过AutoLayout,利用内容将cell撑起来; 关键代码: vi ...

  4. iOS开发之窥探UICollectionViewController(二) --详解CollectionView各种回调

    UICollectionView的布局是可以自己定义的,在这篇博客中先在上篇博客的基础上进行扩充,我们先使用UICollectionViewFlowLayout,然后好好的介绍一下UICollecti ...

  5. WPF CollectionViewSource CollectionView

    CollectionView 通俗讲就是可以对你绑定的集合可以进行 分组,排序 等功能 CollectionViewSource  根据字面意思是xxx的数据源 详细的介绍还是看 http://www ...

  6. ios中自定义tableView,CollectionView的cell什么时候用nib加载,什么时候用标识重用

    做了一段时间的iOS,在菜鸟的路上还有很长的路要走,把遇到的问题记下来,好记性不如烂笔头. 在项目开发中大家经常会用到tableView和collectionView两个控件,然而在cell的自定义上 ...

  7. collectionview cell吸顶效果

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px "Hiragino Sans GB"; color: #cf8724 } ...

  8. collectionview使用

    创建UICollectionViewFlowLayout 对象来设置相关的布局,包括itemSize,headerReferenceSize,sectionInset.设置对应的布局大小,相关的和顶部 ...

  9. collectionView

    // /* UICollectionView 类是iOS6 新引进的API,用于展示集合视图, 布局更加灵活,可实现多列布局,用法类似于UITableView类. - 更新视图: [collectio ...

随机推荐

  1. ASP.Net请求小周期

    另一篇另篇2 ASP.NET请求处理全过程 一个ASP.NET请求过程中,从浏览器中发出一个Web请求 到 这个请求被响应并显示在浏览器中的过程中究竟会发生哪些不同的事件,当我们进入这个事件之旅时,我 ...

  2. ajax的跨域请求问题:减少options请求

    服务器端在Response Headers里添加字段Access-Control-Max-Age: 86400 , "Access-Control-Max-Age"表明在86400 ...

  3. Linux Sed技巧

    删除行首空格 sed 's/^[ ]*//g' filename sed 's/^*//g' filename sed 's/^[[:space:]]*//g' filename 匹配行前或后添加空白 ...

  4. 还在使用vc6.0吗??vs2010吧

    每个人在面对新的事物的时候,总是充满了排斥感,当vista和win7来临的时候,我们还在留恋xp,说xp是如何的好,win7是如何的不给力,当然,我们必须承认,xp是一款优秀的操作系统,这个我们无法否 ...

  5. OpenGL(五) 三维变换之模型视图矩阵

    计算机三维图形学中,一个基本的任务是如何描述三维空间中一个物体位置的变化,也就是如何 描述物体的运动.通常情况下,物体位置的变化包含三个基本的变化:平移.旋转和缩放,物体的运动也可以用这三个基本的运动 ...

  6. Android 百度地图 SDK v3.0.0 (四) 离线地图功能介绍

    转载请注明出处:http://blog.csdn.net/lmj623565791/article/details/37758097 一直认为地图应用支持离线地图非常重要啊.我等移动2G屌丝,流量不易 ...

  7. dotnet pack 打包文件版本号引起 "Could not load file or assembly" 问题

    如果不是遇到,真的不会想到,代码世界的问题真是千奇百怪,这次遇到的是 dotnet pack 打包文件版本号引起的问题. 之前进行 nuget 打包都是在 Visual Studio build 时进 ...

  8. vs2015 cordova环境安装【个人遇到的几个问题】

    原文:vs2015 cordova环境安装[个人遇到的几个问题] 问题1: vs2015,设置  Debug  Android 设备[真机调试] Exception in thread "m ...

  9. Winform入门见解

    winform算是C#比较快速的入门的一个了,简单的控件拖拽然后写上每个控件对应的事件.然后就可以了.需要美观的点 可以用Skin皮肤就完成了.我们先不说复杂的,就来个普通的三层架构来增删改查 分页和 ...

  10. 不要困在自己建造的盒子里——写给.NET程序员(附精彩评论)

    此文章的主旨是希望过于专注.NET程序员在做好工作.写好.NET程序的同时,能分拨出一点时间接触一下.NET之外的东西(例如10%-20%的时间),而不是鼓动大家什么都去学最后什么都学不精,更不是说. ...