文档章节

iOS xib 的使用 scrollView,cell 的自适应

GLAlanTong
 GLAlanTong
发布于 2017/01/14 16:02
字数 1005
阅读 41
收藏 0

iOS xib 的使用   scrollView,cell 的自适应

最近想写点儿什么,一下子没想起来,就简答的说一下 xib 的使用以及注意事项吧

1 scrollView 在 xib 中的实际应用

  1. 创建一个控制器,同时创建 xib 
  2.  打开 xib ,将控件 scrollView 拖进 view, 然后添加上下左右约束,全部设为0,最后快捷键更新约束 "command + shift + ="

1.3 重点来了,重新拖一个 view 添加到 scrollView 上面,同样设置约束上下左右为0,这个时候先别着急更新约束,并且会爆红,先别着急,因为还有两步,设置横向居中还是垂直居中?这个就决定了你的滑动方向是横向还是纵向,选择其中一个就可以了(Horizontally in Container  / Verically in Container) ;

然后设置一下 view 的高度或者宽度(如果是纵向滑动的话就是高度,如果是横向的话就是宽度),这个自行设定,

然就好,我这里设置高度,然后就可以更新约束,紧接着找到刚刚设定的高度的约束,然后将其约束拖成属性

接着,在控制器里面执行方法

- (void)updateViewConstraints {

    [super updateViewConstraints];
// 设置滑动的范围
    self.bottomViewHeightConstant.constant = 1000.f;

}

其实,到这一步, scrollView 已经可以滑动了,现在在 bottomView 上面放两个 view, 然后运行一下就可以看到效果了!

 

2. xib 自定义 cell ,自适应cell高度

  1. 创建自定义的cell 同时选中 xib, 这个就不再说了 
  2. 拖动cell 的高度到合适的大小即可,够我们放其他子控件即可 (这个时候我们这里就是简单的放两个控件,一个是 imageView 和一个 label)
  3. 首先拖入 imageView ,添加约束,上左右以及高;接着拖入 label, 添加约束,上下左右皆为0即可
  4.  这个时候其实已经创建好了, so, 我们去自定义 tableView 吧!然后实现 tableView 的代理方法,设置 row 的高度
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{

    self.rowHeight = UITableViewAutomaticDimension;   // 一定设置这个,这个只对 xib 或者 Sb 有效

    self.estimatedRowHeight = 160;  // 估计高

    return self.rowHeight;

}

 

3 用 xib 自定义 collection 的 headerSection ,在做一些商城的时候,这个一定会接触,一定会用到,淘宝的首页大家可以看一下,可以代码写,但是xib 去做也是可以的,下面会有几个注意事项:

  1. 我们看 collectionView 的代理方法的话就很清楚的看到,自定义 headerSction ,并不是直接继承UIView, 而是继承UICollectionReusableView 
  2. 创建一个基类  BaseCollectionReusableView , 不创建 xib,在.h文件中声明下述方法:
+(NSString*)cellIdentifier;

+(id)collectionReusableViewForCollectionView:(UICollectionView*)collectionView

                                     fromNib:(UINib*)nib

                                forIndexPath:(NSIndexPath*)indexPath

                                    withKind:(NSString*)kind;



+(id)collectionReusableViewForCollectionView:(UICollectionView*)collectionView

                                forIndexPath:(NSIndexPath*)indexPath withKind:(NSString*)kind;



+(UINib*)nib;

 

    3. m 中实现

+(id)collectionReusableViewForCollectionView:(UICollectionView*)collectionView
                                     fromNib:(UINib*)nib
                                forIndexPath:(NSIndexPath*)indexPath
                                    withKind:(NSString*)kind{
    
    NSString *cellIdentifier = [self cellIdentifier];
    [collectionView registerClass:[self class] forSupplementaryViewOfKind:kind withReuseIdentifier:cellIdentifier];
    [collectionView registerNib:nib forSupplementaryViewOfKind:kind withReuseIdentifier:cellIdentifier];
    HQCollectionReusableView *cell = [collectionView dequeueReusableSupplementaryViewOfKind:kind withReuseIdentifier:cellIdentifier forIndexPath:indexPath];
    return cell;
}

-(void)applyLayoutAttributes:(UICollectionViewLayoutAttributes *)layoutAttributes{
    [super applyLayoutAttributes:layoutAttributes];
    
    //
}

+(id)collectionReusableViewForCollectionView:(UICollectionView*)collectionView
                                forIndexPath:(NSIndexPath*)indexPath withKind:(NSString*)kind{
    return [[self class] collectionReusableViewForCollectionView:collectionView
                                                         fromNib:[self nib]
                                                    forIndexPath:indexPath
                                                        withKind:kind];
}

+ (NSString *)nibName {
    return [self cellIdentifier];
}

+ (NSString *)cellIdentifier {
    [NSException raise:NSInternalInconsistencyException format:@"WARNING: YOU MUST OVERRIDE THIS GETTER IN YOUR CUSTOM CELL .M FILE"];
    static NSString* _cellIdentifier = nil;
    _cellIdentifier = NSStringFromClass([self class]);
    return _cellIdentifier;
}

