微博項目筆記

微博筆記:數組

1.LaunchScreen瀏覽器

/*緩存

 *LaunchScreen:替代之前的啓動圖片安全

 *好處:服務器

 *1.能夠展現更多的內容session

 *2.僅僅須要一張大尺寸的圖片就好,而後伸縮適應圖片app

 *框架

 *啓動的優先級:異步

 *啓動圖片的優先級低於 < LaunchScreen (圖片不適合時記得調一下伸縮)ide

 *

 * 當模擬器尺寸不對的時候,第一時間找啓動圖片,模擬器的尺寸由啓動圖片決定(使用啓動圖片不用Xib的時候記得調整Info.plist 加載launchScreen的名稱刪掉)

 

 */

2.-----------------------------

   //顯示窗口

     [self.window makeKeyAndVisible];

    //makeKeyAndVisible 等價於,可是application.keyWindow = self.window只讀

    //1.application.keyWindow = self.window;

 

   // 2.self.window.hidden = NO;

3viewController的加載順序——————————————————

  //1.UITabBarController View 是在UITabBarController控制器一建立就加載

 

    //2.UIViewController   的View是在加顯示窗口的才加載顯示,(用到的纔會顯示,屬於懶加載(須要用到的時候纔會加載))

 

4 instancetype————————————————————

//instancetype:默認會識別哪一個類和子類調用,默認就會轉爲對應的類的對象

5.id-----------------------------

 id (不建議使用):

 1.使用這個不能使用點語法

2.全部的Set 和 Get 方法都能使用 ,不能識別出錯誤

 

6.Dictionary 的新語法

dic[NSForegroundColorAttributeName] = [UIColor orangeColor];

    //上面的等價於下面的着這種方法,鍵 = Value key的值直接在 UIKIT中找

 

   [dic setValue:[UIColor orangeColor]forKey:NSForegroundColorAttributeName];

7.appearance 的介紹和使用特色————————————

 //appearances何時能夠獲獲取外觀標識,當這個類遵循UIAppearance協議的時候,好比:UIView

    //獲取全部的tabBarItem  appearance:爲全局外觀的標始(不夠嚴謹,會影響全部遵循UIAppearance協議的)

   // UITabBarItem *item = [UITabBarItem appearance];

    

    //self ->XDTabBarController

    //獲取當前類下面的全部TabBarItem

    UITabBarItem *item = [UITabBarItem appearanceWhenContainedIn:self, nil];

    //設置模型的文本屬性

    NSMutableDictionary *dic = [NSMutableDictionary dictionary];

    dic[NSForegroundColorAttributeName] = [UIColor orangeColor];

    

    //上面的等價於下面的着這種方法,鍵 = Value key的值直接在 UIKIT中找

    //[dic setValue:[UIColor orangeColor] forKey:NSForegroundColorAttributeName];

 

    [item setTitleTextAttributes:dic forState:UIControlStateSelected];

//--------------------+(void)load 何時調用和做用-------

//何時調用:程序一啓動的時候就會把全部類加載到內存

//做用:加載全部的類

//+(void)load

//{

//

 

//}

 

//———————+(void)initialize何時調用和做用----------

//何時調用:初次使用某個類或者子類的時候調用

//做用:初始化類

+(void)initialize

{

}

 

//獲取TabBar 全局外觀屬性,設置外觀屬性,設置文字屬性

 //appearance:是一種協議 只要遵循 :UIAppearance就能夠 因此當前的類歸本身管理,使用appearanceWhenContainedIn

    UITabBarItem *item = [UITabBarItem appearance];

    NSMutableDictionary *attributes = [NSMutableDictionary dictionary];

    attributes[NSForegroundColorAttributeName] = [UIColor orangeColor];

 

     [item setTitleTextAttributes:attributes forState:UIControlStateSelected];

 

//———————設置中間的按鈕的位置

 //設置中間的按鈕的位置

    self.plusButton.center = CGPointMake( w * 0.5, h * 0.5);

 

    //self.plusButton.bounds = CGRectMake(0, 0, self.plusButton.currentBackgroundImage.size.width, self.plusButton.currentBackgroundImage.size.height);

 //默認的按鈕大小與背景圖片同樣

 //sizeToFit 會根據你的背景圖片 Image和文字計算出最合適的位置

 

        [addButton sizeToFit];

 

