第六天任務(wù)
- 推薦標簽頁面的完成
- 圓形頭像的設(shè)置和封裝
- 評論界面的完成
- 新帖界面的完成
- 發(fā)布界面的完成
推薦標簽頁面的完成
點擊精華頁面左上角按鈕來到推薦標簽界面也切。
推薦標簽的實現(xiàn)有了之前的經(jīng)驗就非常簡單了道批,根據(jù)MVC原則創(chuàng)建文件,同樣在cell中添加模型屬性姥宝,根據(jù)模型為cell內(nèi)控件賦值。
唯一有一個注意點:當點擊進入推薦標簽頁面,如果此時數(shù)據(jù)還沒有獲取到,點擊返回忍级,SVP的提醒還在,block會對控制器產(chǎn)生強引用伪朽,如果block還沒有執(zhí)行完轴咱,控制器是不會死的,block執(zhí)行完畢之后烈涮,強引用才會被放開朴肺,控制器才會被銷毀,所以block中需要使用弱引用
__weak typeof(self) weakSelf = self;
坚洽,但是雖然使用弱引用戈稿,控制器在該被銷毀的時候就會被銷毀,但是block內(nèi)的代碼還是會繼續(xù)執(zhí)行的讶舰,只不過weakSelf會被置為nil鞍盗,所以我們需要在一點擊返回的時候?qū)⒄埱笕∠?code>-(void)viewWillDisappear:(BOOL)animated當控制器view即將消失的時候 隱藏SVP 并且取消請求跳昼,但是AFN中如果正在發(fā)送請求當請求還沒有返回的時候橡疼,取消請求會來到failure方法中,所以需要在failure方法中進行判斷if (error.code == NSURLErrorCancelled)
庐舟,如果是需要請求的那么直接返回即可,如果是請求失敗住拭,則提醒用戶挪略。
但是如果是進入下一個界面,則不需要取消請求
圓形頭像的設(shè)置
圓形頭像使用Quartz2D來實現(xiàn)滔岳,實現(xiàn)思路:開啟圖形上下文杠娱,在圖形上下文上添加一個圓,裁剪谱煤,然后將圖片繪制到圓形區(qū)域摊求,然后獲得圖片即是圓形圖片。
這里對圓形頭像進行了封裝刘离,給image添加分類室叉,傳入一張圖片,返回一張圓形圖片
UIImage+CLExtension.m
#import "UIImage+CLExtension.h"
@implementation UIImage (CLExtension)
/** 返回圓形圖片 */
-(instancetype)circleImage
{
// 開啟圖形上下文
UIGraphicsBeginImageContext(self.size);
// 上下文
CGContextRef ctx = UIGraphicsGetCurrentContext();
// 添加一個圓
CGRect rect = CGRectMake(0, 0, self.size.width, self.size.height);
CGContextAddEllipseInRect(ctx, rect);
// 裁剪
CGContextClip(ctx);
// 繪制圖片
[self drawInRect:rect];
// 獲得圖片
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
// 關(guān)閉圖形上下文
UIGraphicsEndImageContext();
return image;
}
/** 直接根據(jù)image name設(shè)置圓角 */
+(instancetype)circleImageNamed:(NSString *)name
{
return [[UIImage imageNamed:name] circleImage];
}
@end
傳入圖片或者直接傳入圖片name硫惕,返回一張圓形圖片茧痕。
因為一個項目中的頭像一般是統(tǒng)一的,如果是方形的則項目中所有頭像都是方形的恼除,而如果要修改為圓形的則每一處頭像設(shè)置都需要更改踪旷,為了能夠統(tǒng)一控制項目中所有頭像的形狀,我們給imageView添加設(shè)置頭像的分類
#import "UIImageView+CLExtension.h"
#import <UIImageView+WebCache.h>
@implementation UIImageView (CLExtension)
/** 默認為圓形頭像 */
- (void)setHeader:(NSString *)url
{
[self setCircleHeader:url];
}
/** 設(shè)置圓形頭像 */
- (void)setCircleHeader:(NSString *)url
{
// 將占位圖片也轉(zhuǎn)化為圓形 其實占位圖片本來就是圓形
UIImage *placeholder = [UIImage circleImageNamed:@"defaultUserIcon"];
[self sd_setImageWithURL:[NSURL URLWithString:url] placeholderImage:placeholder completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) {
// 如果image為空則返回占位圖片
if (image == nil) return;
self.image = [image circleImage];
}];
}
/** 設(shè)置方形頭像 */
- (void)setRectHeader:(NSString *)url
{
UIImage *placeholder = [UIImage imageNamed:@"defaultUserIcon"];
[self sd_setImageWithURL:[NSURL URLWithString:url] placeholderImage:placeholder];
}
@end
而項目中設(shè)置頭像也變得非常簡單,直接[imageView setHeader:url]即可令野,這個時候全世界的頭像都變成圓的啦舀患。
而當需要將項目中所有頭像由方形轉(zhuǎn)變?yōu)閳A形的時候,只需要在分類方法中將[self setCircleHeader:url];
修改為[self setRectHeader:url];
即可气破,這個時候全世界的頭像又都會變成方的聊浅。
評論界面的完成。
先來看一下評論界面的內(nèi)容
點擊cell會進入到評論界面堵幽,評論界面使用xib進行描述狗超,分為上面tableView和底部工具條。
需要注意的還是約束的添加朴下,因為這里需要底部工具條隨著鍵盤的彈出上移努咐,所以底部工具條的底部與SuperView的底部間距為零,如圖
然后我們拿到這個約束殴胧,監(jiān)控鍵盤的彈出渗稍,當鍵盤彈出的時候,將約束間距修改為鍵盤的高度团滥,同時也可以拿到鍵盤彈出的時間竿屹,使底部工具條在相同時間內(nèi)上移即可。
// 添加監(jiān)聽
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillChangeFrame:) name:UIKeyboardWillChangeFrameNotification object:nil];
- (void)keyboardWillChangeFrame:(NSNotification *)note
{
// 修改約束 = 屏幕的高度 - 鍵盤的y值
CGFloat keyboardY = [note.userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue].origin.y;
CGFloat screenH = [UIScreen mainScreen].bounds.size.height;
self.bottomMargin.constant = screenH - keyboardY;
// 執(zhí)行動畫
// 獲取執(zhí)行動畫的時間
CGFloat duration = [note.userInfo[UIKeyboardAnimationDurationUserInfoKey] doubleValue];
[UIView animateWithDuration:duration animations:^{
// 更新約束
[self.view layoutIfNeeded];
}];
}
注意:控制器銷毀的時候一定要記得移除監(jiān)聽
- (void)dealloc
{
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
評論界面上方cell的顯示有兩種做法灸姊。
總共分為三組cell 第一組cell 用來顯示內(nèi)容 第二組cell用來顯示 最熱評論 第三組cell用來顯示最新評論
cell分為兩組拱燃,將cell的內(nèi)容轉(zhuǎn)化為heardView。
如果tableView的style設(shè)置為 plain 而不是group力惯,同時設(shè)置tableView的頭標題 heardView , tableView往上面滑動的時候 heardView就會停留在屏幕最上方碗誉。
heardTitle的設(shè)置可以在代理方法中直接返回內(nèi)容
-(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
但是為了能夠使heardView更加豐富,可以直接返回UIview
-(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
如果heardView特別多 可以使用 UITableViewHeaderFooterView
父晶。
UITableViewHeaderFooterView
和cell一樣有重用機制哮缺,需要注冊,并從緩存池中取
也可以繼承UITableViewHeaderFooterView進行自定義
通過重寫- (instancetype)initWithReuseIdentifier:(NSString *)
方法對其內(nèi)部進行一些修改- (void)layoutSubviews
對其內(nèi)部的控件frame進行一些修改
一般如果想要修改控件內(nèi)子控件的frame甲喝,等但是發(fā)現(xiàn)怎么改都會被改回去尝苇,那么這個時候可以嘗試在layoutSubViews中進行修改,先讓super設(shè)置完畢之后埠胖,我們在進行設(shè)置進行覆蓋糠溜,用來覆蓋對子控件的一些設(shè)置。
cell的高度計算
評論界面的cell使用的是UITableViewAutomaticDimension
自動計算高度押袍,這樣cell在添加約束的時候需要額外小心诵冒,先來看一下評論cell的xib
值得注意的評論的內(nèi)容可能是音頻button也可能是label,幾個需要額外注意的約束是谊惭,內(nèi)容label與cell的contentView底部間距固定為10汽馋,保證cell的高度隨著label的高度變化而變化侮东,而無論label有沒有內(nèi)容,label的高度應(yīng)該大于等于音頻button的高度豹芯,保證當是音頻評論label沒有內(nèi)容的時候悄雅,cell的高度同樣等于音頻button + 10的高度,label的行數(shù)設(shè)置為0铁蹈,保證label可以自動換行顯示全部文字宽闲。音頻button與label左邊與上邊對齊。來看一下label的約束握牧。
同時在代碼中需要設(shè)置cell的高度自動計算容诬,并且給cell一個大致的估算高度
// 設(shè)置cell行高自動計算 自動計算尺寸
self.commentTableView.rowHeight = UITableViewAutomaticDimension;
// 需要先給一個大約的估算高度
self.commentTableView.estimatedRowHeight = 44;
cell的內(nèi)容顯示
cell的內(nèi)容顯示就非常簡單了,無非需要對評論的內(nèi)容進行判斷沿腰,如果是文字內(nèi)容則隱藏音頻button览徒,如果是音頻則表示肯定沒有文字,設(shè)置button的title即可颂龙。
另外因為評論分為最熱評論和最新評論习蓬,分為幾種情況,最熱評論和最新評論都有措嵌,有最新評論但是沒有最熱評論躲叼,和沒有評論。設(shè)置heardtitle企巢,返回行數(shù)枫慷,和賦值的時候進行一些判斷即可。
// 如果是第0組浪规,并且最熱評論有值則返回最評論行數(shù)
if (section == 0 && self.hotestComments.count) {
return self.hotestComments.count;
}
// 否則都返回最新評論行數(shù)
return self.latestComments.count;
評論內(nèi)容刷新注意點
除了進行請求之前要取消之前的請求之外流礁,評論界面的上拉刷新和下拉加載還有一些需要注意的地方
- 當沒有評論的時候服務(wù)器返回給我們的是一個空的數(shù)組,所以此時需要對返回數(shù)據(jù)類型進行判斷罗丰,如果是數(shù)組說明沒有評論,則直接結(jié)束刷新再姑,返回即可萌抵。
// 如果沒有評論的話 服務(wù)器返回的是一個數(shù)組
if (![responseObject isKindOfClass:[NSDictionary class]]) {
[self.commentTableView.mj_header endRefreshing];
return ;
}
- 如果評論小于10條,一次就可以全部請求下來元镀,此時已經(jīng)不需要上拉加載更多評論了绍填,所以除了關(guān)閉下拉刷新,還要判斷評論數(shù)組的count如果等于評論總數(shù)栖疑,則隱藏上拉加載更多
int total = [responseObject[@"total"]intValue];
if (weakSelf.latestComments.count == total) {// 說明加載完全了讨永,隱藏上拉刷新
// 沒有更多數(shù)據(jù),隱藏上拉加載更多
weakSelf.commentTableView.mj_footer.hidden = YES;
}
- 上拉加載更多同樣需要判斷遇革,如果已經(jīng)加載全部評論則隱藏上拉加載更多卿闹,如果沒有加載全部揭糕,則僅僅結(jié)束本次上拉加載即可
int total = [responseObject[@"total"]intValue];
if (weakSelf.latestComments.count == total) {// 說明加載完全了,隱藏上拉刷新
weakSelf.commentTableView.mj_footer.hidden = YES;
}else{
// 結(jié)束刷新
[weakSelf.commentTableView.mj_footer endRefreshing];
}
- 當沒有數(shù)據(jù)的時候MJRefresh提供了自動判斷的方法
/** 自動根據(jù)有無數(shù)據(jù)來顯示和隱藏(有數(shù)據(jù)就顯示锻霎,沒有數(shù)據(jù)隱藏著角。默認是NO) */
self.commentTableView.mj_footer.automaticallyHidden = YES;
tableView的heardView的顯示
評論界面的heardView和精華頁面的cell內(nèi)容一致,我們可以直接通過cell的loadNibNamed方法來直接加載xib中的cell旋恼,但是內(nèi)容還是需要自己設(shè)置吏口。
// viewFromNib 是在分類中對loadNibNamed方法進行的封裝
CLTopicCell *cell = [CLTopicCell viewFromNib];
cell.topic = self.topic;
cell.cl_height = self.topic.cellHeight + 20;
// 設(shè)置heardView
self.commentTableView.tableHeaderView = cell;
需要注意的一點是,因為我們在之前設(shè)置cell之間的間距的時候重寫過cell的setFrame方法冰更,在setFrame中將cell的高度減少了10产徊,所以每次設(shè)置cell的frame都會來到這個方法,將cell的高度減少10蜀细,評論界面顯示的時候來到一次setFrame方法舟铜,設(shè)置cell高度的時候又來到一次,一共來到兩次setFrame方法审葬,cell的高度被減少了20深滚,所以設(shè)置cell高度的時候需要加上20。
另外因為這里setFrame方法中只對cell的高度做了修改涣觉,所以稍作修改就可以完整的顯示cell痴荐,但是如果在setFrame中對cell的位置和寬高同時做了修改,就會產(chǎn)生難以捉摸的錯誤官册,所以如果需要在setFrame中對cell的位置和寬高同時做修改時生兆,建議使用一個UIView當做載體爪瓜,heardView上添加UIView要出,UIView上在添加cell涤久,此時cell的setFrame不會對UIView產(chǎn)生任何影響棒坏。
消除評論界面heardView中的最熱評論
如果是有最熱評論的cell柱徙,加載到評論界面時需要將最熱評論去掉竖幔,這里將CLTopic模型的top_cmt最熱評論屬性置為空料皇,然后在給cell的topic賦值
但是這里存在兩個問題
此時最熱評論雖然沒有了费封,但是那部分會被空出來介返,這是因為我們之前對cell的高度進行了緩存拴事,當設(shè)置cell高度時,發(fā)現(xiàn)cellHeight不為零圣蝎,則直接返回高度刃宵,不會重新計算。因此我們這里將cellHeight設(shè)置為0徘公,當設(shè)置cell的cellHeight時就會重新計算cellHeight牲证。
此時我們返回精華界面,將cell滑出界面在滑回來关面,這時發(fā)現(xiàn)cell內(nèi)的熱門評論也沒有了坦袍,這是因為我們之前將CLTopic模型的top_cmt最熱評論屬性置為空了十厢,并且緩存了cell的高度,因此這里需要將top_cmt最熱評論屬性記錄保存起來键闺,在評論控制器將要被銷毀的時候寿烟,也就是返回精華界面的時候,重新將top_cmt最熱評論屬性賦值回去辛燥,并將cellHeight高度重新設(shè)置為0筛武,使其重新計算高度。
這里貼出設(shè)置heardView和dealloc方法
@property(nonatomic,strong)CLComment *saveTopCom;
-(void)setupTableHeard
{
// 如果有最熱評論挎塌,則設(shè)為空
// 當控制器銷毀的時候徘六,需要將值重新設(shè)置回來,并且將cellheight設(shè)置為0 讓其在重新計算一次榴都。所以先將他保存起來
self.saveTopCom = self.topic.top_cmt;
self.topic.top_cmt = nil;
self.topic.cellHeight = 0;
// 從xib加載cell
CLTopicCell *cell = [CLTopicCell viewFromNib];
cell.topic = self.topic;
cell.cl_height = self.topic.cellHeight + 20;
// 如果使用UIView當中間的載體待锈,需要設(shè)置cell的frame。
// cell.frame = CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, self.topic.cellHeight);
// // 創(chuàng)建heardView
// UIView *heardView = [[UIView alloc]init];
// [heardView addSubview:cell];
// heardView.cl_height = self.topic.cellHeight;
// heardView.backgroundColor = CLCommonColor(206);
// 設(shè)置heardView
self.commentTableView.tableHeaderView = cell;
}
- (void)dealloc
{
// 控制器銷毀的時候 將值重新設(shè)置回去嘴高,并將cellHeight設(shè)置為0竿音,讓其重新計算高度
self.topic.top_cmt = self.saveTopCom;
self.topic.cellHeight = 0;
}
新帖模塊的完成
新帖模塊頁面和精華完全一樣,只是請求的數(shù)據(jù)不同拴驮,只需要讓新帖的控制器繼承自精華控制器春瞬,請求數(shù)據(jù)的時候?qū)刂破黝愋瓦M行判斷,根據(jù)不同的控制器設(shè)置不同的請求參數(shù)即可套啤。
- (NSString *)aParam
{
if (self.parentViewController.class == [CLNewViewController class]) {
return @"newlist";
}
return @"list";
}
通過一張圖來看一下精華模塊和新帖模塊的結(jié)構(gòu)
中間加號彈出界面完成
點擊中間加號宽气,會彈出發(fā)表頁面。
考慮到發(fā)表頁面內(nèi)部按鈕點擊事件較為復(fù)雜潜沦,發(fā)表頁面使用控制器萄涯,點擊加號按鈕moda出發(fā)表頁面控制器,至于發(fā)表頁面內(nèi)容的布局和賦值不在贅述唆鸡,6個button有一個飛出動畫涝影,逐個從底部飛出到頁面上,其實現(xiàn)原理為:
布局button時争占,先將button放在現(xiàn)在的位置上袄琳,然后設(shè)置button的transform下移一個屏幕的高度
btn.transform = CGAffineTransformMakeTranslation(0, self.view.bounds.size.height);
然后當控制器view顯示完成的時候,設(shè)置每隔0.1s執(zhí)行一次動畫燃乍,將一個button的transform恢復(fù)
self.time = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(upData) userInfo:nil repeats:YES];
恢復(fù)button的transform
btn.transform = CGAffineTransformIdentity;
當六個button全部恢復(fù)完成的時候?qū)elf.time取消
[self.time invalidate];
點擊狀態(tài)欄返回tableView頂部實現(xiàn)
當點擊狀態(tài)欄的時候,tableView會自動滾動到最上方宛琅,其實scrollView有scrollsToTop這個屬性刻蟹,并且默認就是YES,但是有個局限性嘿辟,只有在有一個屏幕滾動視圖的時候才會生效舆瘪,當scrollView中有一個以上的滾動視圖時片效,將會失效。
而且只能設(shè)置狀態(tài)欄的狀態(tài)英古,卻沒有辦法拿到狀態(tài)欄做一些事情淀衣,使用控件遮擋狀態(tài)欄也會被狀態(tài)欄覆蓋。
那么如果想要遮住狀態(tài)欄召调,需要創(chuàng)建一個優(yōu)先級大于statusBar的透明的Window用來遮擋狀態(tài)欄膨桥,并監(jiān)聽點擊事件。
需要注意一點:iOS9之后唠叛,要求如果window在程序啟動完之后就顯示則必須有一個根控制器只嚣。因此需要設(shè)置將window延遲創(chuàng)建即可。
實現(xiàn)思路為:短暫延遲創(chuàng)建狀態(tài)欄大小的window艺沼,并設(shè)置window的層級大于StatusBar的層級册舞,為window添加點擊事件,然后拿到keywindow的所有子控件找到scrollView障般,判斷scrollView有沒有顯示在keywindow上调鲸,如果顯示了則修改scrollView的offset.y
等于頂端的偏移量即-contentInset.top
即可。
window的層級分為三種挽荡,層級高的顯示在最外面藐石,當層級相同時,越靠后調(diào)用的顯示在外面徐伐。
UIWindowLevelNormal; //默認贯钩,值為0
UIWindowLevelAlert; //值為2000
UIWindowLevelStatusBar ; // 值為1000
判斷scrollView有沒有顯示在keywindow上,實質(zhì)上是判斷scrollView和keywindow有沒有重疊的地方办素,而判斷他們有沒有重疊的前提是他們在同一個坐標系中角雷,即在同一個父控件中。
UIView提供了轉(zhuǎn)換坐標系和判斷兩個空間是否有重疊的方法性穿,
// 讓rect這個矩形框勺三, 從view2坐標系轉(zhuǎn)換到view1坐標系, 得出一個新的矩形框newRect
CGRect newRect = [view1 convertRect:rect fromView:view2];
// 讓rect這個矩形框, 從view1坐標系轉(zhuǎn)換到view2坐標系, 得出一個新的矩形框newRect
CGRect newRect = [view1 convertRect:rect toView:view2];
是否包含
CGRectContainsRect(CGRect1,CGrect2)
是否交叉
CGRectIntersectsRect(CGrect1,CGRect2)
這里將判斷兩個空間知否交叉的判斷方法添加到UIView的分類中需曾,自定義window吗坚,在application中延遲添加顯示。
判斷控件是否交叉方法
-(BOOL)intersectWithView:(UIView *)view
{
// 這里使用keywindow是為了防止兩個控件在兩個不同的window中呆万,這種情況一般不會出現(xiàn)商源,toView:nil 默認就是控件所在的window。
UIWindow *window = [UIApplication sharedApplication].keyWindow;
CGRect newRect = [self convertRect:self.bounds toView:window];
CGRect newView = [view convertRect:view.bounds toView:window];
return CGRectIntersectsRect(newRect, newView);
}
window的創(chuàng)建與添加點擊事件
#import "CLTopWindow.h"
@implementation CLTopWindow
static UIWindow *window_;
+(void)show
{
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.25 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
window_ = [[UIWindow alloc]init];
window_.frame = [UIApplication sharedApplication].statusBarFrame;
window_.backgroundColor = [UIColor clearColor];
window_.windowLevel = UIWindowLevelAlert;
window_.hidden = NO;
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(topWindowClick)];
[window_ addGestureRecognizer:tap];
});
}
+(void)topWindowClick
{
UIWindow *keiwindow = [UIApplication sharedApplication].keyWindow;
[self findscrollViewsInView:keiwindow];
}
+(void)findscrollViewsInView:(UIView *)view
{
for (UIView *subview in view.subviews) {
[self findscrollViewsInView:subview];
}
if (![view isKindOfClass:[UIScrollView class]]) return;
if(![view intersectWithView:[UIApplication sharedApplication].keyWindow])return;
UIScrollView *scrollView = (UIScrollView *)view;
// 修改offset
CLLog(@"%@",scrollView);
CGPoint offset = scrollView.contentOffset;
offset.y = - scrollView.contentInset.top;
[scrollView setContentOffset:offset animated:YES];
// 這是使scrollView顯示出某個區(qū)域
// [scrollView scrollRectToVisible:CGRectMake(0, 0, 1, 1) animated:YES];
}
@end
重復(fù)點擊tabbarbutton和titleView中button后刷新數(shù)據(jù)實現(xiàn)
重復(fù)點擊tabbarButton或者titleView中的button之后刷新數(shù)據(jù)谋减,首先需要記錄下來上次的點擊按鈕牡彻,與本次點擊比較,如果發(fā)現(xiàn)是重復(fù)點擊則通知界面刷新出爹。
所以需要監(jiān)聽按鈕的點擊庄吼,并發(fā)送通知缎除,為了避免其他界面同時刷新,需要判斷控制器的view在不在window上和view跟window有沒有重疊总寻,兩者缺一不可器罐,判斷控制器的view在不在window上排除的是tabbar上的其他控制器view,判斷view跟window有沒有重疊排除的是精華模塊中其他子控制器渐行。
監(jiān)聽按鈕的點擊轰坊,分別可以在application中使用UITabBarControllerDelegate的代理方法監(jiān)聽tabbarbutton的點擊,titlebutton的點擊在button點擊事件中殊轴。分別進行判斷并添加通知衰倦。
播放視頻和音樂
視頻的播放項目中暫時使用了MPMoviePlayerViewController,跳轉(zhuǎn)控制器進行播放旁理,和音樂的播放樊零,查看百思不得姐原項目,發(fā)現(xiàn)視頻和音頻都是在本界面播放的孽文,自己嘗試了一下使用AVPlaylayer基本可以實現(xiàn)在本界面播放驻襟,但是還是存在很多問題,很多細節(jié)例如暫停播放芋哭,進度條等都沒有實現(xiàn)沉衣,并且覺得自己的實現(xiàn)并不正確,所以這里就不放上來了减牺。
如果有朋友做過視頻豌习,音頻播放這方面的實現(xiàn),有時間并且愿意的話請多多指教
項目總體結(jié)構(gòu)圖
最后成果拔疚。
至此肥隆,項目已經(jīng)基本完成,內(nèi)容非常有限稚失,其中涉及到登陸的一些模塊無法獲得授權(quán)沒有完成栋艳,發(fā)布內(nèi)容頁面,添加關(guān)注頁面句各,視頻音頻的播放等也不夠完善吸占,其中也有許多欠缺的地方,一些細節(jié)處理不夠好凿宾,以后在慢慢完善矾屯。
昨天晚上rm-rf之后蒙掉了,還好有最近的代碼備份初厚,今天又整理了一下件蚕。
代碼已經(jīng)上傳到github,源碼下載。
最后總結(jié):如果不去做骤坐,就永遠不知道自己什么時候能準備好。
文中如果有不對的地方歡迎指出下愈。我是xx_cc纽绍,一只長大很久但還沒有二夠的家伙。