日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

触控(Touch) 、 布局(Layout)

發布時間:2023/11/27 生活经验 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 触控(Touch) 、 布局(Layout) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1 使用觸控實現一個簡易的畫板

1.1 問題

觸控(Touch)是一個UITouch類型的對象,當用戶觸摸了屏幕上的視圖時自動被創建,通常使用觸控實現繪圖、涂鴉、手寫等功能。本案例使用觸控實現一個簡易的畫板,可以在畫板上勾畫出一條線,如圖-1所示:

圖-1

1.2 方案

首先在創建好的SingleViewApplication項目中創建一個畫板類TRDrawView,繼承至UIView,該類有一個NSMutableArray類型的屬性points,用于存儲手指觸摸的軌跡也就是點。

其次在Stroyboard的場景中拖放一個View控件,和屏幕一樣大小,然后將View的類型修改為TRDrawView。

然后在TRDrawView類中通過touchesBegan:、touchesMoved:方法獲取到手指的觸摸點,將點存儲到points數組中。

最后在TRDrawView類中重寫drawRect方法,該方法中根據手指的觸摸軌跡points進行屏幕繪制。切記要在touchesMoved方法中調用setNeedDisplay刷新界面。

1.3 步驟

實現此案例需要按照如下步驟進行。

步驟一:創建項目和畫板類

首先在創建好的SingleViewApplication項目中創建一個畫板類TRDrawView,繼承至UIView,該類有一個NSMutableArray類型的屬性points,用于存儲手指觸摸的軌跡也就是點,代碼如下所示:

  1. @interface?TRDrawView?()
  2. @property?(strong, nonatomic)?NSMutableArray?*points;
  3. @end

然后從對象庫中拖放一個View控件到Storyboard場景中,View控件的大小和屏幕一樣。在右邊欄的檢查器三將View的類型設置為TRDrawView,如圖-2所示:

圖-2

步驟二:在TRDawView中獲取手指觸摸軌跡

在TRDrawView類中首先重寫touchesBegan:,在該方法將points屬性進行初始化,并獲取當前手指的觸摸點,存儲到points數組中,代碼如下所示:

  1. -?(void)touchesBegan:(NSSet?*)touches?withEvent:(UIEvent?*)event
  2. {
  3. //初始化數組
  4. self.points?=?[@[]mutableCopy];
  5. //獲取當前觸摸點
  6. UITouch?*touch?=?[touches?anyObject];
  7. CGPoint?point?=?[touch?locationInView:self];
  8. //將點放進數組中
  9. NSValue?*value?=?[NSValue?valueWithCGPoint:point];
  10. [self.points?addObject:value];
  11. }

然后再重寫touchesMove:方法,在該方法中繼續獲取手指的當前觸摸點,并將觸摸點存儲到points數組中,代碼如下所示:

  1. -?(void)touchesMoved:(NSSet?*)touches?withEvent:(UIEvent?*)event
  2. {
  3. //獲取當前觸摸點
  4. UITouch?*touch?=?[touches?anyObject];
  5. CGPoint?point?=?[touch?locationInView:self];
  6. //將點放進數組中
  7. NSValue?*value?=?[NSValue?valueWithCGPoint:point];
  8. [self.points?addObject:value];
  9. }

步驟三:重寫drawRect方法,進行屏幕繪制

在TRDrawView類中重寫drawRect方法,該方法中根據手指的觸摸軌跡points進行屏幕繪制,代碼如下所示:

  1. -?(void)drawRect:(CGRect)rect
  2. {
  3. UIBezierPath?*path?=?[UIBezierPath?bezierPath];
  4. NSValue?*value?=?[self.points?firstObject];
  5. [path?moveToPoint:[value?CGPointValue]];
  6. for?(NSValue?*value?in?self.points)?{
  7. [path?addLineToPoint:[value?CGPointValue]];
  8. }
  9. path.lineWidth?=?4;
  10. [[UIColor?redColor]setStroke];
  11. [path?stroke];
  12. }

最后要在touchesMoved:和touchesEnded:方法中調用setNeedDisplay刷新界面,代碼如下所示:

  1. -?(void)touchesMoved:(NSSet?*)touches?withEvent:(UIEvent?*)event
  2. {
  3. //獲取當前觸摸點
  4. UITouch?*touch?=?[touches?anyObject];
  5. CGPoint?point?=?[touch?locationInView:self];
  6. //將點放進數組中
  7. NSValue?*value?=?[NSValue?valueWithCGPoint:point];
  8. [self.points?addObject:value];
  9. //刷新界面
  10. [self?setNeedsDisplay];
  11. }
  12. -?(void)touchesEnded:(NSSet?*)touches?withEvent:(UIEvent?*)event
  13. {
  14. [self?setNeedsDisplay];
  15. }

1.4 完整代碼

本案例中,TRDrawView.m文件中的完整代碼如下所示:

代碼

2 使用純代碼進行界面布局

2.1 問題

純代碼布局就是重寫布局方法viewDidLayoutSubviews,在該方法內部計算每個子視圖的frame屬性。本案例將學習如何使用純代碼進行布局,使界面上的Button和Label控件始終保持在固定的位置,如圖-3、圖-4所示:

圖-3

圖-4

2.2 方案

首先創建一個SingleViewApplication項目,將自動布局功能關閉。

在Stroyboard的場景中拖放兩個Button控件和一個Label控件,Button放置在屏幕的上方,并且大小一樣,Label控件放置在屏幕的右下角。

然后在TRViewController類中重寫布局方法viewDidLayoutSubviews,在該方法中根據父視圖的bounds計算Button和Label的frame。

2.3 步驟

實現此案例需要按照如下步驟進行。

步驟一:創建項目,添加控件

首先創建一個SingleViewApplication項目,在右邊欄的檢查器一中將自動布局功能關閉,如圖-5所示:

圖-5

在Stroyboard的場景中拖放兩個Button控件和一個Label控件,Button放置在屏幕的上方,并且大小一樣,Label控件放置在屏幕的右下角,如圖-6所示:

圖-6

步驟二:重寫布局方法viewDidLayoutSubviews,進行界面布局

將Storyboard中的Button控件和Label控件關聯成TRViewController的私有屬性,代碼如下所示:

  1. @interface?TRViewController?()
  2. @property?(weak, nonatomic)?IBOutlet?UIButton?*button1;
  3. @property?(weak, nonatomic)?IBOutlet?UIButton?*button2;
  4. @property?(weak, nonatomic)?IBOutlet?UILabel?*label;
  5. @end

在TRViewController類中重寫布局方法viewDidLayoutSubviews,在該方法中根據父視圖的bounds計算Button和Label的frame,代碼如下所示:

  1. -?(void)viewDidLayoutSubviews
  2. {
  3. [super viewDidLayoutSubviews];
  4. CGFloat?buttonWidth?=?(self.view.bounds.size.width?-?20?-?20?-?10)?*?0.5;
  5. CGRect?frame?=?CGRectMake(20, self.button1.frame.origin.y, buttonWidth,?40);
  6. self.button1.frame?= frame;
  7. frame?=?CGRectMake(self.button1.frame.size.width+30, self.button2.frame.origin.y, buttonWidth,?40);
  8. self.button2.frame?= frame;
  9. frame?= self.label.frame;
  10. self.label.frame?=?CGRectMake(self.view.bounds.size.width-20-frame.size.width, self.view.bounds.size.height-20-frame.size.height, frame.size.width, frame.size.height);
  11. }

2.4 完整代碼