//————————item 模型的 求法

//self.items 是UITabBarItem 的模型 ,有多少個子控制器就有多少個Item模型

//————————TitleView 設置爲搜索框—————

1.若是要求在左邊顯示提示文字 ,則要使用可使用佔位符的,用UITextFile 代替 UIsearch ,要設置它的UITextFiled 的左邊搜索按鈕,則要設置 它的leftView , 可是要求有必定的距離,則先拉伸 ,在讓圖片自我調節位置。當設置UITextFiled 的上的左右視圖時 :leftViewMode 必定要設置它的狀態   

//self(  UITextFiled  )

        //initWithImage:圖標的大小會默認與圖片同樣

        UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"searchbar_textfield_search_icon"]];

        imageView.width += 10;

        imageView.contentMode = UIViewContentModeCenter;

        self.leftView = imageView;

        

        //必定要設置,想要顯示左邊的視圖,必定要設置左邊的視圖模式

 

        self.leftViewMode = UITextFieldViewModeAlways;

 

//————隱藏底部的標籤欄————

  //Push 的時候隱藏底部的標籤欄

    //hidesBottomBarWhenPushed:的前提條件是,system 自帶的纔可使用

 

    self.hidesBottomBarWhenPushed = YES;

//———————————建立XIb initWithNibName的實現步驟

 

 //1.先查看是否有XDOneView.xib的文件

    //2.第二步加載與控制器同名的XDOneViewController.xib 文件

    //建立一個默認幾乎的透明的View

    XDOneViewController *one = [[XDOneViewController alloc]initWithNibName:nil bundle:nil];

//等價於,由於init 它的底層會調用 initWithNibName

  XDOneViewController *one = [[XDOneViewController alloc]init];

------------------------------------------------------------------------------------------------------------

//—————統同樣式的左右導航按鈕的時候———

1.要在繼承(UINavigationController)導航控制器d的類中,利用

