微博筆記:數組
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:按比例縮放到到一邊(寬或高)不超出邊界合適就不在改變
UIViewContentModeCenter:view 與圖片的中心點對齊,不會居中
*
*/
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:按比例縮放到到一邊(寬或高)不超出邊界合適就不在改變
UIViewContentModeCenter:view 與圖片的中心點對齊,不會居中
*
*/
//添加點圖片手勢按鈕
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