本案例中,TRViewController.m文件中的完整代碼如下所示:

  1. #import?"TRViewController.h"
  2. @interface?TRViewController?()
  3. @property?(weak, nonatomic)?IBOutlet?UIButton?*button1;
  4. @property?(weak, nonatomic)?IBOutlet?UIButton?*button2;
  5. @property?(weak, nonatomic)?IBOutlet?UILabel?*label;
  6. @end
  7. @implementation TRViewController
  8. -?(void)viewDidLayoutSubviews
  9. {
  10. [super viewDidLayoutSubviews];
  11. CGFloat?buttonWidth?=?(self.view.bounds.size.width?-?20?-?20?-?10)?*?0.5;
  12. CGRect?frame?=?CGRectMake(20, self.button1.frame.origin.y, buttonWidth,?40);
  13. self.button1.frame?= frame;
  14. frame?=?CGRectMake(self.button1.frame.size.width+30, self.button2.frame.origin.y, buttonWidth,?40);
  15. self.button2.frame?= frame;
  16. frame?= self.label.frame;
  17. self.label.frame?=?CGRectMake(self.view.bounds.size.width-20-frame.size.width, self.view.bounds.size.height-20-frame.size.height, frame.size.width, frame.size.height);
  18. }
  19. @end
?

3 根據上邊欄和下邊欄的高度進行布局

3.1 問題

從iOS7開始,視圖控制器會滲透到各種Bar下面,包括:NavigationBar、ToolBar、TabBar、StatusBar等;這些Bar會擠占視圖的空間,在布局時就需要根據各種Bar所擠占的空間大小來計算控件的frame,本案例直接在上一個案例的基礎上實現,根據上邊欄和下邊欄的高度對界面進行布局,如圖-7、圖-8所示:

圖-7

圖-8

3.2 方案

首先在上一個案例的基礎上增加一個NavigationController和TabBarController,在界面的中間拖放一個Button控件,標題設置為“隱藏NavigationBar”,并將Button控件關聯成TRViewController的私有方法hideNavigationBar。

然后在TRViewController類中重寫布局方法viewDidLayoutSubviews,在該方法中根據父視圖的bounds和上下邊欄的高度計算Button和Label的frame。

3.3 步驟

實現此案例需要按照如下步驟進行。

步驟一:創建項目,添加按鈕控件

在上一個案例的基礎上增加一個NavigationController和TabBarController,在界面的中間拖放一個Button控件,標題設置為“隱藏NavigationBar”,如圖-9所示:

圖-9

然后將Button控件關聯成TRViewController的私有方法hideNavigationBar,該方法的功能是將導航欄隱藏或顯示,代碼如下所示:

  1. -?(IBAction)hideNavigationBar
  2. {
  3. self.navigationController.navigationBarHidden?=?!self.navigationController.navigationBarHidden;
  4. }

步驟二:重寫布局方法viewDidLayoutSubviews,進行界面布局

在TRViewController類中重寫布局方法viewDidLayoutSubviews,在該方法中根據先通過屬性self.topLayoutGuide.length和self.bottomLayoutGuide.length獲取到上下邊欄的高度,然后再通過父視圖的bounds和上下邊欄的高度計算出Button和Label的frame,代碼如下所示:

  1. -?(void)viewDidLayoutSubviews
  2. {
  3. [super viewDidLayoutSubviews];
  4. CGFloat?buttonWidth?=?(self.view.bounds.size.width?-?20?-?20?-?10)?*?0.5;
  5. //從iOS7開始,可以隨時知道VC的上面和下面被各種Bar占據了多少的空間
  6. CGFloat?top?= self.topLayoutGuide.length;
  7. CGRect?frame?=?CGRectMake(20, top+10, buttonWidth,?40);
  8. self.button1.frame?= frame;
  9. frame.origin.x?+= buttonWidth?+?10;
  10. self.button2.frame?= frame;
  11. //下面的各種Bar(TabBar或ToolBar)占了VC多高的空間
  12. CGFloat?bottom?= self.bottomLayoutGuide.length;
  13. frame?= self.label.frame;
  14. frame?=?CGRectMake(self.view.bounds.size.width?-?20?- frame.size.width?, self.view.bounds.size.height?-?10?- frame.size.height?- bottom, frame.size.width, frame.size.height);
  15. self.label.frame?= frame;
  16. frame?= self.hideButton.frame;
  17. frame.origin.x?= self.view.bounds.size.width?*?0.5?- frame.size.width?*?0.5;
  18. frame.origin.y?= self.view.bounds.size.height?*?0.5?- frame.size.height?*?0.5;
  19. self.hideButton.frame?= frame;
  20. }

3.4 完整代碼

本案例中,TRViewController.m文件中的完整代碼如下所示:

  1. #import?"TRViewController.h"
  2. @interface?TRViewController?()
  3. @property?(weak, nonatomic)?IBOutlet?UIButton?*button1;
  4. @property?(weak, nonatomic)?IBOutlet?UIButton?*button2;
  5. @property?(weak, nonatomic)?IBOutlet?UILabel?*label;
  6. @property?(weak, nonatomic)?IBOutlet?UIButton?*hideButton;
  7. @end
  8. @implementation TRViewController
  9. -?(IBAction)hideNavigationBar
  10. {
  11. self.navigationController.navigationBarHidden?=?!self.navigationController.navigationBarHidden;
  12. }
  13. -?(void)viewDidLayoutSubviews
  14. {
  15. [super viewDidLayoutSubviews];
  16. CGFloat?buttonWidth?=?(self.view.bounds.size.width?-?20?-?20?-?10)?*?0.5;
  17. //從iOS7開始,可以隨時知道VC的上面和下面被各種Bar占據了多少的空間
  18. CGFloat?top?= self.topLayoutGuide.length;
  19. CGRect?frame?=?CGRectMake(20, top+10, buttonWidth,?40);
  20. self.button1.frame?= frame;
  21. frame.origin.x?+= buttonWidth?+?10;
  22. self.button2.frame?= frame;
  23. //下面的各種Bar(TabBar或ToolBar)占了VC多高的空間
  24. CGFloat?bottom?= self.bottomLayoutGuide.length;
  25. frame?= self.label.frame;
  26. frame?=?CGRectMake(self.view.bounds.size.width?-?20?- frame.size.width?, self.view.bounds.size.height?-?10?- frame.size.height?- bottom, frame.size.width, frame.size.height);
  27. self.label.frame?= frame;
  28. frame?= self.hideButton.frame;
  29. frame.origin.x?= self.view.bounds.size.width?*?0.5?- frame.size.width?*?0.5;
  30. frame.origin.y?= self.view.bounds.size.height?*?0.5?- frame.size.height?*?0.5;
  31. self.hideButton.frame?= frame;
  32. }
  33. @end

4 演示繪制圖形的布局

4.1 問題

使用純代碼布局并且AutoLayout關閉的狀態下,在drawRect方法中繪制的圖形,在視圖大小發生變化時圖形會失真,本案例學習繪制圖形的布局如圖-10,圖-11所示:

圖-10

圖-11

4.2 方案

首先在創建好的項目中將自動布局功能關閉,再創建一個TRView類,繼承至UIView。

其次在Stroyboard的場景中拖放一個View控件,和屏幕一樣大小,然后將View的類型修改為TRView。

然后在TRView類中重寫drawRect方法,在屏幕左上方繪制一個三角形。

最后將TRView的contentMode屬性設置成Redraw,即可實現繪制的布局,屏幕切換或者變化繪制的圖形也不會失真。

4.3 步驟

實現此案例需要按照如下步驟進行。

步驟一:創建TRView類,繪制圖像

首先在創建好的項目中將自動布局功能關閉,創建一個TRView類,繼承至UIView,用于繪制圖形。在Storyboard中拖放一個View控件,和屏幕同等大小,并將View的類型修改為TRView,如圖-12所示:

圖-12

然后將View控件關聯成TRViewController的私有屬性myView,代碼如下所示:

  1. @interface?TRViewController?()
  2. @property?(weak, nonatomic)?IBOutlet?TRView?*myView;
  3. @end