-(void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated{

if (self.viewControllers.count != 0) {//不是跟視圖控制器

        //設置導航欄的內容

        //設置導航控制左右兩邊的按鈕

        //左邊的按鈕

        //當設置的左邊的返回按鈕覆蓋之後,不能實現滑動返回手勢功能

        viewController.navigationItem.leftBarButtonItem = [UIBarButtonItem barButtonItemWithImage:[UIImage imageNamed:@"navigationbar_back"] highImage:[UIImage imageNamed:@"navigationbar_back_highlighted"] target:self action:@selector(backToPre) forControlEvents:UIControlEventTouchUpInside];

        

        //右邊的按鈕

 

        viewController.navigationItem.rightBarButtonItem = [UIBarButtonItem barButtonItemWithImage:[UIImage imageNamed:@"navigationbar_more"] highImage:[UIImage imageNamed:@"navigationbar_more_highlighted"] target:self action:@selector(backToRoot) forControlEvents:UIControlEventTouchUpInside];

}

 //    CZLog(@"%s",__func__);

 

    [super pushViewController:viewController animated:animated];

}

#pragma mark 導航控制器左右兩邊的Item UIBarButtonItem Action

-(void)backToPre

{

    [self popViewControllerAnimated:YES];

}

-(void)backToRoot

{

    [self popToRootViewControllerAnimated:YES];

}

 

2.當返回按鈕被覆蓋的時候,返回滑動手勢則會失效

1.要在繼承(UINavigationController)導航控制器d的類中,viewDidLoad中設置它的導航控制器代理

- (void)viewDidLoad {

    [super viewDidLoad];

  

    //保存原來的滑動手勢代理

    _popDelegate = self.interactivePopGestureRecognizer.delegate;

    //導航控制器上的代理方法,實現判斷是否回到跟控制器

    self.delegate = self;

  

    

 

}

 

//2.調用調用帶有展現當前的ViewController 的代理方法,何時使用系統的滑動手勢代理方法,何時不適用

#pragma mark -------popDelegate 

-(void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated

{

    NSLog(@"%@",self.viewControllers[0]);//判斷它是哪個控制器

    if (viewController == self.viewControllers[0]) {//顯示的是跟控制器

        //還原滑動返回手勢

        self.interactivePopGestureRecognizer.delegate = _popDelegate;

    }else//不顯示根視圖控制器

    {

        //實現滑動返回功能

        //清空滑動返回收手勢代理,就能實現返回滑動功能

        self.interactivePopGestureRecognizer.delegate = nil;

    

    }

 

}

 

------------------------------------------------------------------------------------------------------------

//------------能夠循環利用的兩個的中, TableView 與 colletionView  

 它們添加內容都是調用ContentView,

//檢查是否有新的版本

    //若是有新特性,進入新特性界面

    //還有必定要對CollectionView ,進行LayOut

------------------------------------------------------------------------------------------------------------

    

    //1.獲取版當期的版本號

    NSString *currentVersion =  [NSBundle mainBundle].infoDictionary[@"CFBundleVersion"];

    

    //2.獲取上一次的版本號

    NSString *lastVersion = [[NSUserDefaults standardUserDefaults] objectForKey:XDVersionKey];

    

    //3.判斷版本號,是否要新定義

    if ([currentVersion isEqualToString:lastVersion]) {//當前版本號和上一次相同

        

        //建立tabBarController ,把它做爲根視圖控制器,支持設備旋轉

        XDTabBarController  *tabBarController = [[XDTabBarController alloc] init];

            self.window.rootViewController = tabBarController;

        

    }else{//當前版本號和上一次的不相同,要重新特性界面進入

    

        XDNewFeatureController *newFeatureVC = [[XDNewFeatureController alloc] init];

        self.window.rootViewController = newFeatureVC;

        

        //保存當前的版本號,用編號設置

        [[NSUserDefaults  standardUserDefaults]setObject:currentVersion forKey:XDVersionKey];

    

    }

//—————————偏好設置的優勢————————

//偏好設置存儲的好處

//1.不用本身管理文件名

//2.快速進行鍵值對存儲

 

//———————————OAuth受權———————

OAuth受權:讓數據變得更安全

流程:有數據提供商提供一個登錄網站,顯示在第三方客戶端上

何時須要UAuth受權:1.須要獲取第三方數據(新浪,騰訊,百度,豆瓣)

                                2.第三方登陸

                                 3.第三方分享

注意:並非任何軟件都能OAuth受權,只有成爲第三方的開發者,才能UAuth受權

如何成爲第三方開發者?

//1.在百度上搜索 微博開放平臺

//2.登陸本身的微博帳號

//3.點擊微連接,選擇移動開發,實名認證之後,點擊繼續建立

//4.高級信息中填寫OAuth受權設置

//——————OAuth 受權的步驟——————

受權步驟總結:

1.獲取未受權的Request Token<進入登錄界面>拼接的時候記得不要留空白

2.獲取用戶受權的Request Token <點擊受權>

3.用受權的 Request Token 換取 Access Token 

(獲得這個 Access Token 就至關於獲得一個「令牌」,經過此」令牌「請求

就能夠擁有資源的網站抓取任意有權限被抓取的資源)

 

access_token:表示哪一個軟件在哪一個用戶下的標誌符,獲取了access_token就能夠獲取相應的數據提供商提供的數據

uid:表示用戶的惟一標識符

 

//———開發步驟———————

1.搭建開發界面

2.展現數據

3.處理對應的業務邏輯

//—————————content-type:響應頭的錯誤----

/*

 "Request failed: unacceptable content-type: text/plain"

 1.AFN經過判斷響應頭,判斷是否有解析數據的方式,content-type: 包含在響應頭中,因此要修改AFN,讓其包含text/plain解析方式

 

 */

//———KVC的底層

1.一個一個的遍歷Key ,查找是否有 SetKey ,若是有的話直接賦值

2.看是否有_key,若是有的話找到直接賦值

3.遍歷全部的key,給key 賦值

4.若是key沒有賦值,就會報錯

 

//————跟服務器打交道

1.向服務器發送請求 -->通常的參照接口文檔,跟接口文檔打交道,就查閱接口文檔(1.請求的Url 2.哪一種類型的接口(GET,Post)3.返回的數據格式)

2.服務器響應的數據-->解析數據,設計數據模型—>返回數據轉換爲模型

3.展現數據,刷新數據

 

//———————使用SDWebImage  的好處和注意點

SDWebImage 的好處:

1.屬於異步請求,不會阻塞主線程(界面)

2.自動建立緩存

3.可讓圖片循環利用

注意點:由於自動建立緩存,很容易形成內存的警告

解決的方法:

-(void)applicationDidReceiveMemoryWarning:(UIApplication *)application

{

   //中止全部的圖片下載

    [[SDWebImageManager sharedManager] cancelAll];

    

    //清空全部緩存

    [[SDWebImageManager sharedManager].imageCache clearMemory];

 

 

}

 

//———下拉刷新數據 ,下拉添加更多的數據

 

 //添加下拉刷新控件

    [self.tableView  addHeaderWithTarget:self action:@selector(loadNewStatus)];

    

    //自動刷新微博數據

    [self.tableView  headerBeginRefreshing];

  //結束下拉刷新

 

        [self.tableView headerEndRefreshing];

     //最新數據的條數

        NSIndexSet *indexSets = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0,statuses.count)];

     //把最新的微博插入到前面,必定要數組的形式添加數據

        [self.statuses insertObjects:statuses atIndexes:indexSets];

 

 

        //添加上拉刷新控件

 

    [self.tableView addFooterWithTarget:self action:@selector(loadOtherStatus)];

 

 

    //since_id false int64 若指定此參數,則返回ID比since_id大的微博(即比since_id時間晚的微博),默認爲0。

  if (self.statuses.count) {//有微博數據,須要下拉刷新

    params[@"since_id"] = [self.statuses[0]idstr];

    }

 

 //max_id false int64 若指定此參數,則返回ID小於或等於max_id的微博,默認爲0。,默認爲0

 

