效果图如下:

 
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. Visual Studio 2017 and Apache Cordova mobile apps | Andrés Zsögön

    原文:Visual Studio 2017 and Apache Cordova mobile apps | Andrés Zsögön 以下是使用Microsoft Visual Studio 20 ...

  2. 比较好的Redux和React-Redux学习资料

    1.Redux 莞式教程.本教程深入浅出,配套入门.进阶源码解读以及文档注释丰满的 Demo 等一条龙服务https://github.com/kenberkeley/redux-simple-tut ...

  3. idhttp post 出现exception class EIdSocketError with message 'Socket Error # 10054的解决办法(捕捉异常,防止程序挂掉)

    由于项目需要.需要向一个地址提交数据.提交的次数很频繁,但是程序经常raised exception class EIdSocketError with message 'Socket Error # ...

  4. altium designer电气符号和包的常用元素

    1. 标准电阻:RES1.RES2.包裹:AXIAL-0.3至AXIAL-1.0 两port可变电阻器:RES3.RES4.包裹:AXIAL-0.3至AXIAL-1.0 三port可变电阻:RESIS ...

  5. WPF的页面导航

    工作中之前接触过的WPF程序一直是使用TabControl作不同页面间的切换,每个Tab负责独立的功能,清晰简捷,所以一直就没有动力研究WPF自带的页面导航.(虽然接触过使用页面导航的WPF项目,也并 ...

  6. Cannot refer to a non-final variable inside an inner class defined in a different method

    http://stackoverflow.com/questions/1299837/cannot-refer-to-a-non-final-variable-inside-an-inner-clas ...

  7. 5 wcf双工

    1 创建两个项目 Wcf_WsDual_Service   Wcf_WsDual_Client 2 Wcf_WsDual_Service   项目中创建 LoginService.cs 的wcf文件 ...

  8. vcl控件经常使用属性和方法

    TTabControl属性 DisplayRect:仅仅定该控件客户区的一个矩形 HotTrack:设置当鼠标经过页标签时,它的字是否有变化.假设为True,是字会变成蓝色Images:为每一个页标签 ...

  9. Oracle实践--PL/SQL综合之分页存储过程

    Oracle PL/SQL分页的存储过程 Oracle,分页,存储过程三个词结合起来,来个综合点的小练习,运用之前的PL/SQL创建一个分页的存储过程,仅仅须要简单几步就可以. 1.声明一个引用游标 ...

  10. c#扩展方法简单

    扩展方法 怎样知道的. 这还得从项目的本身说起.该项目是一套的微软底层架构上搭建起来的. 全部的框架以及控件的封装,数据的传递方法都是总体的框架封装好的. 对经常使用的dropwodnlist控件的数 ...