最后在TRView類中重寫drawRect方法,在屏幕左上方繪制一個三角形,代碼如下所示:

  1. -?(void)drawRect:(CGRect)rect
  2. {
  3. UIBezierPath?*path?=?[UIBezierPath?bezierPath];
  4. [path?moveToPoint:CGPointMake(20,?20)];
  5. [path?addLineToPoint:CGPointMake(20,?120)];
  6. [path?addLineToPoint:CGPointMake(120,?20)];
  7. [path?closePath];
  8. path.lineWidth?=?4;
  9. [[UIColor?redColor] setStroke];
  10. [path?stroke];
  11. }

步驟二:進行繪制布局

完成繪制代碼,運行程序可見屏幕左上方有一個三角形,但是當切換成橫屏時發現三角形失真,如圖-13所示:

圖-13

解決的辦法是,當視圖大小發生變化時,進行重新繪制圖形,即在布局方法viewDidLayoutSubviews里面調用setNeedDisplay方法即可,代碼如下所示:

  1. -?(void)viewDidLayoutSubviews
  2. {
  3. [super viewDidLayoutSubviews];
  4. [self.myView?setNeedsDisplay];
  5. }

但是通常直接將myView的contentMode屬性設置為Redraw即可實現繪制布局,相當于調用了上面的代碼,將myView的contentMode屬性設置為Redraw有兩個方法,第一種可以直接通過代碼設置,代碼如下所示:

  1. -?(void)viewDidLoad
  2. {
  3. [super viewDidLoad];
  4. self.myView.contentMode?= UIViewContentModeRedraw;
  5. }

第二種方法可以直接在Stroyboard中設置,右邊欄的檢查器四中將Mode選項設置為Redraw即可,如圖-14所示:

圖-14

將contentMode設置為Redraw之后就不需要再寫布局代碼,此時切換屏幕繪制圖形就不會失真了。

4.4 完整代碼

本案例中,TRViewController.m文件中的完整代碼如下所示:

  1. #import?"TRViewController.h"
  2. #import?"TRView.h"
  3. @interface?TRViewController?()
  4. @property?(weak, nonatomic)?IBOutlet?TRView?*myView;
  5. @end
  6. @implementation TRViewController
  7. -?(void)viewDidLoad
  8. {
  9. [super viewDidLoad];
  10. self.myView.contentMode?= UIViewContentModeRedraw;
  11. }
  12. //- (void)viewDidLayoutSubviews
  13. //{
  14. // [super viewDidLayoutSubviews];
  15. // [self.myView setNeedsDisplay];
  16. //}
  17. @end
?

本案例中,TRView.m文件中的完整代碼如下所示:

  1. #import?"TRView.h"
  2. @implementation TRView
  3. -?(void)drawRect:(CGRect)rect
  4. {
  5. UIBezierPath?*path?=?[UIBezierPath?bezierPath];
  6. [path?moveToPoint:CGPointMake(20,?20)];
  7. [path?addLineToPoint:CGPointMake(20,?120)];
  8. [path?addLineToPoint:CGPointMake(120,?20)];
  9. [path?closePath];
  10. path.lineWidth?=?4;
  11. [[UIColor?redColor] setStroke];
  12. [path?stroke];
  13. }
  14. @end
?

5 對樂庫項目的播放列表單元格進行布局

5.1 問題

視圖自身也可以使用布局方法layoutSubviews對自己的子視圖進行布局,本案例使用視圖的layoutSubviews方法給樂庫項目的播放列表單元格進行布局,如圖-15所示:

圖-15

5.2 方案

首先創建一個SingleViewApplication項目,將Xcode自帶的TRViewController類刪除,創建一個TRMusicsTableViewController類,繼承至UITableViewController,該類有一個NSArray類型的屬性musics用于存儲歌曲數據源。

再將Storyboard中自帶的場景刪除,拖放一個TableViewController到界面中,嵌入一個NavigaitionController。在右邊欄的檢查器中將TableViewController設置為動態表視圖,并和TRMusicsTableViewController類進行綁定。

其次創建一個帶有xib的TRMusicCell類,繼承至UITableViewCell,在xib文件中進行自定義cell,往cell的contentView視圖上拖放所需要的控件。

首先在cell的上方拖放一個Label控件,用于顯示歌曲的名字。在cell的下方依次拖放兩個ImageView控件和兩個Label控件,兩個ImageView控件分別用于表示歌曲是否為本地歌曲和是否高清。兩個Label控件分別用于顯示歌曲的信息和時長。

調整好cell上面各個控件的大小,將個控件關聯為TRMusicCell的屬性musicNameLabel、albumAndArtistLabel、durationLabel、downloadedImageView以及hdImageView。

然后再創建一個TRMusic類用于存儲歌曲的相關信息,該類繼承至NSObject,有五個屬性,分別為:

NSString類型的name,用于記錄歌曲名稱;

NSString類型的album,用于記錄歌曲所屬專輯;

NSString類型的artist,用于記錄歌曲的演唱者;

NSString類型的duration,用于記錄歌曲的時長;

BOOL類型的highQuality和downloaded,分別用于記錄是否高清和是否本地下載。

我們創建一個TRMusicGroup類,用于生成一組模擬的歌曲數據。

最后在TRMusicCell類中定義一個TRMusic類型屬性music,用于存儲單元格需要展示的歌曲。重寫layoutSubviews方法,進行cell的界面布局,該方法中會根據每首歌曲的信息,計算子視圖的frame進行布局。

在TRMusicTableViewController類注冊Cell,回答三問給表視圖加載歌曲數據。

5.3 步驟

實現此案例需要按照如下步驟進行。

步驟一:創建播放列表項目

首先創建一個SingleViewApplication項目,將Xcode自帶的TRViewController類刪除,創建一個TRMusicsTableViewController類,繼承至UITableViewController,該類有一個NSArray類型的屬性musics用于存儲歌曲數據源,代碼如下所示:

  1. @interface?TRMusicTableViewController?: UITableViewController
  2. @property?(strong, nonatomic)?NSArray?*musics;
  3. @end

然后將Storyboard中自帶的場景刪除,拖放一個TableViewController到界面中,嵌入一個NavigaitionController。在右邊欄的檢查器中將TableViewController設置為動態表視圖,并和TRMusicsTableViewController類進行綁定,如圖-16所示:

圖-16

為了能更靈活的使用自定義cell,由于本案例使用xib的方式進行自定義cell,所以將Storyboard中表視圖自帶的cell對象刪除,如圖-17所示:

圖-17

步驟二:創建TRMusicCell類,自定義Cell

首先創建一個帶有xib的TRMusicCell類,繼承至UITableViewCell,在xib文件中進行自定義cell,往cell的contentView視圖上拖放所需要的控件。

先在cell的上方拖放一個Label控件,用于顯示歌曲的名字。

再在cell的下方依次拖放兩個ImageView控件和兩個Label控件,兩個ImageView控件分別用于表示歌曲是否為本地歌曲和是否高清。兩個Label控件分別用于顯示歌曲的信息和時長。

設置好cell上面各個控件的大小和屬性,如圖-18所示:

圖-18

最后將cell上的各個控件關聯為TRMusicCell的屬性musicNameLabel、albumAndArtistLabel、durationLabel、downloadedImageView以及hdImageView,代碼如下所示:

  1. @interface?TRMusicCell?()
  2. @property?(weak, nonatomic)?IBOutlet?UILabel?*musicNameLabel;
  3. @property?(weak, nonatomic)?IBOutlet?UILabel?*albumAndArtistLabel;
  4. @property?(weak, nonatomic)?IBOutlet?UILabel?*durationLabel;
  5. @property?(weak, nonatomic)?IBOutlet?UIImageView?*downloadedImageView;
  6. @property?(weak, nonatomic)?IBOutlet?UIImageView?*hdImageView;
  7. @end