1.注意點:必定要記得「-1」把重複的數據去掉

    if (self.statuses.count) {//有數據須要上拉獲取(之前)更多的數據

        

 long long max_Id  =[[[self.statuses  lastObject] idstr]longLongValue]-1;

        params[@"max_id"] = [NSString stringWithFormat:@"%lld",max_Id];

        

 

    }

  //結束下拉刷新

 

        [self.tableView footerEndRefreshing];

   //不能使用addObjects: 必須把數組的元素加入

 

        [self.statuses addObjectsFromArray:statuses];

 

//請求數據常規的開發步驟

1.查看接口文檔

2.依據參數列表,設置參數模型

3.依據結果列表設置結果模型

4.拿到對應的工具類請求就好

 

//設置軟件的消息未讀數

//設置應用程序的未讀數,記得要註冊通知

 

        [UIApplication sharedApplication].applicationIconBadgeNumber =接收到消息數目( result.totalCount);

1. applicationIconBadgeNumber 查看它的頭文件 

2.從頭文件中能夠知道它是對象 註冊[UIApplication registerUserNotificationSettings:]

3.在程序的啓動頁面,AppDelegate 寫

//註冊微博程序未讀消息通知

    UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge categories:nil];

    [application registerUserNotificationSettings:settings];//經過這裏能夠推出要有UIUserNotificationSettings 對象的屬性

 

//點擊tabBar Item 的時候 刷新微博 的邏輯 :不要當選中第一個按鈕的時候都刷新,當本身想跳轉到其餘頁面,再次點擊剛剛的按鈕的時候,又刷新,那原來的瀏覽的消息界面就改變了,因此要知足 兩次選中的仍是同一個按鈕的時候才刷新 index == 0(這是指定) && self.selectedIndex == index

//讓程序一直處於運行,在後臺播放

 

//在真機的話要記得設置音頻會話

