Skip to content

SungKai/ZhiHuDaily

Repository files navigation

知乎日报

1 简要介绍

1.1 基本信息

  • 制作者:宋嘉明
  • 制作内容:知乎日报仿写
  • 使用语言:Objective-C

1.2 程序架构与使用的第三方框架

  • 使用MVC设计模式
  • 主要使用AFNetworking第三方框架来进行网络请求
  • 主要使用Masonry第三方框架来设置控件位置和实现屏幕适配

1.3 功能与使用步骤

  • 可展示自动播放的banner,pageControl可以随着图片的滑动更改当前颜色

    banner

  • 可无限上滑加载过往新闻

    down

  • 在同一个section请求完成,来不及加载的cell有无数据状态

    cellDefult

  • 点击banner或者cell可以实现新闻详情界面跳转,返回主界面后会标题会变灰

    cellClick

  • 点击在新闻详情页的底部的点赞和收藏按钮可出现数字变化和提示框(会自动消失)

    likeBtn

  • 屏幕适配

  • iPhone8:

iPhone 13 Pro Max:

  • 黑夜模式

  • 跳转到用户页与伪登陆

    login

2 构成模块

2.1 HomeModular

Controller:

HomeViewController

  • 网络请求

    • 在Latest网络请求之前就已将View加载无数据状态,Latest网络请求在单独的一个方法里加载
    • Before请求放在代理里面,在MainTableView滑到每个sectionfooterView时触发并用代理的方式进行Before请求
  • 用于处理Model数据并把它交给View来展示主界面

    在网络请求加载完成后去传递model数据给MainTableView , BannerView,让它们展示界面

  • 数据刷新

    • 在开始加载主页界面的时候通过viewWillAppear来刷新头像
    • 在请求完Latest数据的时候就会对MainTableView 进行刷新
    • 请求完Before数据的时候也会对MainTableView 进行刷新
    • 下拉刷新
  • 同时使用了代理来传递数据

    • 点击进入新闻详情页:点击事件下,MainTableView , BannerView通过代理传递indexPath信息给HomeViewController, HomeViewController根据传进来的indexPath找到相应的文章ID, 同样通过代理把相应ID发送给专门处理跳转事件的ManagerViewController, 并返回一个相应的NewsViewController来达到界面跳转效果
    • 点击进入个人界面:点击事件下,TopView通过代理的方式告诉HomeViewController界面要跳转的讯息,HomeViewController也将用代理的方式告诉ManagerViewController,代理方法将会返回一个适合的个人界面
    • 刷新过往新闻:收到MainTableView用代理发送过来的section信息,并进行过往请求,并重新加载MainTableView数据
    • 传递日期给每个过往新闻的headerView的日期
    • banner的滚动放大效果MainTableView通过代理传递偏移量给HomeViewController,在由HomeViewController把偏移量通过代理交给BannerView
  • 事件处理

    点击TopView回到顶部TopView接到点击事件后用代理的方式告诉HomeViewControllerHomeViewController使MainTableView回到顶部

View:

TopView:用于展示主界面顶部的不会被滑动的View,用于展示今日日期和进入个人界面

MainTableView:主界面重要View,继承自UITableView,用于展示新闻,与进入新闻详情页

  • BannerView:主界面中用于自动轮播的新闻,在MainTableView中作为TableHeaderView
  • DateHeaderView: 每个section的headerView,负责展示每个过往新闻的日期
  • NewsCell: 每个新闻所在的cell,根据MainTableView传进来的数据作出展示

Model:

  • EverydayNewsModel: 数据交换,最重要的功能是装着每天的新闻并将其传送给HomeViewController
  • DayModel: 网络请求,一天的新闻,里面装着每个cell的新闻
  • DataModel: 模块封装,具体每个cell新闻的信息

2.2 NewsModular

Controller:

NewsViewController

  • 网络请求: 根据ManagerViewController传递进来的ID数据请求相应的网络数据
  • 用于处理Model数据并把它交给View来展示主界面:由于WKWebView加载界面的方式比较简单,所以没有单独为它开设一个View类,直接在请求完数据后便开始加载WKWebView,而新闻额外信息则是交给了BarView展示
  • 返回主界面:点击事件后,BarView通过代理使NewsViewController去处理返回事件

View:

BarViewbar

新闻底部的bar,具有返回功能,评论数与点赞数均为网络请求得来的数据,按下点赞或收藏按钮均有相应按钮图案颜色的改变,以及自定义提示框弹出与自动消失

Model:

ArticleModel: 主要去请求文章内容和新闻额外信息两个数据

2.3 PersonModular

Controller:

PersonViewController:

  • 展示View:通过偏好设置判断当前应是哪个View展示
  • 返回主界面:点击事件后,LoginView通过代理使PersonViewController去处理返回事件

View:

LoginView : 由基础控件basicView和未登陆状态的logInView以及已登陆状态的logOutView组成

3 重要的技术点

  • 根据提供的api,实现绝大部分功能

  • AFNetworking框架的使用与转化模型,转化成模型后的存储

  • MVC模式下准确高效地把数据通过Controller交到View中并让其展示数据

  • 各种界面跳转

  • 使用代理进行数据传递

  • Banner的自动轮播,拉伸放大

  • WKWebView的⽹⻚展示

  • 单例模式:ManagerViewController的单例和网络请求单例

  • 常用公共宏定义类PrefixHeader.pch

    //偏好设置的宏定义
    #define USERDEFAULTS [NSUserDefaults standardUserDefaults]
    //屏幕的宽和长
    #define DEVICESCREENWIDTH [[UIScreen mainScreen]bounds].size.width
    #define DEVICESCREENHEIGHT [[UIScreen mainScreen]bounds].size.height
    //cell的title文字宽度 76:图片的宽,两个18:图片右侧距离屏幕右边的距离,文字右侧距离图片左侧的距离,20:文字左侧距离屏幕左侧的距离
    #define WIDTH DEVICESCREENWIDTH - 76 - 18 - 20 - 18
  • 常用功能的封装

    • UILabel + AutoHeight: 能够根据文本内容,字号,字体间隔,来确定该UILabel的Size
    • NSDate + Day:能够得到今天的day,month,也能将month的数字转化为中文
  • 自定义

    • PopAlterView:自定义提示框,具有自动消失功能
    • NightAndSettingButton: 自定义UIButton,能够改变UIButton默认状态下image在左,title在右的情况,使其可做到image在上,title在下或者image在下,title在上的状态
  • 伪登陆

4 不足与心得体会

  • 不足:1.banner的拉伸比较奇怪

    bannerPull

    2.为了去调整一个UIButton中文字与图片的相对位置(个人界面的“设置”按钮)而去重写UIBUtton里面的设置位置方法,但是该方法已经废弃,虽然似乎仍然可以时用,但是没有必要,可以直接写一个UIView再加上手势即可

  • 心得体会:这是第一次写一个比较完整的项目,去实现比较完整的功能,我认为这个项目很好,把大部分所学的知识都用上了,还另外给了我探索的空间,让我更深一步的知道了理论与实践的天差地别。同样,我自己也在一次次的重构与优化中看到过去不足的自己,从而静下心来去想我应该怎样去改,怎么去写的更好,怎么在已经实现了需求的情况下再去追求代码的可读性。

About

知乎日报

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published