步驟三:創建TRMusic類和歌曲模擬數據

首先創建一個TRMusic類用于存儲歌曲的相關信息,該類繼承至NSObject,有五個屬性,分別為:

NSString類型的name,用于記錄歌曲名稱;

NSString類型的album,用于記錄歌曲所屬專輯;

NSString類型的artist,用于記錄歌曲的演唱者;

NSString類型的duration,用于記錄歌曲的時長;

BOOL類型的highQuality和downloaded,分別用于記錄是否高清和是否本地下載。

代碼如下所示:

  1. @interface?TRMusic?: NSObject
  2. @property?(nonatomic, copy) NSString?* name;
  3. @property?(nonatomic, copy) NSString?* album;
  4. @property?(nonatomic, copy) NSString?* artist;
  5. @property?(nonatomic)?NSTimeInterval?duration;
  6. @property?(nonatomic)?BOOL?highQuality;
  7. @property?(nonatomic)?BOOL?downloaded;
  8. @end

然后再創建一個TRMusicGroup類,該類提供一個靜態方法fakeData,用于生成一組模擬的歌曲數據,代碼如下所示:

  1. +?(NSArray?*) fakeData
  2. {
  3. NSMutableArray?* musics?= nil;
  4. TRMusic?* music?= nil;
  5. musics?=?[NSMutableArray?array];
  6. music?=?[[TRMusic?alloc] init];
  7. music.name?= @"Burn";
  8. music.album?= @"Burn - Single";
  9. music.artist?= @"Ellie Goulding";
  10. music.duration?=?[self?durationWithMinutes:3 andSeconds:51];
  11. music.downloaded?= YES;
  12. music.highQuality?= NO;
  13. [musics?addObject:music];
  14. music?=?[[TRMusic?alloc] init];
  15. music.name?= @"Summertime Sadness (Cedric Gervais Remix)";
  16. music.album?= @"Summertime Sadness (Cedric Gervais Remix) - Single";
  17. music.artist?= @"Lana Del Rey";
  18. music.duration?=?[self?durationWithMinutes:6 andSeconds:52];
  19. music.downloaded?= YES;
  20. music.highQuality?= YES;
  21. [musics?addObject:music];
  22. music?=?[[TRMusic?alloc] init];
  23. music.name?= @"Spectrum";
  24. music.album?= @"Clarity";
  25. music.artist?= @"Zedd";
  26. music.duration?=?[self?durationWithMinutes:4 andSeconds:3];
  27. music.downloaded?= YES;
  28. music.highQuality?= YES;
  29. [musics?addObject:music];
  30. music?=?[[TRMusic?alloc] init];
  31. music.name?= @"It's Time";
  32. music.album?= @"It’s Time";
  33. music.artist?= @"Imagine Dragons";
  34. music.duration?=?[self?durationWithMinutes:4 andSeconds:0];
  35. music.downloaded?= NO;
  36. music.highQuality?= YES;
  37. [musics?addObject:music];
  38. music?=?[[TRMusic?alloc] init];
  39. music.name?= @"Dancing in The Moonlight";
  40. music.album?= @"Dancing In The Moonlight: The Best Of Toploader";
  41. music.artist?= @"Toploader";
  42. music.duration?=?[self?durationWithMinutes:3 andSeconds:53];
  43. music.downloaded?= YES;
  44. music.highQuality?= YES;
  45. [musics?addObject:music];
  46. music?=?[[TRMusic?alloc] init];
  47. music.name?= @"Thinking About You (feat. Ayah Marar)";
  48. music.album?= @"18 Months (Deluxe Edition)";
  49. music.artist?= @"Calvin Harris";
  50. music.duration?=?[self?durationWithMinutes:4 andSeconds:8];
  51. music.downloaded?= YES;
  52. music.highQuality?= YES;
  53. [musics?addObject:music];
  54. music?=?[[TRMusic?alloc] init];
  55. music.name?= @"You Make Me (feat. Salem Al Fakir)";
  56. music.album?= @"True";
  57. music.artist?= @"Avicii";
  58. music.duration?=?[self?durationWithMinutes:3 andSeconds:51];
  59. music.downloaded?= YES;
  60. music.highQuality?= NO;
  61. [musics?addObject:music];
  62. music?=?[[TRMusic?alloc] init];
  63. music.name?= @"Safe and Sound";
  64. music.album?= @"Capital Cities EP";
  65. music.artist?= @"Capital Cities";
  66. music.duration?=?[self?durationWithMinutes:3 andSeconds:51];
  67. music.downloaded?= YES;
  68. music.highQuality?= NO;
  69. [musics?addObject:music];
  70. music?=?[[TRMusic?alloc] init];
  71. music.name?= @"Reaching Out";
  72. music.album?= @"Welcome Reality (Deluxe Version)";
  73. music.artist?= @"nero";
  74. music.duration?=?[self?durationWithMinutes:3 andSeconds:51];
  75. music.downloaded?= YES;
  76. music.highQuality?= NO;
  77. [musics?addObject:music];
  78. music?=?[[TRMusic?alloc] init];
  79. music.name?= @"Recover";
  80. music.album?= @"Recover - EP";
  81. music.artist?= @"CHVRCHES";
  82. music.duration?=?[self?durationWithMinutes:3 andSeconds:51];
  83. music.downloaded?= YES;
  84. music.highQuality?= NO;
  85. [musics?addObject:music];
  86. music?=?[[TRMusic?alloc] init];
  87. music.name?= @"Hold On, We're Going Home (feat. Majid Jordan)";
  88. music.album?= @"Hold On, We're Going Home (feat. Majid Jordan) - Single";
  89. music.artist?= @"Drake";
  90. music.duration?=?[self?durationWithMinutes:3 andSeconds:51];
  91. music.downloaded?= YES;
  92. music.highQuality?= NO;
  93. [musics?addObject:music];
  94. music?=?[[TRMusic?alloc] init];
  95. music.name?= @"The Mother We Share";
  96. music.album?= @"The Mother We Share - Single";
  97. music.artist?= @"CHVRCHES";
  98. music.duration?=?[self?durationWithMinutes:3 andSeconds:51];
  99. music.downloaded?= YES;
  100. music.highQuality?= NO;
  101. [musics?addObject:music];
  102. music?=?[[TRMusic?alloc] init];
  103. music.name?= @"Promises";
  104. music.album?= @"nero";
  105. music.artist?= @"Promises - EP";
  106. music.duration?=?[self?durationWithMinutes:3 andSeconds:51];
  107. music.downloaded?= YES;
  108. music.highQuality?= NO;
  109. [musics?addObject:music];
  110. music?=?[[TRMusic?alloc] init];
  111. music.name?= @"Alone Together";
  112. music.album?= @"Save Rock and Roll";
  113. music.artist?= @"Fall Out Boy";
  114. music.duration?=?[self?durationWithMinutes:3 andSeconds:51];
  115. music.downloaded?= YES;
  116. music.highQuality?= NO;
  117. [musics?addObject:music];
  118. music?=?[[TRMusic?alloc] init];
  119. music.name?= @"Reload (Radio Edit)";
  120. music.album?= @"Reload (Radio Edit) - Single";
  121. music.artist?= @"Sebastian Ingrosso";
  122. music.duration?=?[self?durationWithMinutes:3 andSeconds:51];
  123. music.downloaded?= YES;
  124. music.highQuality?= NO;
  125. [musics?addObject:music];
  126. music?=?[[TRMusic?alloc] init];
  127. music.name?= @"I Love It (feat. Charli XCX)";
  128. music.album?= @"Iconic";
  129. music.artist?= @"Icona Pop";
  130. music.duration?=?[self?durationWithMinutes:3 andSeconds:51];
  131. music.downloaded?= YES;
  132. music.highQuality?= NO;
  133. [musics?addObject:music];
  134. music?=?[[TRMusic?alloc] init];
  135. music.name?= @"Feel the Love";
  136. music.album?= @"Feel the Love (feat. John Newman) [Remixes] - EP";
  137. music.artist?= @"Rudimental";
  138. music.duration?=?[self?durationWithMinutes:3 andSeconds:51];
  139. music.downloaded?= YES;
  140. music.highQuality?= NO;
  141. [musics?addObject:music];
  142. music?=?[[TRMusic?alloc] init];
  143. music.name?= @"Goin' Crazy (feat. Robbie Williams)";
  144. music.album?= @"Goin' Crazy (feat. Robbie Williams) - Single";
  145. music.artist?= @"Dizzee Rascal";
  146. music.duration?=?[self?durationWithMinutes:3 andSeconds:51];
  147. music.downloaded?= YES;
  148. music.highQuality?= NO;
  149. [musics?addObject:music];
  150. music?=?[[TRMusic?alloc] init];
  151. music.name?= @"Still Into You";
  152. music.album?= @"Paramore";
  153. music.artist?= @"Paramore";
  154. music.duration?=?[self?durationWithMinutes:3 andSeconds:51];
  155. music.downloaded?= YES;
  156. music.highQuality?= NO;
  157. [musics?addObject:music];
  158. music?=?[[TRMusic?alloc] init];
  159. music.name?= @"Heart Attack";
  160. music.album?= @"Demi";
  161. music.artist?= @"Demi Lovato";
  162. music.duration?=?[self?durationWithMinutes:3 andSeconds:51];
  163. music.downloaded?= YES;
  164. music.highQuality?= NO;
  165. [musics?addObject:music];
  166. music?=?[[TRMusic?alloc] init];
  167. music.name?= @"Explosions";
  168. music.album?= @"Halcyon (Deluxe Edition)";
  169. music.artist?= @"Ellie Goulding";
  170. music.duration?=?[self?durationWithMinutes:3 andSeconds:51];
  171. music.downloaded?= YES;
  172. music.highQuality?= NO;
  173. [musics?addObject:music];
  174. music?=?[[TRMusic?alloc] init];
  175. music.name?= @"I Need Your Love (feat. Ellie Goulding)";
  176. music.album?= @"I Need Your Love";
  177. music.artist?= @"Calvin Harris";
  178. music.duration?=?[self?durationWithMinutes:3 andSeconds:51];
  179. music.downloaded?= YES;
  180. music.highQuality?= NO;
  181. [musics?addObject:music];
  182. music?=?[[TRMusic?alloc] init];
  183. music.name?= @"Starry Eyed";
  184. music.album?= @"Bright Lights";
  185. music.artist?= @"Ellie Goulding";
  186. music.duration?=?[self?durationWithMinutes:3 andSeconds:51];
  187. music.downloaded?= YES;
  188. music.highQuality?= NO;
  189. [musics?addObject:music];
  190. music?=?[[TRMusic?alloc] init];
  191. music.name?= @"Lights (Single Version)";
  192. music.album?= @"Bright Lights";
  193. music.artist?= @"Ellie Goulding";
  194. music.duration?=?[self?durationWithMinutes:3 andSeconds:51];
  195. music.downloaded?= YES;
  196. music.highQuality?= NO;
  197. [musics?addObject:music];
  198. music?=?[[TRMusic?alloc] init];
  199. music.name?= @"Who's That Chick?";
  200. music.album?= @"Who's That Chick - Single";
  201. music.artist?= @"David Guetta";
  202. music.duration?=?[self?durationWithMinutes:2 andSeconds:47];
  203. music.downloaded?= YES;
  204. music.highQuality?= NO;
  205. [musics?addObject:music];
  206. TRMusicGroup?* g1?=?[[TRMusicGroup?alloc] init];
  207. g1.name?= @"國外單曲";
  208. g1.musics?=?[musics?copy];
  209. g1.state?= TRMusicGroupStateDownloaded;
  210. musics?=?[NSMutableArray?array];
  211. music?=?[[TRMusic?alloc] init];
  212. music.name?= @"致青春";
  213. music.album?= @"致青春";
  214. music.artist?= @"王菲";
  215. music.duration?=?[self?durationWithMinutes:3 andSeconds:18];
  216. music.downloaded?= NO;
  217. music.highQuality?= NO;
  218. [musics?addObject:music];
  219. music?=?[[TRMusic?alloc] init];
  220. music.name?= @"好漢歌";
  221. music.album?= @"六十年代生人";
  222. music.artist?= @"劉歡";
  223. music.duration?=?[self?durationWithMinutes:3 andSeconds:41];
  224. music.downloaded?= NO;
  225. music.highQuality?= YES;
  226. [musics?addObject:music];
  227. music?=?[[TRMusic?alloc] init];
  228. music.name?= @"忐忑";
  229. music.album?= @"自由鳥";
  230. music.artist?= @"龔琳娜";
  231. music.duration?=?[self?durationWithMinutes:4 andSeconds:03];
  232. music.downloaded?= NO;
  233. music.highQuality?= YES;
  234. [musics?addObject:music];
  235. music?=?[[TRMusic?alloc] init];
  236. music.name?= @"愛情買賣";
  237. music.album?= @"我們的愛我不放手";
  238. music.artist?= @"慕容曉曉";
  239. music.duration?=?[self?durationWithMinutes:3 andSeconds:31];
  240. music.downloaded?= NO;
  241. music.highQuality?= YES;
  242. [musics?addObject:music];
  243. music?=?[[TRMusic?alloc] init];
  244. music.name?= @"法海你不懂愛";
  245. music.album?= @"法海你不懂愛 - 單曲";
  246. music.artist?= @"龔琳娜";
  247. music.duration?=?[self?durationWithMinutes:3 andSeconds:33];
  248. music.downloaded?= NO;
  249. music.highQuality?= NO;
  250. [musics?addObject:music];
  251. music?=?[[TRMusic?alloc] init];
  252. music.name?= @"最炫民族風";
  253. music.album?= @"我們的愛我不放手";
  254. music.artist?= @"鳳凰傳奇";
  255. music.duration?=?[self?durationWithMinutes:4 andSeconds:46];
  256. music.downloaded?= NO;
  257. music.highQuality?= YES;
  258. [musics?addObject:music];
  259. music?=?[[TRMusic?alloc] init];
  260. music.name?= @"金箍棒";
  261. music.album?= @"金箍棒 - 單曲";
  262. music.artist?= @"龔琳娜";
  263. music.duration?=?[self?durationWithMinutes:2 andSeconds:52];
  264. music.downloaded?= NO;
  265. music.highQuality?= NO;
  266. [musics?addObject:music];
  267. TRMusicGroup?* g2?=?[[TRMusicGroup?alloc] init];
  268. g2.name?= @"國內神曲";
  269. g2.musics?=?[musics?copy];
  270. g2.state?= TRMusicGroupStateNormal;
  271. TRMusicGroup?* g3?=?[[TRMusicGroup?alloc] init];
  272. g3.name?= @"Calvin Harris 專輯";
  273. g3.musics?= @[];
  274. g3.state?= TRMusicGroupStateNormal;
  275. TRMusicGroup?* g4?=?[[TRMusicGroup?alloc] init];
  276. g4.name?= @"Ellie Gounding 專輯";
  277. g4.musics?= @[];
  278. g4.state?= TRMusicGroupStateNormal;
  279. return @[g1, g2, g3, g4];
  280. }