[/*

     //混合播放,會把後臺的音樂混合播放

     AVF_EXPORT NSString *const AVAudioSessionCategoryAmbient;

     

     //單獨播放,會先把後臺的音樂先停下來,而後再播放

    AVF_EXPORT NSString *const AVAudioSessionCategorySoloAmbient;

    

   //進入後臺就播放

    AVF_EXPORT NSString *const AVAudioSessionCategoryPlayback;

     */

    //在真機的後臺播放音樂

    AVAudioSession *session = [AVAudioSession sharedInstance];

    

    //設置會話的類型,能夠兩種類型一塊兒設置

    [session setCategory:AVAudioSessionCategoryPlayback error:nil];

    [session setCategory:AVAudioSessionCategorySoloAmbient error:nil];

    

    //激活

 

    [session setActive:YES error:nil];

]//這是加載程序的時候就設置

//程序即將失去焦點的時候調用

- (void)applicationWillResignActive:(UIApplication *)application {

    

   //設置播放器

    NSURL *url = [[NSBundle mainBundle] URLForResource:@"一次就好.mp3" withExtension:nil];

    AVAudioPlayer *player = [[AVAudioPlayer alloc]initWithContentsOfURL:url error:nil];

    //準備播放

    [player prepareToPlay];

    //無限播放

    player.numberOfLoops = -1 ;

    //播放

    [player play];

    

    //記得局部變量都要,強引用

    _player = player;

}

 

//當程序進入後臺的時候調用

- (void)applicationDidEnterBackground:(UIApplication *)application {

 

    //開啓一個後臺任務,時間不肯定,優先級比較低,假如系統要關閉應用的時候,系統會優先關閉這個程序

    UIBackgroundTaskIdentifier ID =[application beginBackgroundTaskWithExpirationHandler:^{

        //結束後臺的任務

        [application  endBackgroundTask:ID];

    }];

    

    //1.如何提升後臺的優先級,欺騙蘋果,設置播放程序

    

    //2.蘋果系統會檢測是否在播放音樂,當沒有在播放音樂的時候,系統會關閉程序

    

    //3.微博:在即將失去焦點的時候會播放靜音的音樂

 

}

//—————複雜的界面的開發步驟——————

1.按照業務邏輯劃分界面的結構(原創,轉發,工具條)

2.每個結構都自定義控件

3.在控件上先把全部劃分的結構界面都添加上去

4.計算每一個控件的位置,若是之後碰到的內容是根據模型決定的,立刻就搞個ViewModel視圖模型(模型 + 控件的Frame)

5.模型轉視圖模型

6.給控件賦值視圖模型

7.調節界面(文字和顏色)

 

//UIImageView 的 contentMode

UIViewContentModeScaleToFill,//填充整個控件

UIViewContentModeScaleAspectFit,//按比例縮放,且不會超出控件

UIViewContentModeScaleAspectFill, //按比例縮放,且高度或則寬度有一個不超出控件,而後讓圖片的中心對齊控件中心

UIViewContentModeCenter,//不會縮放圖片,只會把圖片的中心點和控件對齊

//-------獲取服務器的圖片的時候,若是不清晰的話

 http://ww1.sinaimg.cn/thumbnail/61c99730jw1eyndx74f8pj20tz124aik.jpg

 http://ww1.sinaimg.cn/bmiddle

/61c99730jw1eyndx74f8pj20tz124aik.jpg

 

//當記不住Block 的格式時候 在 代碼中敲 :inline 就會顯示

 

**********************************************************

//當設置複雜的cell仍是其餘的先要劃分結構,有哪幾部分組成,劃分紅子控件(注意點:cell 的初始化 initWithStyle)

1.先搭建框架

2.搭建子類控件

*****************************************************************************************************

//重寫建立Cell ,自定義建立cell:使用類方法

+(instancetype)cellWithTableView:(UITableView *)tableView

