iOS 仿简书 个人主页 ,个人中心 页面样式 效果

小叙:写在前面,最近没事在简书中浏览别人写的技术文章,发现简书中点击文章作者的头像,点击进去的这个页面效果感觉不错,头像的放大缩小,以及下面的类似今日头条的那种横向标签菜单。发现比较有意思,还有就是说好了,不断鞭策自己提高技术多分享有用的干货的,爆发吧小宇宙哈哈


直接进入正题

首先我们先来看看做出来的效果,这种效果在很多电商类中的APP很长见,感觉应该还是挺实用的

QQ20170829-163100.gif

头部原理分析

  • 首先是上面的原型头像的放大与缩小,这里比较简单的啦,就是根据tableView 的便宜量算一下就可以了,我们还是简单介绍一下吧
  • 首先有一个最大值与最小值,也就是说最大图像与最小图像的尺寸
    我这里用的是
    let MaxSize:CGFloat = 60 //图像最大值
    let MinSize:CGFloat = 30 //图像最小值
    let TopHeight:CGFloat = 240 //最上面的大小

大家注意没有上面还有一点细节就是那个很线 的问题,当便宜大于大与最上面的headView 的高度的时候就会隐藏 导航下面的那条线 和 动态文章更多上线的线,在这里便于控制我使用的是自定义的导航

  • 主要代码实现
    //scrollView代理方法
    func scrollViewDidScroll(_ scrollView: UIScrollView) {
        var oy = scrollView.contentOffset.y
        if oy>100 {
            oy = 100
        }else if oy < 0{
            oy = 0
        }
//        print(oy)
        /*   100  --30,30
              0   --- 60,60
              每增加1个单位应该变化的量
        */
        let oneadd:CGFloat = (60-30)/100    
        
        let currntSize = MaxSize - oneadd*oy
        
        let width:CGFloat = currntSize
        let ox = screenWidth()/2-width/2
        headImgView?.frame = CGRect.init(x: ox, y: 25, width: width, height: width)

        //处理线下面的横线
        oy = scrollView.contentOffset.y
//        print("currnt----\(oy)")
        if oy >= TopHeight {
            navLine?.frame = CGRect.init(x: 0, y: 43,width: screenWidth(), height: 0)
            self.myTwoCell?.hideUpLine()
        }else{
            navLine?.frame = CGRect.init(x: 0, y: 43,width: screenWidth(), height: 1)
            self.myTwoCell?.showUpLine()

        }
     
// 头部的问题到这里就处理完了,此处的代码我先删除方便我们浏览
    }
  • 代码中的关键点我已经通过注释的方式说明了,相信大家肯定可以理解的毕竟也是多么难的效果

菜单的实现原理

  • 这里开始还是遇到了点小问题的,是把问题想的简单了

弯路: 这里先讲一下我的弯路,
1.外层是一个tableView 分成两段
2.每一段只有一个cell ,第0段的cell 就是 (动态,文章,跟多) 上面的部分见识我们就叫它OneCell吧
3.(动态,文章,跟多)第1端的段头
4.(动态,文章,跟多)后面的那部分是第1段的cell ,我们就叫它TwoCell 吧,TwoCell上用的是一个网络框架 >(ZJScrollPageView)
结果:这种思路做了发现,(动态,文章,跟多)段头是有了吸顶的效果,然而产生了问题,不能联动的问题,内tableview侧动,外侧tableview动,手势冲突了,经过了一段时间的处理终于,解决了手势冲突的问题
处理方式是:给外层与内侧控制器添加一个Bool 字段用来控制哪个一个可以动 , 总之就是(父动子不动,父动子不动)

  • 感觉一切尽在掌握之中,哈哈哈哈
  • 问题:当运行的时候发现了一个问题,就是往上滑猛一滑的时候,到TopHeight 这个位置的时候就是停住了,必须再滑一下内层的tableView 才能动

  • 经过上线的问题后重新整理思路,在上面的基础上改造一下大体思路还是差不多
  • 终极方案 :让外层的tableView支持多种手势,最简单的办法就是