步驟四:進行自定義cell布局

首先在TRMusicTableViewController類注冊Cell,并在TRAppDelegate中對屬性musics進行初始化,獲取到模擬的歌曲數據,代碼如下所示:

  1. //在TRAppDelegate中進行musics屬性的初始化
  2. -(BOOL)application:(UIApplication?*)application?
  3. didFinishLaunchingWithOptions:(NSDictionary?*)launchOptions
  4. {
  5. NSArray?*musicGroups?=?[TRMusicGroup?fakeData];
  6. TRMusicGroup?*group?= musicGroups[0];
  7. UINavigationController?*navi?=?(UINavigationController?*)self.window.rootViewController;
  8. TRMusicTableViewController?*musicTVC?=?(TRMusicTableViewController?*) navi.topViewController;
  9. musicTVC.musics?= group.musics;
  10. return YES;
  11. }
  12. //在TRMusicsTableViewController中注冊cell
  13. -?(void)viewDidLoad
  14. {
  15. [super viewDidLoad];
  16. [self.tableView?registerNib:[UINib?nibWithNibName: @"TRMusicCell" bundle:nil] forCellReuseIdentifier:musicCellIdentifier];
  17. }

然后在TRMusicCell類中定義一個TRMusic類型屬性music,用于存儲單元格需要展示的歌曲,代碼如下所示:

  1. //TRMusicCell.h文件中定義屬性music
  2. @interface?TRMusicCell?: UITableViewCell
  3. @property?(strong, nonatomic)?TRMusic?*music;
  4. @end