{

    static NSString *ID = @"cell」;

//放回的cell 是否爲閒置

     id cell = [tableView dequeueReusableCellWithIdentifier:ID];

    if (cell == nil) {

  //誰調用就初始化誰的類

      cell = [[self alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:ID];

    }

    

    return cell;

 

}

*****************************************************************************************************

MVVM思想:

/*

 1.cell的高度應該提早計算出來: 當一有數據的時候就要使用VM 設置Cell的大小

 2.cell 的高度 必須計算每一個cell的子控件必須frame,才能夠肯定(相似字體的話,你經過字體的小設置Frame的同時,記得要設置控件的字體)

 2.在cell的setStatus方法計算cell的高度,會比較耗費性能

 

 解決的辦法:MVVM思想

 M:模型

 V:視圖

 VM:視圖模型,(模型中包裝模型+模型對應視圖的Frame)

 */

/*

 複雜的界面開發步驟:

 1.按照業務邏輯劃分結構,(原創,轉發,工具條)

 2.每個結構,都自定義一個控件

 3.在控件上先把全部劃分的結構添加上去

 4.計算每一個控件的位置,若是遇見的內容是根據模型決定的,立刻定義一個ViewModle(模型+模型的大小)

 5.模型轉視圖模型

 6.賦值

7.調節界面(文字大小,顏色)

8.一個結構一個結構的處理

 

 */

/*

1.能夠直接傳遞數據,肯定數據的放置的位置

2.MVVM:若是一個控件循環利用,能夠避免屢次計算控件的Frame

*/

*****************************************************************************************************

經常使用的圖片大小

1.導航條的 高度:64點 @2x :128 @3x : 192 

2.tabBar的高度: 49點

3.導航條的子控件和tabBar 的子控件 Or 工具條的高度:35

*****************************************************************************************************

開發中注意的事項

1.UIView 是設置不了 圖片的,那先要轉變成:UIImageView 這能夠添加圖片,可是要注意,記得設置交互

self.userInteractionEnabled = YES;

2.設置每個cell 間的間距,不能夠整個cell設置由於沒有設置它的 X Y 是不肯定的,因此能夠設置cell 中的原創微博 的高度 下移 10 個間距 ,在設置tableView 的背景顏色就好

*****************************************************************************************************

時間的業務邏輯:(使用的框架爲:NSDate+MJ

//設置時間格式(因爲使用點語法獲取數據的,因此要從新設置Get方法)判斷的技巧:不要從小的開始判斷,要先判斷大的,再依次判斷小的

-(NSString *)created_at

{

    // Sat Mar 26 16:05:03 +0800 2016 微博給咱們的時間格式

    //1.先要把字符串轉化成 NSDate

    //轉換 EEE MMM d HH:mm:ss Z yyyy

    //日期格式轉換

    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];

    formatter.dateFormat = @"EEE MMM d HH:mm:ss Z yyyy ";

    NSDate *creat_time = [formatter dateFromString:_created_at];

    if ([creat_time isThisYear]) {//今年

        //兩天前

        if ([creat_time isToday]) {//今天

            NSDateComponents *cmp = [creat_time deltaWithNow];

            if (cmp.hour >= 1) {

                return [NSString stringWithFormat:@"%ld小時前",cmp.hour];

            }else if(cmp.minute > 1)

            {

                return [NSString stringWithFormat:@"%ld分鐘前",cmp.minute];

            }else

            {

                return @"剛剛";

            }

            

        }else if ([creat_time isYesterday])

        {//昨天

            formatter.dateFormat = @"昨天 HH:mm";

            return [formatter stringFromDate:creat_time];

        

        }else

        {//前天

            formatter.dateFormat = @"MM-dd HH:mm";

            return [formatter stringFromDate:creat_time];

        }

        

   

    }else{//不是今年

         formatter.dateFormat = @"yyyy-MM-dd HH:mm";

        return [formatter stringFromDate:creat_time];

    }

    

    return _created_at;

}

*****************************************************************************************************

圖片的contentMode常用的介紹

   /**

         * UIViewContentModeScaleToFill :將整個圖片壓縮到適合控件的大小

         UIViewContentModeScaleAspectFit :按比例縮放到不超出邊框

         UIViewContentModeScaleAspectFill:按比例縮放到到一邊(寬或高)不超出邊界合適就不在改變

        UIViewContentModeCenterview 與圖片的中心點對齊,不會居中

         *

         */

        imageView.contentMode = UIViewContentModeScaleAspectFill;

//把多餘的截掉

imageView.clipsToBounds = YES;

*****************************************************************************************************

//九宮格的佈局

1.先求整體的Frame

   //配圖

    if (_status.pic_urls.count) {

        CGFloat photosX = textX;

        CGFloat photosY = CGRectGetMaxY(_orignalTextFrame) + MDStatusCellMargin;

        CGSize photosSzie = [self setPhotosSizeWithCount:_status.pic_urls.count];

        _orignalPhotosFrame =(CGRect){{photosX,photosY},photosSzie};

        

        originalH = CGRectGetMaxY(_orignalPhotosFrame) + MDStatusCellMargin;

 

    }

//計算大小的方法setPhotosSizeWithCount

-(CGSize)setPhotosSizeWithCount:(NSInteger)count

{

   //配圖的列數

    NSInteger cols = count == 4?2:3;

    //配圖行數(這是有計算公式的):行數 = (總數 - 1/列數 +1

    NSInteger rols = (count - 1) / cols + 1;

    CGFloat photosWH = 70;

    CGFloat photosW = photosWH * cols + (cols - 1) * MDStatusCellMargin;

    CGFloat photosH = photosWH * rols  + (rols - 1)* MDStatusCellMargin;

    CGSize photosSie = CGSizeMake(photosW, photosH);

    return photosSie;

 

}

//計算九宮格內部佈局

-(void)layoutSubviews

{

    [super layoutSubviews];

    CGFloat x = 0;

    CGFloat y = 0;

    CGFloat w = 70;

    CGFloat margin = 10;

    CGFloat h = 70;

    int col = 0;

    int rol = 0;

    int cols = _pic_urls.count == 4?2:3;

    

    //計算要顯示的圖片的Frame

    for (int i = 0; i< _pic_urls.count; i++) {

        col = i % cols;

        rol = i / cols;

        UIImageView *imageV = self.subviews[i];

        x = col * (margin + w);

        y = rol * (margin + h);

        imageV.frame = CGRectMake(x, y ,  w, h);

    }

 

}

*****************************************************************************************************

//圖片瀏覽器設置

//添加九個配圖控件(要把傳過來,利用屬性傳值)

-(void)setUpAllChildVC

{

    //九宮格中

    for (int i = 0; i < 9 ; i++) {

        UIImageView *imageView = [UIImageView alloc].init;

        /**

         * UIViewContentModeScaleToFill :將整個圖片壓縮到適合控件的大小

         UIViewContentModeScaleAspectFit :按比例縮放到不超出邊框

         UIViewContentModeScaleAspectFill:按比例縮放到到一邊(寬或高)不超出邊界合適就不在改變

        UIViewContentModeCenterview 與圖片的中心點對齊,不會居中

         *

         */

        //添加點圖片手勢按鈕

        UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapGesture:)];

        imageView.tag = i;

        //當使用UIImageView的時候,記得設置圖片的交互

        imageView.userInteractionEnabled = YES;

        

        [imageView addGestureRecognizer:tap];

        imageView.contentMode = UIViewContentModeScaleAspectFill;

        //把超出邊框的圖片去掉

        imageView.clipsToBounds = YES;

        [self addSubview:imageView];

    }

 

}