class GestureTableView: UITableView,UIGestureRecognizerDelegate {
    func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
        return true
    }
}

这样就好了
此时你在看我们的关键性代码就是我说的

父动子不动,子动父不动
  • 我们看下代码如何处理
    //scrollView代理方法
    func scrollViewDidScroll(_ scrollView: UIScrollView) {
        var oy = scrollView.contentOffset.y
        if oy>100 {
            oy = 100
        }else if oy < 0{
            oy = 0
        }
//        print(oy)
        //100  --30,30
        //0   --- 60,60
        let oneadd:CGFloat = (60-30)/100
        
        let currntSize = MaxSize - oneadd*oy
        
        let width:CGFloat = currntSize
        let ox = screenWidth()/2-width/2
        headImgView?.frame = CGRect.init(x: ox, y: 25, width: width, height: width)

        
        
        //处理线下面的横线
        oy = scrollView.contentOffset.y
//        print("currnt----\(oy)")
        if oy >= TopHeight {
            navLine?.frame = CGRect.init(x: 0, y: 43,width: screenWidth(), height: 0)
            self.myTwoCell?.hideUpLine()
        }else{
            navLine?.frame = CGRect.init(x: 0, y: 43,width: screenWidth(), height: 1)
            self.myTwoCell?.showUpLine()

        }
/*---------------------------------------------------------------------*/
        //处理手势问题
        if oy >= TopHeight {
            scrollView.contentOffset = CGPoint.init(x: 0, y: TopHeight)
           
            if self.canScroll! {
                self.canScroll = false  //自己不动
                //通知子类动
                let nc = NotificationCenter.default
                nc .post(name: NSNotification.Name.init(rawValue: "POST"), object: true)
            }
           
        }else{
            if (!self.canScroll!) {//到最顶部
                scrollView.contentOffset = CGPoint.init(x: 0, y: TopHeight)
            }
           
        }
        scrollView.showsVerticalScrollIndicator = self.canScroll! ? true:false;
    }
    

子类中的关键代码实现

 func scrollViewDidScroll(_ scrollView: UIScrollView) {

        if (!self.canScroll!) {
            scrollView.contentOffset = CGPoint.zero
        }
        let oy = scrollView.contentOffset.y
        if oy <= 0 {
            
            //主动子不动
            self.canScroll = false
            let nc = NotificationCenter.default
            nc.post(name: Notification.Name.init(rawValue: "MAINPOST"), object: true)
            scrollView.contentOffset = CGPoint.ze   
        }
        scrollView.showsVerticalScrollIndicator = self.canScroll! ? true:false;
    }
    

终于讲完了

  • 后续差不多,就这样啦,具体的实现当然也会奉献出来的,欢迎喜欢

Demo留一下一个问题,当滑到最底部的时候,触摸顶部的状态栏 不会自动滑到,第一行,这个问题还没有解决如果你有好多办法欢迎留言

  • 我在想比较low 的方法应该就是可以在状态栏上放一个透明的按钮吧,点击的时候 子、父都回到第一行

GitHub demo地址链接

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,294评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,493评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,790评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,595评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,718评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,906评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,053评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,797评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,250评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,570评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,711评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,388评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,018评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,796评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,023评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,461评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,595评论 2 350

推荐阅读更多精彩内容

  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,066评论 4 62
  • 2017.02.22 可以练习,每当这个时候,脑袋就犯困,我这脑袋真是神奇呀,一说让你做事情,你就犯困,你可不要太...
    Carden阅读 1,332评论 0 1
  • 虽然标题是失眠与梦,但我想先讲关于我的梦。 我经常会做些的梦,有个朋友说我应该把它们记录下来。有几个印象挺深的梦 ...
    你是浪潮阅读 214评论 0 0
  • 我可以一落千丈,也可以创造奇迹
    cuber阿兴阅读 172评论 0 0
  • 学习都是枯燥的,困难的,挑战自己,因为你面对的都是你不会的,但是你想要学会,所以必须付出代价,时间,过程的枯燥,独...
    我是京京阅读 241评论 0 0