在TRMusicCell重寫layoutSubviews方法,進行cell的界面布局,該方法中會根據每首歌曲的信息,計算子視圖的frame進行布局,代碼如下所示:

  1. -?(void)layoutSubviews
  2. {
  3. [super layoutSubviews];
  4. CGFloat?x?= self.downloadedImageView.frame.origin.x;
  5. if?(self.music.downloaded){
  6. x?+=?20;
  7. }
  8. if?(self.music.highQuality)?{
  9. CGRect?frame?= self.hdImageView.frame;
  10. frame.origin.x?= x;
  11. self.hdImageView.frame?= frame;
  12. x?+=?20;
  13. }
  14. CGRect?frame?= self.albumAndArtistLabel.frame;
  15. frame.origin.x?= x;
  16. self.albumAndArtistLabel.frame?= frame;
  17. }

歌曲的高清和下載圖標需要根據歌曲的相關信息進行顯示,可以將此部分功能通過重寫music的setter方法來實現,代碼如下所示:

  1. //TRMusicCell.m文件候中重寫music的setter方法
  2. -?(void)setMusic:(TRMusic?*)music
  3. {
  4. _music?= music;
  5. self.musicNameLabel.text?= music.name;
  6. self.albumAndArtistLabel.text?=?[NSString?stringWithFormat:@"%@ - %@", music.album, music.artist];
  7. self.durationLabel.text?=?[NSString?stringWithFormat:@"%d:%02d",?(int)music.duration/60,?(int)music.duration%60];
  8. self.downloadedImageView.hidden?=?!music.downloaded;
  9. self.hdImageView.hidden?=?!music.highQuality;
  10. //根據是否高清或下載狀態,需要重新布局
  11. [self?setNeedsLayout];?
  12. }

最后在TRMusicsTableViewController類中回答三問給表視圖加載歌曲數據,并將單元格的行高設置為50,代碼如下所示:

  1. -(NSInteger)tableView:(UITableView?*)tableView?
  2. numberOfRowsInSection:(NSInteger)section
  3. {
  4. return self.musics.count;
  5. }
  6. -(UITableViewCell?*)tableView:(UITableView?*)tableView?
  7. cellForRowAtIndexPath:(NSIndexPath?*)indexPath
  8. {
  9. TRMusicCell?*cell?=?[tableView?dequeueReusableCellWithIdentifier:musicCellIdentifier?forIndexPath:indexPath];
  10. cell.music?= self.musics[indexPath.row];
  11. return cell;
  12. }
  13. -(CGFloat)tableView:(UITableView?*)tableView?
  14. heightForRowAtIndexPath:(NSIndexPath?*)indexPath
  15. {
  16. return?50;
  17. }

5.4 完整代碼

本案例中,TRAppDelegate.m文件中的完整代碼如下所示:

  1. #import?"TRAppDelegate.h"
  2. #import?"TRMusicGroup.h"
  3. #import?"TRMusicTableViewController.h"
  4. @implementation TRAppDelegate
  5. -(BOOL)application:(UIApplication?*)application?
  6. didFinishLaunchingWithOptions:(NSDictionary?*)launchOptions
  7. {
  8. NSArray?*musicGroups?=?[TRMusicGroup?fakeData];
  9. TRMusicGroup?*group?= musicGroups[0];
  10. UINavigationController?*navi?=?(UINavigationController?*)self.window.rootViewController;
  11. TRMusicTableViewController?*musicTVC?=?(TRMusicTableViewController?*) navi.topViewController;
  12. musicTVC.musics?= group.musics;
  13. return YES;
  14. }
  15. @end
?

本案例中,TRMusicTableViewController.h文件中的完整代碼如下所示:

  1. #import?<UIKit/UIKit.h>
  2. @interface?TRMusicTableViewController?: UITableViewController
  3. @property?(strong, nonatomic)?NSArray?*musics;
  4. @end
?

本案例中,TRMusicCell.h文件中的完整代碼如下所示:

  1. #import?<UIKit/UIKit.h>
  2. #import?"TRMusic.h"
  3. @interface?TRMusicCell?: UITableViewCell
  4. @property?(strong, nonatomic)?TRMusic?*music;
  5. @end
?

本案例中,TRMusicCell.m文件中的完整代碼如下所示:

  1. #import?"TRMusicCell.h
  2. @interface TRMusicCell ()
  3. @property (weak, nonatomic) IBOutlet UILabel *musicNameLabel;
  4. @property (weak, nonatomic) IBOutlet UILabel *albumAndArtistLabel;
  5. @property (weak, nonatomic) IBOutlet UILabel *durationLabel;
  6. @property (weak, nonatomic) IBOutlet UIImageView *downloadedImageView;
  7. @property (weak, nonatomic) IBOutlet UIImageView *hdImageView;
  8. @end
  9. @implementation TRMusicCell
  10. - (void)setMusic:(TRMusic *)music
  11. {
  12. _music = music;
  13. self.musicNameLabel.text = music.name;
  14. self.albumAndArtistLabel.text = [NSString stringWithFormat:@"%@?-?%@", music.album, music.artist];
  15. self.durationLabel.text = [NSString stringWithFormat:@"%d:%02d", (int)music.duration/60, (int)music.duration%60];
  16. self.downloadedImageView.hidden = !music.downloaded;
  17. self.hdImageView.hidden = !music.highQuality;
  18. [self setNeedsLayout];//需要重新布局
  19. }
  20. //當當前視圖的大小發生變化時調用
  21. - (void)layoutSubviews
  22. {
  23. [super layoutSubviews];
  24. CGFloat x = self.downloadedImageView.frame.origin.x;
  25. if (self.music.downloaded){
  26. x += 20;
  27. }
  28. if (self.music.highQuality) {
  29. CGRect frame = self.hdImageView.frame;
  30. frame.origin.x = x;
  31. self.hdImageView.frame = frame;
  32. x += 20;
  33. }
  34. CGRect frame = self.albumAndArtistLabel.frame;
  35. frame.origin.x = x;
  36. self.albumAndArtistLabel.frame = frame;
  37. }
  38. @end
?

本案例中,TRMusic.h文件中的完整代碼如下所示:

  1. #import?<Foundation/Foundation.h>
  2. @interface?TRMusic?: NSObject
  3. @property?(nonatomic, copy) NSString?* name;
  4. @property?(nonatomic, copy) NSString?* album;
  5. @property?(nonatomic, copy) NSString?* artist;
  6. @property?(nonatomic)?NSTimeInterval?duration;
  7. @property?(nonatomic)?BOOL?highQuality;
  8. @property?(nonatomic)?BOOL?downloaded;
  9. @end
