效果图如下:

 
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. Android app 第三方微信支付接入详解

    微信支付做了好几遍了,都没有出现什么棘手的问题,下面一一为大家分享一下,欢迎吐槽. 还是老样子,接入微信的支付要第一步添加微信支付官方的包libammsdk.jar 首先就处理略坑的一个问题,app应 ...

  2. sublime 内容高级搜索

    在发展中经常需要搜索内表面的文件.更好地想找到$video->getTitle() 在该文件中使用的表面.好了,这个时候就需要使用高级搜索功能,的操作,如以下: ctrl+shif+f纽带 例如 ...

  3. 【39.77%】【codeforces 724B】Batch Sort

    time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...

  4. javascript 获取上一周的时间

    <script type="text/javascript" language="javascript"> //获取系统时间 var LSTR_nd ...

  5. JavaScript动态广告弹出框

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  6. win7 64位系统下进入debug

    win7 64位无法直接通过命名行输入debug命令的方式进入到debug,好在我们可是使用一个工具DOSbox来进入debug.操作步骤如下:1.下载DOSbox进行安装.下载地址:点击打开链接.如 ...

  7. arcserver开发小结(一)

    一.关于属性查询 由于要做属性查询,又重新玩起了arcmap中的select by attribute,有很多自己当初玩弄arcmap多年还不是很清楚的东西 1,字段名 (1)file geodata ...

  8. 此C语言功能---A

    功能名称: abort 动力 能够: 异常终止的过程的 使用 法国: void abort(void); 程序示例: #include <stdio.h> #include <std ...

  9. VC6下深入理解new[]和delete[](在多线程下new和delete的时候,必须选择上多线程库,不然可能造成进程崩溃)

    多少年了,一直处于C与C++混用的状态,申请空间一直用malloc,释放空间一直用free,为什么?因为他们好理解易操作,就如同输出一直用printf而不用<<,输入一直用scanf而不用 ...

  10. 机器学习: DeepDreaming with TensorFlow (一)

    在TensorFlow 的官网上,有一个很有趣的教程,就是用 TensorFlow 以及训练好的深度卷积神经(GoogleNet)网络去生成一些有趣的pattern,通过这些pattern,可以更加深 ...