新浪微博个人详情页

本文介绍了如何在tableView中结合偏移量和内边距来实现新浪微博个人详情页的效果。主要内容包括显示主页、微博、相册选项的组头视图,背景头像及头像视图的设置,以及图片拉伸的实现,通过AspectFill填充模式和子视图剪切。此外,还提到了导航条背景图片的设置,利用了image分类。代码中包含了详细的注释说明。

知识点:

tableView中结合偏移量,内边距计算等逻辑实现,关于偏移量的详细求法,可以看我上一篇文章《scrollView的几个重要属性》
稍微注意的是:
- 1.显示主页 微博 相册的选项栏,是组头视图
- 2.显示背景头像及头像的view是头部视图
- 3.向下拖动,图片拉伸的细节:在SB中设置图片填充模式(Mode):AspectFill. 并且设置超出父视图的子控件剪切掉
- 设置
- 设置导航条背景图片时,使用了一个image分类
其它实现说明,都在代码注释中

效果图

显示效果

#import "PersonViewController.h"

#define kHeadViewH 200

#define kHeadViewMinH 64

#define kTabBarViewH 44

#import "UIImage+Image.h"

@interface PersonViewController ()<UITableViewDelegate,UITableViewDataSource>
@property (weak, nonatomic) IBOutlet UITableView *tableView;
//头部视图与父视图顶部的距离约束
@property (weak, nonatomic) IBOutlet NSLayoutConstraint *headViewYCons;
//头部视图的高度
@property (weak, nonatomic) IBOutlet NSLayoutConstraint *headViewHCons;
//用户头像
@property (weak, nonatomic) IBOutlet UIImageView *userIcon;

/**
 *  记录下最开始的y轴偏移量
 */
@property (nonatomic, assign) CGFloat oriOffsetY;

@property (nonatomic, weak) UILabel *titleLabel;

@end

@implementation PersonViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.

    // 记录下最开始的y轴偏移量-264
    _oriOffsetY = -(kHeadViewH + kTabBarViewH);

    // 设置内边距
    self.tableView.contentInset = UIEdgeInsetsMake(kHeadViewH + kTabBarViewH, 0, 0, 0);

    // 不需要自动调节额外的滚动区域
    self.automaticallyAdjustsScrollViewInsets = NO;

    //设置圆角头像
    self.userIcon.layer.cornerRadius = self.userIcon.bounds.size.height * 0.5;
    self.userIcon.layer.borderWidth = 2;
    self.userIcon.layer.borderColor = [UIColor whiteColor].CGColor;
    self.userIcon.layer.masksToBounds = YES;
    // 设置导航条内容
    [self setUpNav];


}

#pragma mark - scrollView代理方法
// 监听用户的滚动
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{

    // 获取当前最新偏移量
    CGFloat offsetY = scrollView.contentOffset.y;

    // 计算下最新偏移量和最初偏移量的差值
    // 就是用户滚动的区域
    CGFloat delta = offsetY - _oriOffsetY;

    // 移动头部视图
//    _headViewYCons.constant = 0 - delta;
    // 修改头部视图的高度
    CGFloat headH = kHeadViewH - delta;
    if (headH < kHeadViewMinH) {
        headH = kHeadViewMinH;
    }
    _headViewHCons.constant = headH;


    // 处理导航条
    // 计算当前的透明度
    CGFloat alpha = delta / (kHeadViewH - kHeadViewMinH);

    if (alpha > 1) {
        alpha = 0.99;
    }

    // 设置标题的文字颜色
    _titleLabel.textColor = [UIColor colorWithWhite:0 alpha:alpha];

    // 获取导航条的颜色
    UIColor *navColor = [UIColor colorWithWhite:1 alpha:alpha];

    // 设置导航条背景图片 使用一个根据颜色生成image的分类
    [self.navigationController.navigationBar setBackgroundImage:[UIImage imageWithColor:navColor] forBarMetrics:UIBarMetricsDefault];
}

#pragma mark - tableView数据源
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return 20;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{

    static NSString *ID = @"cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];

    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:ID];
    }

    cell.backgroundColor = [UIColor colorWithRed:arc4random_uniform(254)/255.0 green:arc4random_uniform(254)/255.0 blue:arc4random_uniform(254)/255.0 alpha:1.0];

    return cell;

}

#pragma mark - 设置导航条内容
- (void)setUpNav
{

    // 在iOS7之后,默认会给导航控制器里所有UIScrollView顶部都会添加额外的滚动区域64
    // 设置不需要添加额外滚动区域
    self.automaticallyAdjustsScrollViewInsets = NO;

    // 设置导航条透明
    // UIBarMetricsDefault:必须传入这个家伙
    // 传入一个空的UIImage
    [self.navigationController.navigationBar setBackgroundImage:[[UIImage alloc] init] forBarMetrics:UIBarMetricsDefault];

    // 设置导航条阴影背景
    [self.navigationController.navigationBar setShadowImage:[[UIImage alloc] init]];

    // 设置导航条标题
    // 设置UILable
    UILabel *titleLabel = [[UILabel alloc] init];

    titleLabel.text = @"Lee枭枭";

    titleLabel.textColor = [UIColor colorWithWhite:0 alpha:0];

    // 设置尺寸,尺寸最好根文字一样大
    // 自适应
    [titleLabel sizeToFit];

    _titleLabel = titleLabel;

    [self.navigationItem setTitleView:titleLabel];
}

@end
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值