scrollView:
1. 介紹scrollView一些屬性
1>.要想使用scrollView必須做兩件事
1).設定scrollView内容
2).設定contentSize
(滾動範圍)
2>.其他屬性
1). contentOffset(滾動位置)
2).
contentInset(額外增加的滾動區域)
3). bounces
(設定UIScrollView是否需要彈簧效果)
4). crollEnabled
(設定UIScrollView是否能滾動)
5). showsHorizontalScrollIndicator
(是否顯示水準滾動條)
6). showsVerticalScrollIndicator (是否顯示垂直滾動條)
2. 代理
1>代理思想兩個思想
1).監聽思想:B監聽A發生了什麼事情
2).通知思想:A發生了一些事情,要通知B去做
2>scrollView的代理使用
1).如何成為代理(三步)
*聲明協定
*設定代理對象self.scrollView.delegate = self;
*實作協定方法
2).代理監聽scrollView的拖拽事件
// 開始拖拽
-
(void)scrollViewWillBeginDragging:(UIScrollView *)scrollView;
//
結束拖拽
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView
willDecelerate:(BOOL)decelerate;
// scrollView滾動時執行
(void)scrollViewDidScroll:(UIScrollView *)scrollView
3).用代理實作縮放
*成為UIScrollView的代理()
*設定縮放對象(通過viewForZoomingInScrollView方法)
*設定縮放為範圍(maximumZoomScale、minimumZoomScale)
3. 定時器建立兩種方式
1>. self.timer = [NSTimer
scheduledTimerWithTimeInterval:1.f target:self selector:@selector(方法)
userInfo:nil
repeats:YES];
當另一個scrollView運作時,會停止定時器的scrollView,隻能執行一個scrollView.
2>. self.timer = [NSTimer timerWithTimeInterval:1.f target:self
selector:@selector(方法) userInfo:nil repeats:YES];
[[NSRunLoop mainRunLoop]
addTimer:self.timer forMode:NSRunLoopCommonModes];
4.
自定義協定并使用
1>.定義協定(三步)
*定義protocol(兩種optional[代理對象可不實作]、required[代理對象必須實作])
*增加代理屬性(weak) @property (weak, nonatomic) id<LFAppInfoViewDelegate>
delegate;
*給代理發消息,調用代理的方法(需要判斷代理對象是否實作了該方法,不判斷調用後(編譯時不會)會報錯)
注意:定義協定的名稱命名[類名+Delegate]、協定方法的命名規範[方法名稱需要去掉字首,并且将自己作為參數]
2>.使用代理(三步)
*聲明協定
*設定代理對象
*實作協定方法(本例是在代理對象[控制器] 添加一個UILabel)
tableView:
1. UITableView 需要設定資料源才能顯示資料
1>.會向資料源查詢一共多少組,每組多少行,每行顯示什麼資料
2>.資料源必須遵守UITableViewDateSource協定
3>
一共有多少組
-
(NSInteger)numberOfSectionsInTableView:(UITableView
*)tableView{}
第section組有多少行
(NSInteger)tableView:(UITableView *)tableView
numberOfRowsInSection:(NSInteger)section{}
每一行顯示什麼内容
(UITableViewCell *)tableView:(UITableView *)tableView
cellForRowAtIndexPath:(NSIndexPath *)indexPath{}
第section組頭部顯示什麼标題
- (NSString *)tableView:(UITableView *)tableView
titleForHeaderInSection:(NSInteger)section{}
第section組底部顯示什麼标題
titleForFooterInSection:(NSInteger)section{}
當每一行的cell的高度不一緻的時候就使用代理方法設定cell的高度
- (CGFloat)tableView:(UITableView *)tableView
heightForRowAtIndexPath:(NSIndexPath
*)indexPath{}
當每一行的cell高度一緻的時候使用屬性設定cell的高度
self.tableView.rowHeight = 60;
可以優化記憶體的可變數組定義
NSMutableArray *models = [NSMutableArray arrayWithCapacity : (NSUInteger)]
2. cell常見屬性
1>.cell.textLabel.text 标題
2>.cell.detailTextLabel.text 介紹
3>.cell.imageView.image 圖檔
4>.cell.accessoryView 輔助視圖
5>.cell.accessoryView 自定義輔助視圖
6>.cell.backgroundView 設定cell的背景顔色
1).通過backgroundColor 和
backgroundView都可以設定cell的背景
2).但是backgroundView 的優先級比
backgroundColor的高
3).是以如果同時設定了backgroundColor和backgroundView,
backgroundView會蓋住backgroundColor
7>.cell.selectedBackgroundView
設定選中狀态的背景
3. UITableView常見屬性
1>. tableview.separatorStyle 設定分割線樣式
2>. tableview.separatorColor 設定分割線顔色
自定義顔色
[UIColor colorWithRed:色值/255.f green:色值/255.f blue:色值/255.f
alpha:色值/255.f];
擷取螢幕寬度: [UIScreen
mainScreen].bounds.size.width;
3>. tableview.tableHeaderView
設定tableView的頭部視圖 一般用于放廣告
4>. tableview.tableFooterView
設定tableView的底部視圖 一般用于放置加載更多按鈕
5>. [self.tableView reloadData];
重新整理表格
// 重新整理指定行
NSIndexPath *path = [NSIndexPath
indexPathForRow:row inSection:0];
[self.tableView
reloadRowsAtIndexPaths:@[path]
withRowAnimation:UITableViewRowAnimationRight];
4. 優化cell的方法
1>.先去緩存池中查找是否有滿足條件的Cell
UITableViewCell *cell
= [tableView
dequeueReusableCellWithIdentifier:identifier];
2>.如果緩存池中沒有符合條件的cell,就自己建立一個Cell
if
(nil == cell) {
cell = [[UITableViewCell alloc]
initWithStyle:UITableViewCellStyleSubtitle
reuseIdentifier:identifier];
}
3>.建立Cell, 并且設定一個唯一的标記 :
identifier 注 : 定義變量 NSString *identifier 推薦用
static定義靜态局部變量,不推薦用宏.
4>.設定cell資料并傳回cell
5. tableView代理方法
1>. - (void)tableView:(UITableView *)tableView
didSelectRowAtIndexPath:(NSIndexPath *)indexPath{} //當某一行被選中的時候調用
2>. - (void)tableView:(UITableView *)tableView
didDeselectRowAtIndexPath:(NSIndexPath *)indexPath{} //當某一行取消選中的時候調用
3>. UIAlertView的一些屬性和代理方法
1). UIAlertView *alert =
[[UIAlertView alloc] initWithTitle:@"修改資料" message:nil delegate:self
cancelButtonTitle:@"取消" otherButtonTitles:@"确定", nil]; //建立一個彈窗
2). alert.alertViewStyle = UIAlertViewStyle...; //設定alert的樣式,
讓alert顯示出uitextfield
3). UITextField *textField = [alert
textFieldAtIndex:0]; //擷取alert中的textfield
4). [alert show]; //顯示彈窗
5). - (void)alertView:(UIAlertView *)alertView
clickedButtonAtIndex:(NSInteger)buttonIndex{} // alertView的按鈕被點選的時候就會調用
6. 自定義cell兩種方式
1>. 純代碼:每個cell子控件的個數和位置不一樣
2>. 通過xib:
cell一樣且固定的界面
加載xib的方式:
1). [[[NSBundle mainBundle]
loadNibNamed:@"xib名" owner:nil options:nil] firstObject];
2).UINib *nib
= [UINib nibWithNibName:@"xib名" bundle:nil];
UIView *view = [[nib
instantiateWithOwner:nil options:nil]firstObject];
3>. 延遲調用
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3.0 *
NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
});
4>.init方法隻有通過代碼建立控件的時候才會調用;
awakeFromNib方法在控件通過xib或者storyboard建立的時候才會調用
5>. 協定規範
協定名稱 : 控件名稱 + Delegate
協定方法名稱:控件名稱去掉字首 + 含義
在協定方法中将自己(觸發發放的)控件傳出去的目的是友善用于區分哪個控件觸發了該方法
6>.
代碼建立的子控件,添加到contentView中 [self.contentView addSubview:子控件];
7>.
計算文字寬高
CGSize *maxSize = CGSizeMake(300, MAXFLOAT); // 設定文字範圍
NSDictionary *dict = @{NSFontAttributeName : font}; // 字型
// 如果将來計算的文字的範圍超出了指定的範圍,傳回的就是指定的範圍
// 如果将來計算的文字的範圍小于指定的範圍,
傳回的就是真實的範圍
CGSize size = [NSString *str
boundingRectWithSize:maxSize options:NSStringDrawingUsesLineFragmentOrigin
attributes:dict context:nil].size; // 計算文字寬高
8>.通過代碼自定義cell的方法
1).建立一個繼承自UITableViewCell的類
2).重寫initWithStyle:reuseIdentifier:方法
添加所有需要顯示的子控件(不需要設定子控件的資料和frame,
子控件要添加到contentView中)
進行子控件一次性的屬性設定(有些屬性隻需要設定一次,
比如字型\固定的圖檔)
3).提供2個模型
資料模型: 存放文字資料\圖檔資料
frame模型: 存放資料模型\所有子控件的frame\cell的高度
4).cell擁有一個frame模型(不要直接擁有資料模型)
5).重寫frame模型屬性的setter方法:
在這個方法中設定子控件的顯示資料和frame
6).frame模型資料的初始化已經采取懶加載的方式(每一個cell對應的frame模型資料隻加載一次)
7. 通知機制
1>.
通知中心(NSNotificationCenter)
每一個應用程式都有一個通知中心(NSNotificationCenter)執行個體,專門負責協助不同對象之間的消息通信
建立通知中心
NSNotificationCenter *center =
[NSNotificationCenter defaultCenter];
2>. 一個完整的通知一般包含3個屬性:
- (NSString *)name; // 通知的名稱
- (id)object; //
通知釋出者(是誰要釋出通知)
- (NSDictionary *)userInfo; //
一些額外的資訊(通知釋出者傳遞給通知接收者的資訊内容)
3>. 初始化一個通知(NSNotification)對象
+ (instancetype)notificationWithName:(NSString *)aName
object:(id)anObject;
+ (instancetype)notificationWithName:(NSString
*)aName object:(id)anObject userInfo:(NSDictionary *)aUserInfo;
-
(instancetype)initWithName:(NSString *)name object:(id)object
userInfo:(NSDictionary *)userInfo;
4>.
通知中心(NSNotificationCenter)提供了相應的方法來釋出通知
(void)postNotification:(NSNotification *)notification; //
釋出一個notification通知,可在notification對象中設定通知的名稱、通知釋出者、額外資訊等
(void)postNotificationName:(NSString *)aName object:(id)anObject; //
釋出一個名稱為aName的通知,anObject為這個通知的釋出者
(void)postNotificationName:(NSString *)aName object:(id)anObject
userInfo:(NSDictionary *)aUserInfo; //
釋出一個名稱為aName的通知,anObject為這個通知的釋出者,aUserInfo為額外資訊
5>.注冊通知監聽器(Observer)
- (void)addObserver:(id)observer
selector:(SEL)aSelector name:(NSString *)aName
observer:監聽器,即誰要接收這個通知
aSelector:收到通知後,回調監聽器的這個方法,并且把通知對象當做參數傳入
aName:通知的名稱。如果為nil,那麼無論通知的名稱是什麼,監聽器都能收到這個通知
anObject:通知釋出者。如果為anObject和aName都為nil,監聽器都收到所有的通知
取消注冊通知監聽器
通知中心不會保留(retain)監聽器對象,在通知中心注冊過的對象,必須在該對象釋放前取消注冊。否則,當相應的通知再次出現時,通知中心仍然會向該監聽器發送消息。因為相應的監聽器對象已經被釋放了,是以可能會導緻應用崩潰
- (void)removeObserver:(id)observer;
(void)removeObserver:(id)observer name:(NSString *)aName
一般在監聽器銷毀之前取消注冊(如在監聽器中加入下列代碼):
(void)dealloc {
//[super dealloc]; 非ARC中需要調用此句
[[NSNotificationCenter defaultCenter]
removeObserver:self];
7>. 通知和代理的選擇
1).共同點
利用通知和代理都能完成對象之間的通信
2).不同點
代理 :
一對一關系(1個對象隻能告訴另1個對象發生了什麼事情)
通知 : 多對多關系(1個對象能告訴N個對象發生了什麼事情,
1個對象能得知N個對象發生了什麼事情)
8. 鍵盤通知
UIKeyboardWillShowNotification // 鍵盤即将顯示
UIKeyboardDidShowNotification // 鍵盤顯示完畢
UIKeyboardWillHideNotification // 鍵盤即将隐藏
UIKeyboardDidHideNotification // 鍵盤隐藏完畢
UIKeyboardWillChangeFrameNotification // 鍵盤的位置尺寸即将發生改變
UIKeyboardDidChangeFrameNotification // 鍵盤的位置尺寸改變完畢
附帶跟鍵盤有關的額外資訊(字典),字典常見的key如下:
UIKeyboardFrameBeginUserInfoKey //
鍵盤剛開始的frame
UIKeyboardFrameEndUserInfoKey //
鍵盤最終的frame(動畫執行完畢後)
UIKeyboardAnimationDurationUserInfoKey // 鍵盤動畫的時間
UIKeyboardAnimationCurveUserInfoKey // 鍵盤動畫的執行節奏(快慢)
9. 其他
子控件不顯示排錯方法
1).檢視是否調用添加的方法
2).frame為空(沒有設定frame)
3).hidden 是否為yes
4).alpha
<=0.1
5).沒有添加到父控件中
6).檢視夫控件有沒有以上幾點
但凡在init方法中擷取到的frame都是0
-
(void)layoutSubviews
{
[super layoutSubviews];
//
該方法在控件的frame被改變的時候就會調用
// 該方法一般用于調整子控件的位置
}
2>.
// 已經被添加到父視圖上的時候會調用
(void)didMoveToSuperview
{
// 即将被添加到父視圖上的時候會調用
- (void)willMoveToSuperview:(UIView
*)newSuperview
3> UITextField中添加左右視圖
self.textField.leftView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10,
0)];
// 設定左邊視圖的顯示模式
self.textField.leftViewMode =
UITextFieldViewModeAlways;
self.textField.rightView = [[UIView alloc]
initWithFrame:CGRectMake(0, 0, 10, 0)];
// 設定右邊視圖的顯示模式
self.textField.rightViewMode = UITextFieldViewModeAlways;
4>. //
設定btn中的圖檔不填充整個imageview
btn.imageView.contentMode =
UIViewContentModeCenter;
// 超出範圍的圖檔不要剪切
//
btn.imageView.clipsToBounds = NO;
btn.imageView.layer.masksToBounds =
NO;