天天看點

IOS學習筆記 -- scrollView和tableView整理

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;