一直想寫點什么,可又不知道從什么開始寫。新的一年開始了,想想總要有個好得開頭吧,折騰了倆天總算是把自己的博客弄了出來。前幾天抽時間寫了一下仿知乎日報,當中遇到到一些小問題給大家簡單分享一下。
首頁
TopScrollView
首頁的頁面結構大致是這樣的,先在首頁添加一個tableView,originY從20開始,并且為tableView添加一個空白的hearderView,如下所示
CGFloat offSetY = tableView.contentOffset.y;
if (offSetY<=0&&offSetY>=-90) {
//當下拉時候,scrollView往下移動一半,高度增加一半,圖片會看起來上下都變長了
scrollView.frame = CGRectMake(0, -45 - 0.5 * offSetY, kScreenWidth, 265 - 0.5 * offSetY);
//偏移值大于90了禁止移動
}else if(offSetY<-90){
tableView.contentOffset = CGPointMake(0, -90);
}else if(offSetY <= 500) {
//上拉的時候,scrollView也隨之上移,這樣就能看見statusBar了
self.y = -45 - offSetY;
}
NaviBar
當然,在移動的同時,也應該設置naviBar的alpha,其中naviBar是自己手動添加的一個View而已
if (offSetY<=0&&offSetY>=-90) _naviBar.alpha = 0;
//隨著上拉,改變naviBar的alpha
else if(offSetY <= 500) _naviBar.alpha = offSetY/200;
繼續拉動的話會出現圖中所視情況,當section剛剛移動到naviBar的位置的時候naviBar將會隱藏,這時候要用到tableView的代理方法。然后依據tableViewHearder的黏性,在繼續拉動就順理成章了。
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section{
// 寫成0 display 不會在0的section 執行
return section?sectionHeight:CGFLOAT_MIN;
}
//當帶有hearderView的section的在屏幕顯示的時候執行的代理方法
- (void)tableView:(UITableView *)tableView willDisplayHeaderView:(UIView *)view forSection:(NSInteger)section {
if (section == 0) {
_naviBar.height = 55;
_titleLabel.alpha = 1;
}
}
//當hearderView的section在屏幕消失的時候執行的代理方法
- (void)tableView:(UITableView *)tableView didEndDisplayingHeaderView:(UIView *)view forSection:(NSInteger)section {
if (section == 0) {
_naviBar.height = 20;
_titleLabel.alpha = 0;
}
}
新聞詳情頁
仔細的觀看知乎日報上拉加載下一頁的時候發現會產生有滾動的動畫,而不是單純的更換頁面內容,此時就要用到scrollView了
_scrollView.pagingEnabled = YES;
_scrollView.bounces = NO;
scrollView.contentSize = CGSizeMake(kScreenWidth, 3 * kScreenHeight);
_scrollView.contentOffset = CGPointMake(0, kScreenHeight);
_scrollView.scrollEnabled = NO;
當上啦加載下一頁的時候執行如下動畫并設置childController即可。
[UIView animateWithDuration:animationDuraion animations:^{
self.scrollView.contentOffset = CGPointMake(0, 2 * kScreenHeight);
} completion:^(BOOL finished) {
self.scrollView.contentOffset = CGPointMake(0, kScreenHeight);
}];
3DTouch
第一點呢,讓cell成為UIViewControllerPreviewing的delegate要用如下方法,并遵守協議UIViewControllerPreviewingDelegate
[self registerForPreviewingWithDelegate:cell sourceView:cell.contentView];
其中cell.contentView是點擊之后會出現效果的View,在cell中使用如下方法。
- (nullable UIViewController *)previewingContext:(id <UIViewControllerPreviewing>)previewingContext viewControllerForLocation:(CGPoint)location;
在此方法中設置返回你想要的controller即可,此時就可以打開頁面了,不過并不能實現在3DTouch呈現半個頁面的時候使用其他方法,此時就需要在你返回的Controller方法中實現以下方法
- (NSArray<id<UIPreviewActionItem>> *)previewActionItems{
UIPreviewAction *p1 =[UIPreviewAction actionWithTitle:@"分享" style:UIPreviewActionStyleDefault handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {
//在此輸入你實現的方法即可
}
NSArray *actions = @[p1];
return actions;
}