网络编程

当前位置:永利402游戏网站-永利402com官方网站 > 网络编程 > 网易新闻案例总结

网易新闻案例总结

来源:http://www.xtcsyb.com 作者:永利402游戏网站-永利402com官方网站 时间:2019-09-11 14:45

<b>前言 :</b>为了博眼球,所以给了个有标题标标题。但借使该文是您通过度娘或是古哥检索出来的这自个儿很鲜明的告知你那就是您想要的。想一向看效能而不想听自个儿念经的,可直接拉至篇尾那里有全方位代码。<b>走起 :</b>从前见Tencent录制、优酷录制的多栏页面做的挺难堪的,特别是最上部这性感的小黄条,于是乎自己写了个(细节管理很圆满的计划,可平昔拿去用的哦)。

https://github.com/RamWire/NinaPagerView *vc框架

图片 1IMG_1390.PNG

分界面显示

先来拜见那个练习项目标app页面效果,如下:

图片 2

QQ.png

为了丰硕利用UIPageViewController的一些特点,尾部并从未用UIScrollView,但又要监听pageViewControlle的偏移量。由于pageviewcontroller的兑现和我们常做的大循环轮播原理是大同小异一样的。所以滑动时监听到的偏移量是极不可相信的,最终合作UIPageviewcontrollerDelegate花了异常的大的岁月资金财产才算作出贰个同样的意义来。(那几个就不细说了,感兴趣的话能够下载上面的<a href=";)

功效效用

能够经过点击标题栏,或左右滑行内容区域,完毕四个页面之间的切换。这种利用特别常见。

 for subView: UIView in view.subviews { if subView.isKind(of: UIScrollView.classForCoder { let tempScrollView = subView as? UIScrollView tempScrollView?.delegate = self } }

手艺中央总计

以下总结一些里面包车型客车本事宗旨。

  • 分界面搭建
    随意做怎么样品种,首先要搭建好分界面。
    分界面结构分析:
    导航调控器--题目栏(可以滚动,srcollview)--内容区域(能够滚动,来回切换,展现的视图正是导航调整器的栈顶调控器的view)
    · 导航调节器
    首先表现出来的是导航调整器的view,所以要率先合併导航调节器(在storybord中,Editor--Embed In --navigation controler)
    · 加多标题scrollview

UIScrollView *titlesrcoll = [[UIScrollView alloc] init];
titlesrcoll.backgroundColor = [UIColor grayColor];
CGFloat y = self.navigationController.navigationBarHidden? 20:64;
titlesrcoll.frame = CGRectMake(0, y, self.view.bounds.size.width, 44);
[self.view addSubview:titlesrcoll];
_titleScrollView = titlesrcoll;

· 增添内容scrollview

UIScrollView *contentsrcoll = [[UIScrollView alloc] init];
contentsrcoll.backgroundColor = [UIColor greenColor];
CGFloat y = CGRectGetMaxY(self.titleScrollView.frame); //由_titleScrollView的尾巴部分边缘决定 y
contentsrcoll.frame = CGRectMake(0, y, self.view.bounds.size.width, self.view.bounds.size.height - y);
[self.view addSubview:contentsrcoll];
_contentScrollView = contentsrcoll; //全局

  • 标题设置
    完整布局搭建完,上边就贰个叁个丰盛。有几个标题,就对应多少个view,而view又由子调节器决定,故先加多子调整器。例如:

SocietyViewController *vc4 = [[SocietyViewController alloc] init];
vc4.title = @"社会";
[self addChildViewController:vc4];

PS:子控制器的view的有关属性设置,选择懒加载,在其viewDidLoad方法中设。

  • 拍卖标题开关点击
    监听开关点击,在哪监听?加多完按钮后就足以监听

[btn addTarget:self action:@selector(titleClick:) forControlEvents:UIControlEventTouchUpInside];

接下来提供监听方法,深入分析当点击后要做哪些动作?剖析点击标题要促成的效应作用:标题颜色改造--切换分界面(先增多view,再滚动过来);别的索要精通点击了哪多个按键,故需求参数

-(void)titleClick:(UIButton *)button{
NSInteger i = button.tag;
//标题颜色更改
[self SelectedBtn:button];
//把相应的子控件view加多
[self setupOneViewControler:i]; //哪叁个子调整器,由所点的btn决定--角标tag
//滚动内容到可视范围(改动偏移量x
CGFloat x = i * [UIScreen mainScreen].bounds.size.width;
self.contentScrollView.contentOffset = CGPointMake(x, 0);
}

-(void)setupOneViewControler:(NSInteger)i{
//把相应的子控件view加多
UIViewController *vc = self.childViewControllers[i];
if(vc.view.superview)
return; //加载了就毫无加了
CGFloat x = i * [UIScreen mainScreen].bounds.size.width;
vc.view.frame = CGRectMake(x, 0, [UIScreen mainScreen].bounds.size.width, self.contentScrollView.bounds.size.height);
[self.contentScrollView addSubview:vc.view];
}

  • 存在bug解决
    ios7自此,导航调整器中的scrollview顶上部分汇合世额外64的滚动区域,化解办法是:

self.automaticallyAdjustsScrollViewInsets = NO;

  • 剧情scrollview滚动监听
    三部曲:设置监听目的---遵从合同---选拔监听方法(曾几何时做业务)
    self.contentScrollView.delegate = self;
    <UIScrollViewDelegate>
    怎么时候做?滚动完毕时,停止滚动再加载view,节省财富。
    做什么业务?——标题选中、界面切换。

-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{
//获取当前角标
NSInteger i = scrollView.contentOffset.x / [UIScreen mainScreen].bounds.size.width;
//获取标题按键
// UIButton *titleBtn = self.titleScrollView.subviews[i];//不可能因此这几个主意拿,因为通过index不可靠
UIButton *titleBtn = self.titleBtns[i]; //用叁个新数组保存标题按键,可相信
//1,选中标题--哪一个题名? ->通过角标 -> 角标怎么得到
[self SelectedBtn:titleBtn];
//2.把相应的子调控器的view滚动过去
[self setupOneViewControler:i];
}

  • 标题居中拍卖
    什么日期做?标题选中的时候。标题居中,其实要做的正是要调治scrollview的偏移量。偏移多少?---点了哪贰个题名,就相应偏移多少。---哪个题目?---由所点击的按钮决定--->方法须要参数

-(void)setupTitleCenter:(UIButton *)button{
CGFloat offsetX = button.center.x - [UIScreen mainScreen].bounds.size.width * 0.5;
if(offsetX < 0 )
offsetX =0;
CGFloat maxoffsetX = self.titleScrollView.contentSize.width - [UIScreen mainScreen].bounds.size.width;
if(offsetX > maxoffsetX)
offsetX = maxoffsetX;
[self.titleScrollView setContentOffset:CGPointMake(offsetX,0) animated:YES];
}

  • 收取封装
    以上分界面作用相当广阔,应用分布,由此能够用作移植代码。于是思虑把地点的案例封装抽出出来,外面方便使用。

那边有个比较倒霉管理的是偏移量是“0->375->750->375->0”这种态度的, 由于不一连,管理起来就广魔难为。既然如此,大家有未有方法改换那几个呢?在pageviewcontroller中央调控制器的逻辑切换是连连的。但视图切换在本质上却是不一连的。我们好不好通过UIPageViewController的逻辑做三个<b>设想偏移量</b>呢?(就如web开辟中React.js写出来的不是忠实DOM,而是设想DOM)。对,正是生成设想偏移量。那些能达成的话小编想在繁多地方我们都以用的上的。上边包车型客车话下我的落实思路:1、我们要知道UIPageViewController有个内嵌的UIScrollView,获取到她,监听到scrollview发生了滚动。具体看上面这段代码。2、在UIScrollView发生了滚动时,总计出设想偏移量。注意大家要的不是contentoffset,此场景下,那么些太操蛋了,不可靠赖(陪合UIPageViewControllerDelegate仍是能够用的,逻辑上极倒霉操作)。那我们要怎么着呢?大家透过当前可视的要命viewController的view映射到UIPageViewCOntroller的view上,就能够博得偏移量了。而那才是大家真正看到的,想要的偏移量。(<b>核心思想便是使用UIView的convert函数总括真实偏移量</b>)

func scrollViewDidScroll(_ scrollView: UIScrollView) { let pageWidth = view.frame.width for vc in readyViewControllers!{ let p = vc.view.convert, to: view)//找出屏幕可视范围的控制器视图 if  > CGFloat &&  < pageWidth{ let estimatePage = (readyViewControllers?.index! estimateOffSetX = CGFloat(estimatePage) * pageWidth -  } } //若不是循环,最后一个找不到左边距 if estimateOffSetX >= CGFloat((readyViewControllers?.count)!-1)*pageWidth{ let p = readyViewControllers?[(readyViewControllers?.count)!-1].view.convert, to: view) estimateOffSetX = CGFloat((readyViewControllers?.count)!-1) * pageWidth - ! }// print("矫正前:(estimateOffSetX)") scrollDidScroll!(estimateOffSetX) }

理当如此大家还会有三个难题供给注意:1)最终叁个调节器的再往左滑的时候,侧面距是不在可视范围内的。供给去掉如下判定规范,单独管理

if  > CGFloat &&  < pageWidth{

2)留心的您确定开采了地点那句判别标准是不饱含0和pageWidth五个临界状态的。那是因为在pageviewcontroller滑动到临界状态,会有view的tihuan和contentoffset的万物更新,所以必得甩掉。那你也许会说,那还远远不足精准啊。不急,且看第三步3、pageviewcontroller当大家松开的时候会到达零界点,大家用scrollViewDidEndDecelerating来监听,并做微小的考订

func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) { let pageWidth = view.frame.width currentPage = Int(round(estimateOffSetX/pageWidth)) if currentPage < 0 { currentPage = (readyViewControllers?.count)! - 1 } estimateOffSetX = CGFloat(currentPage)*pageWidth// print("矫正后:(estimateOffSetX)") scrollDidScroll!(estimateOffSetX) }

完事了,如此一来我们能获得到一个虚构偏移量(从另一个角度来看,那才是实在的),变化进度是那样的:0->10->30->100->200->300->375->380->400->500->600->750->800->990->1040->1170->1200->1400->1600->1800。天啊噜,那才是大家想要的啊。也难怪apple的pageviewcontroller并从未暴光scrollview属性,因为不可用啊。那样一改就可用了。

Talk is Cheap,Show you the Code

本文由永利402游戏网站-永利402com官方网站发布于网络编程,转载请注明出处:网易新闻案例总结

关键词:

上一篇:UITextView加多Placeholder

下一篇:没有了