隱藏

本案例中,TRMusicGroup.h文件中的完整代碼如下所示:

  1. #import?<Foundation/Foundation.h>
  2. #import?"TRMusic.h"
  3. typedef?NS_ENUM(NSInteger, TRMusicGroupState)?{
  4. TRMusicGroupStateNormal,????
  5. TRMusicGroupStateDownloading,????????
  6. TRMusicGroupStateDownloaded
  7. };
  8. @interface?TRMusicGroup?: NSObject
  9. @property?(nonatomic, copy) NSString?* name;
  10. @property?(nonatomic, strong) NSArray?* musics;
  11. @property?(nonatomic)?TRMusicGroupState?state;
  12. +?(NSArray?*) fakeData;
  13. @end
?

本案例中,TRMusicGroup.m文件中的完整代碼如下所示:

  1. #import?"TRMusicGroup.h"
  2. @implementation TRMusicGroup
  3. +?(NSArray?*) fakeData
  4. {
  5. NSMutableArray?* musics?= nil;
  6. TRMusic?* music?= nil;
  7. musics?=?[NSMutableArray?array];
  8. music?=?[[TRMusic?alloc] init];
  9. music.name?= @"Burn";
  10. music.album?= @"Burn - Single";
  11. music.artist?= @"Ellie Goulding";
  12. music.duration?=?[self?durationWithMinutes:3 andSeconds:51];
  13. music.downloaded?= YES;
  14. music.highQuality?= NO;
  15. [musics?addObject:music];
  16. music?=?[[TRMusic?alloc] init];
  17. music.name?= @"Summertime Sadness (Cedric Gervais Remix)";
  18. music.album?= @"Summertime Sadness (Cedric Gervais Remix) - Single";
  19. music.artist?= @"Lana Del Rey";
  20. music.duration?=?[self?durationWithMinutes:6 andSeconds:52];
  21. music.downloaded?= YES;
  22. music.highQuality?= YES;
  23. [musics?addObject:music];
  24. music?=?[[TRMusic?alloc] init];
  25. music.name?= @"Spectrum";
  26. music.album?= @"Clarity";
  27. music.artist?= @"Zedd";
  28. music.duration?=?[self?durationWithMinutes:4 andSeconds:3];
  29. music.downloaded?= YES;
  30. music.highQuality?= YES;
  31. [musics?addObject:music];
  32. music?=?[[TRMusic?alloc] init];
  33. music.name?= @"It's Time";
  34. music.album?= @"It’s Time";
  35. music.artist?= @"Imagine Dragons";
  36. music.duration?=?[self?durationWithMinutes:4 andSeconds:0];
  37. music.downloaded?= NO;
  38. music.highQuality?= YES;
  39. [musics?addObject:music];
  40. music?=?[[TRMusic?alloc] init];
  41. music.name?= @"Dancing in The Moonlight";
  42. music.album?= @"Dancing In The Moonlight: The Best Of Toploader";
  43. music.artist?= @"Toploader";
  44. music.duration?=?[self?durationWithMinutes:3 andSeconds:53];
  45. music.downloaded?= YES;
  46. music.highQuality?= YES;
  47. [musics?addObject:music];
  48. music?=?[[TRMusic?alloc] init];
  49. music.name?= @"Thinking About You (feat. Ayah Marar)";
  50. music.album?= @"18 Months (Deluxe Edition)";
  51. music.artist?= @"Calvin Harris";
  52. music.duration?=?[self?durationWithMinutes:4 andSeconds:8];
  53. music.downloaded?= YES;
  54. music.highQuality?= YES;
  55. [musics?addObject:music];
  56. music?=?[[TRMusic?alloc] init];
  57. music.name?= @"You Make Me (feat. Salem Al Fakir)";
  58. music.album?= @"True";
  59. music.artist?= @"Avicii";
  60. music.duration?=?[self?durationWithMinutes:3 andSeconds:51];
  61. music.downloaded?= YES;
  62. music.highQuality?= NO;
  63. [musics?addObject:music];
  64. music?=?[[TRMusic?alloc] init];
  65. music.name?= @"Safe and Sound";
  66. music.album?= @"Capital Cities EP";
  67. music.artist?= @"Capital Cities";
  68. music.duration?=?[self?durationWithMinutes:3 andSeconds:51];
  69. music.downloaded?= YES;
  70. music.highQuality?= NO;
  71. [musics?addObject:music];
  72. music?=?[[TRMusic?alloc] init];
  73. music.name?= @"Reaching Out";
  74. music.album?= @"Welcome Reality (Deluxe Version)";
  75. music.artist?= @"nero";
  76. music.duration?=?[self?durationWithMinutes:3 andSeconds:51];
  77. music.downloaded?= YES;
  78. music.highQuality?= NO;
  79. [musics?addObject:music];
  80. music?=?[[TRMusic?alloc] init];
  81. music.name?= @"Recover";
  82. music.album?= @"Recover - EP";
  83. music.artist?= @"CHVRCHES";
  84. music.duration?=?[self?durationWithMinutes:3 andSeconds:51];
  85. music.downloaded?= YES;
  86. music.highQuality?= NO;
  87. [musics?addObject:music];
  88. music?=?[[TRMusic?alloc] init];
  89. music.name?= @"Hold On, We're Going Home (feat. Majid Jordan)";
  90. music.album?= @"Hold On, We're Going Home (feat. Majid Jordan) - Single";
  91. music.artist?= @"Drake";
  92. music.duration?=?[self?durationWithMinutes:3 andSeconds:51];
  93. music.downloaded?= YES;
  94. music.highQuality?= NO;
  95. [musics?addObject:music];
  96. music?=?[[TRMusic?alloc] init];
  97. music.name?= @"The Mother We Share";
  98. music.album?= @"The Mother We Share - Single";
  99. music.artist?= @"CHVRCHES";
  100. music.duration?=?[self?durationWithMinutes:3 andSeconds:51];
  101. music.downloaded?= YES;
  102. music.highQuality?= NO;
  103. [musics?addObject:music];
  104. music?=?[[TRMusic?alloc] init];
  105. music.name?= @"Promises";
  106. music.album?= @"nero";
  107. music.artist?= @"Promises - EP";
  108. music.duration?=?[self?durationWithMinutes:3 andSeconds:51];
  109. music.downloaded?= YES;
  110. music.highQuality?= NO;
  111. [musics?addObject:music];
  112. music?=?[[TRMusic?alloc] init];
  113. music.name?= @"Alone Together";
  114. music.album?= @"Save Rock and Roll";
  115. music.artist?= @"Fall Out Boy";
  116. music.duration?=?[self?durationWithMinutes:3 andSeconds:51];
  117. music.downloaded?= YES;
  118. music.highQuality?= NO;
  119. [musics?addObject:music];
  120. music?=?[[TRMusic?alloc] init];
  121. music.name?= @"Reload (Radio Edit)";
  122. music.album?= @"Reload (Radio Edit) - Single";
  123. music.artist?= @"Sebastian Ingrosso";
  124. music.duration?=?[self?durationWithMinutes:3 andSeconds:51];
  125. music.downloaded?= YES;
  126. music.highQuality?= NO;
  127. [musics?addObject:music];
  128. music?=?[[TRMusic?alloc] init];
  129. music.name?= @"I Love It (feat. Charli XCX)";
  130. music.album?= @"Iconic";
  131. music.artist?= @"Icona Pop";
  132. music.duration?=?[self?durationWithMinutes:3 andSeconds:51];
  133. music.downloaded?= YES;
  134. music.highQuality?= NO;
  135. [musics?addObject:music];
  136. music?=?[[TRMusic?alloc] init];
  137. music.name?= @"Feel the Love";
  138. music.album?= @"Feel the Love (feat. John Newman) [Remixes] - EP";
  139. music.artist?= @"Rudimental";
  140. music.duration?=?[self?durationWithMinutes:3 andSeconds:51];
  141. music.downloaded?= YES;
  142. music.highQuality?= NO;
  143. [musics?addObject:music];
  144. music?=?[[TRMusic?alloc] init];
  145. music.name?= @"Goin' Crazy (feat. Robbie Williams)";
  146. music.album?= @"Goin' Crazy (feat. Robbie Williams) - Single";
  147. music.artist?= @"Dizzee Rascal";
  148. music.duration?=?[self?durationWithMinutes:3 andSeconds:51];
  149. music.downloaded?= YES;
  150. music.highQuality?= NO;
  151. [musics?addObject:music];
  152. music?=?[[TRMusic?alloc] init];
  153. music.name?= @"Still Into You";
  154. music.album?= @"Paramore";
  155. music.artist?= @"Paramore";
  156. music.duration?=?[self?durationWithMinutes:3 andSeconds:51];
  157. music.downloaded?= YES;
  158. music.highQuality?= NO;
  159. [musics?addObject:music];
  160. music?=?[[TRMusic?alloc] init];
  161. music.name?= @"Heart Attack";
  162. music.album?= @"Demi";
  163. music.artist?= @"Demi Lovato";
  164. music.duration?=?[self?durationWithMinutes:3 andSeconds:51];
  165. music.downloaded?= YES;
  166. music.highQuality?= NO;
  167. [musics?addObject:music];
  168. music?=?[[TRMusic?alloc] init];
  169. music.name?= @"Explosions";
  170. music.album?= @"Halcyon (Deluxe Edition)";
  171. music.artist?= @"Ellie Goulding";
  172. music.duration?=?[self?durationWithMinutes:3 andSeconds:51];
  173. music.downloaded?= YES;
  174. music.highQuality?= NO;
  175. [musics?addObject:music];
  176. music?=?[[TRMusic?alloc] init];
  177. music.name?= @"I Need Your Love (feat. Ellie Goulding)";
  178. music.album?= @"I Need Your Love";
  179. music.artist?= @"Calvin Harris";
  180. music.duration?=?[self?durationWithMinutes:3 andSeconds:51];
  181. music.downloaded?= YES;
  182. music.highQuality?= NO;
  183. [musics?addObject:music];
  184. music?=?[[TRMusic?alloc] init];
  185. music.name?= @"Starry Eyed";
  186. music.album?= @"Bright Lights";
  187. music.artist?= @"Ellie Goulding";
  188. music.duration?=?[self?durationWithMinutes:3 andSeconds:51];
  189. music.downloaded?= YES;
  190. music.highQuality?= NO;
  191. [musics?addObject:music];
  192. music?=?[[TRMusic?alloc] init];
  193. music.name?= @"Lights (Single Version)";
  194. music.album?= @"Bright Lights";
  195. music.artist?= @"Ellie Goulding";
  196. music.duration?=?[self?durationWithMinutes:3 andSeconds:51];
  197. music.downloaded?= YES;
  198. music.highQuality?= NO;
  199. [musics?addObject:music];
  200. music?=?[[TRMusic?alloc] init];
  201. music.name?= @"Who's That Chick?";
  202. music.album?= @"Who's That Chick - Single";
  203. music.artist?= @"David Guetta";
  204. music.duration?=?[self?durationWithMinutes:2 andSeconds:47];
  205. music.downloaded?= YES;
  206. music.highQuality?= NO;
  207. [musics?addObject:music];
  208. TRMusicGroup?* g1?=?[[TRMusicGroup?alloc] init];
  209. g1.name?= @"國外單曲";
  210. g1.musics?=?[musics?copy];
  211. g1.state?= TRMusicGroupStateDownloaded;
  212. musics?=?[NSMutableArray?array];
  213. music?=?[[TRMusic?alloc] init];
  214. music.name?= @"致青春";
  215. music.album?= @"致青春";
  216. music.artist?= @"王菲";
  217. music.duration?=?[self?durationWithMinutes:3 andSeconds:18];
  218. music.downloaded?= NO;
  219. music.highQuality?= NO;
  220. [musics?addObject:music];
  221. music?=?[[TRMusic?alloc] init];
  222. music.name?= @"好漢歌";
  223. music.album?= @"六十年代生人";
  224. music.artist?= @"劉歡";
  225. music.duration?=?[self?durationWithMinutes:3 andSeconds:41];
  226. music.downloaded?= NO;
  227. music.highQuality?= YES;
  228. [musics?addObject:music];
  229. music?=?[[TRMusic?alloc] init];
  230. music.name?= @"忐忑";
  231. music.album?= @"自由鳥";
  232. music.artist?= @"龔琳娜";
  233. music.duration?=?[self?durationWithMinutes:4 andSeconds:03];
  234. music.downloaded?= NO;
  235. music.highQuality?= YES;
  236. [musics?addObject:music];
  237. music?=?[[TRMusic?alloc] init];
  238. music.name?= @"愛情買賣";
  239. music.album?= @"我們的愛我不放手";
  240. music.artist?= @"慕容曉曉";
  241. music.duration?=?[self?durationWithMinutes:3 andSeconds:31];
  242. music.downloaded?= NO;
  243. music.highQuality?= YES;
  244. [musics?addObject:music];
  245. music?=?[[TRMusic?alloc] init];
  246. music.name?= @"法海你不懂愛";
  247. music.album?= @"法海你不懂愛 - 單曲";
  248. music.artist?= @"龔琳娜";
  249. music.duration?=?[self?durationWithMinutes:3 andSeconds:33];
  250. music.downloaded?= NO;
  251. music.highQuality?= NO;
  252. [musics?addObject:music];
  253. music?=?[[TRMusic?alloc] init];
  254. music.name?= @"最炫民族風";
  255. music.album?= @"我們的愛我不放手";
  256. music.artist?= @"鳳凰傳奇";
  257. music.duration?=?[self?durationWithMinutes:4 andSeconds:46];
  258. music.downloaded?= NO;
  259. music.highQuality?= YES;
  260. [musics?addObject:music];
  261. music?=?[[TRMusic?alloc] init];
  262. music.name?= @"金箍棒";
  263. music.album?= @"金箍棒 - 單曲";
  264. music.artist?= @"龔琳娜";
  265. music.duration?=?[self?durationWithMinutes:2 andSeconds:52];
  266. music.downloaded?= NO;
  267. music.highQuality?= NO;
  268. [musics?addObject:music];
  269. TRMusicGroup?* g2?=?[[TRMusicGroup?alloc] init];
  270. g2.name?= @"國內神曲";
  271. g2.musics?=?[musics?copy];
  272. g2.state?= TRMusicGroupStateNormal;
  273. TRMusicGroup?* g3?=?[[TRMusicGroup?alloc] init];
  274. g3.name?= @"Calvin Harris 專輯";
  275. g3.musics?= @[];
  276. g3.state?= TRMusicGroupStateNormal;
  277. TRMusicGroup?* g4?=?[[TRMusicGroup?alloc] init];
  278. g4.name?= @"Ellie Gounding 專輯";
  279. g4.musics?= @[];
  280. g4.state?= TRMusicGroupStateNormal;
  281. return @[g1, g2, g3, g4];
  282. }
  283. +?(NSTimeInterval) durationWithMinutes:(int)minutes?andSeconds:(int)seconds
  284. {
  285. return minutes?*?60?+ seconds;
  286. }
  287. @end

轉載于:https://www.cnblogs.com/hytx/p/5049478.html

總結

以上是生活随笔為你收集整理的触控(Touch) 、 布局(Layout)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。