//添加點圖片手勢按鈕

-(void)tapGesture:(UITapGestureRecognizer *)tap

{

     //在手勢的圖片添加Tag,這能夠知道獲取的是第幾張圖片(經過手勢能夠獲取點擊的圖片)

    UIImageView *imageV = (UIImageView *) tap.view;

    //點擊圖片的時候調用

    //建立圖片瀏覽器

    int i = 0;

    NSMutableArray *array = [NSMutableArray array];

    for (MDPhotos *photos in _pic_urls) {

        //MDphotos 轉換成 MJphoto

        //MJPhoto.h 的文件中 ,要實現的屬性有

        //1.@property (nonatomic, strong) NSURL *url;

        //2.@property (nonatomic, strong) UIImageView *srcImageView; // 來源view(你點擊那個圖片)

        //3.@property (nonatomic, assign) int index; // 索引

        MJPhoto *mjPhotos = [[MJPhoto alloc] init];

        //圖片不清晰時,能夠鍵鏈接的改一下

        NSString *urlString = photos.thumbnail_pic.absoluteString;

        urlString = [urlString stringByReplacingOccurrencesOfString:@"thumbnail" withString:@"bmiddle"];

        mjPhotos.url = [NSURL URLWithString:urlString];

//        NSLog(@"%@",photos.thumbnail_pic);

        mjPhotos.index = i ;

        mjPhotos.srcImageView = imageV;

        [array addObject:mjPhotos];

        i ++ ;

    }

    

    MJPhotoBrowser *browser = [[MJPhotoBrowser alloc] init];

    /*MJ頭文件提示要實現的,之後使用框架的時候,要看頭文件

     // 全部的圖片對象(MJPhoto)

     @property (nonatomic, strong) NSArray *photos;

     // 當前展現的圖片索引

     @property (nonatomic, assign) NSUInteger currentPhotoIndex;

     */

    browser.photos = array;//全部圖片對象

    browser.currentPhotoIndex = imageV.tag ;

    //之後看到要顯示到主窗口的 能夠 考慮框架是否有 show(看框架頭文件)

    [browser show];

    

 

 

 

}