+(UINib*)nib{
    NSBundle * classBundle = [NSBundle bundleForClass:[self class]];
    UINib * nib = [UINib nibWithNibName:[self nibName]
                                 bundle:classBundle];
    return nib;
}

    4.  创建一对继承于BaseCollectionReusableView的子类TestCollectionReusableView,同时创建一个 view 的 xib ,设置 class 为 TestCollectionReusableView 

    5. 在该 xib 上面自己创建需要的视图(以及布局)

    6. 在.m 中必须实现方法

// MUST OVERRIDE THIS IN .M FILE
+ (NSString *)cellIdentifier {
    static NSString* _cellIdentifier = @"TestCollectionReusableView";
    _cellIdentifier = NSStringFromClass([self class]);
    return _cellIdentifier;
}

    7.在 collectionView 的代理方法中实现即可,注意重用 headerSectionView (有关的 demo 之后会附上,tableview 的 headerSection 其实差不多)

static NSString *kHeaderIdentify   =    @"TestCollectionReusableView"; 

[self.collectioView registerNib:[UINib nibWithNibName:kHeaderIdentify bundle:[NSBundle mainBundle]] forSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:kHeaderIdentify];

//这个方法是返回 Header的大小 size

-(CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout referenceSizeForHeaderInSection:(NSInteger)section {

}

- (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath {

    if (kind == UICollectionElementKindSectionHeader) {

        TestCollectionReusableView *headerView = [collectionView dequeueReusableSupplementaryViewOfKind:kind withReuseIdentifier:kHeaderIdentify forIndexPath:indexPath];

        return headerView;

    }

    else {

        return nil;

    }

}

 

 

 

© 著作权归作者所有

GLAlanTong
粉丝 3
博文 21
码字总数 15640
作品 0
广州
程序员
私信 提问
# ios AutoLayout 技术实践

前言 很久没用autolayout,一直用的masonry,再用autolayout,很生疏,写一篇文章,作为手记。 码字较多,确实令人不想看,希望看到的小伙伴认真读一下. Demo masonry 个人比较喜欢标哥关于m...

DaZenD
2018/11/17
0
0
你还在用宏定义“iphoneX”判断安全区域(safe area)吗,教你正确使用Safe Area

你还在用宏定义“iphone X”判断安全区域(safe area)吗,教你正确使用Safe Area。 iOS 7 之后苹果给 UIViewController 引入了 topLayoutGuide 和 bottomLayoutGuide 两个属性来描述不希望被透...

handclaper
2018/11/09
0
0
旧工程适配iOS 6和iPhone 5的一些故事

2012-09-29 By dapps  旧工程适配iOS 6和iPhone 5的一些故事抢沙发 分类:iPhone开发 标签:iOS 6、iPhone 5、Retina、适配iOS 6、适配iPhone 5 国内最专业的APP开发者社区,dApps! 苹果每...

Orange1
2012/10/30
0
0
有了Auto Layout,为什么你还是害怕写UITabelView的自适应布局?

Apple 算是最重视应用开发体验的公司了.从Xib到StoryBoard,从Auto Layout到Size Class,每一次的更新,都会给iOS应用的开发带来不小的便利.但是,对于绝对多数iOS攻城狮来说,我们依然还是很害怕...

ios122
2015/09/23
0
0
10个加速Table Views开发的Tips

本文由CocoaChina译者yake099(博客)翻译,作者:David McGraw 原文:10 Actionable Performance Tips To Speed Up Your Table View 在我们开始之前,我准备从今年开始多听取一个意见。请花...

TomatosX
2015/07/30
0
0

没有更多内容

加载失败,请刷新页面

加载更多

如何使用 rsync 备份 Linux 系统的一些介绍

备份一直是 Linux 世界的热门话题。回到 2017,David Both 为 Opensource.com 的读者在使用 rsync 备份 Linux 系统方面提了一些建议,在这年的更早时候,他发起了一项问卷调查询问大家,在 ...

Linux就该这么学
30分钟前
2
0
以太坊私有链搭建

https://blog.csdn.net/Blockchain_lemon/article/details/80589123

Moks角木
今天
3
0
自律给我自信-为什么要自律

为什么要自律 混一天和努力一天 看不到任何差别 3天看不到任何变化 7天也看不到任何效果 但是 1个月后, 会看到话题不同 3个月后, 会看到气场不同 6个月后, 会看到距离不同 3年后, 会看到...

周大壮
今天
4
0
读书replay计划说明

突然脑袋一闪,我有了这样一个主意:通过写博客的方式,将我阅读的书中的内容replay出来。 我一般会找着我感兴趣的书去读,一般也会读书中我感兴趣的章节,或者当下对我有用的章节,所以这个...

wanxiangming
今天
1
0
CentOS7安装xrdp环境可实现远程桌面访问

CentOS7安装xrdp环境可实现远程桌面访问 2018-07-14 06:39:28 分类:运维 阅读(2051) 评论(0) 在"Ubuntu系统安装xrdp桌面客户端及实现远程连接桌面"文章中有分享过在Ubuntu系统中安装XRDP环境...

linjin200
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部