*****************************************************************************************************UITextView 中輸入的字體設置和水印的文字大小同樣(textView 輸入的位置x= 5,y = 8)

UITextView 系統沒有默認設置self.font 

經過設置:

-(instancetype)initWithFrame:(CGRect)frame

{

    if (self = [super initWithFrame:frame]) {

        self.font = [UIFont systemFontOfSize:13];

       //self.placeHolderLable.font = font;  不要在這裏設置,當外界改變(textView)的時候,也會改變

    }

    return self;

}

//再重寫setFont設置placeHolderLable.font 能夠跟着外面 改變

-(void)setFont:(UIFont *)font

{

    [super setFont:font];

    self.placeHolderLable.font = font;

 //避免在輸入信息後在設置字體,這樣字體的大小不符合lable Frame

 

    [self.placeHolderLable sizeToFit];

 

}

*****************************************************************************************************

becomeFirstResponder //變成第一響應,

resineFirstResponder  //放棄第一響應,

響應機制多用在獲取(或放棄)鍵盤行爲

******************************************************************************

判斷是否有文本輸入的時候可使用通知

 //監聽文本的輸入(通知)

    /**

     *1.addObserver:須要監聽的對象

     2.name:監聽通知的名稱

     3.object:監聽誰發送通知 nil:誰發送都監聽

     設置通知,要把它移除

     UITextViewTextDidChangeNotification:這是監聽輸入名稱(須要記住的)

     *

     */

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textChange) name:UITextViewTextDidChangeNotification object:nil];

}

-(void)textChange

{    //監聽是否有文本輸入

    if (_textView.text.length) {//有文本輸入

        _textView.hiddlePalceHolder = YES;   

    }else

    {//沒有文本輸入

        _textView.hiddlePalceHolder = NO;

    }

}

-(void)dealloc

{    //移除通知

    [[NSNotificationCenter defaultCenter]removeObserver:self];

}

*****************************************************************************

 //設置圖片的大小(有的圖片上傳的時候要大小限定)

CGFloat compressionQuality 這是圖片壓縮係數

 

    UIImageJPEGRepresentation(<#UIImage *image#>, <#CGFloat compressionQuality#>)

//這是壓縮圖格式

  NSData *data =  UIImagePNGRepresentation(image);

*****************************************************************************

   //自動佈局行高

 

    self.tableView.rowHeight = UITableViewAutomaticDimension;

tableView:dequeueReusableCellWithIdentifier

 1.storyBoard 其實就是內部會幫你註冊cell

     2.在ViewDidLoad 使用了(forIndexPath:)沒有使用storyBoard ,要本身手動建立 [self.tableView registerClass:[本身的建立cell類 class] forCellReuserIdentifer:ID ];

 

   forIndexPath:不能使用本身建立的cell

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:<#@"reuseIdentifier"#> forIndexPath:indexPath];

    /*1.先從緩存池中取出數據

      2.判斷Cell 有沒有註冊,有的話,直接建立cell

    3.沒有建立就返回NIL

相關文章
相關標籤/搜索