日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

可任意自定義的UITableViewCell

系統(tǒng) 2775 0

UITableView的強大更多程度上來自于可以任意自定義UITableViewCell單元格。通常,UITableView中的Cell是動態(tài)的,在使用過程中,會創(chuàng)建一個Cell池,根據(jù)每個cell的高度(即tableView:heightForRowAtIndexPath:返回值),以及屏幕高度計算屏幕中可顯示幾個cell。而進行自定義TableViewCell無非是采用代碼實現(xiàn)或采用IB編輯nib文件來實現(xiàn)兩種方式,本文主要收集代碼的方式實現(xiàn)各種cell自定義。

如何動態(tài)調整Cell高度

      - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
      

static NSString *CellIdentifier = @" Cell " ;

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease];
UILabel *label = [[UILabel alloc] initWithFrame:CGRectZero];
label.tag = 1 ;
label.lineBreakMode = UILineBreakModeWordWrap;
label.highlightedTextColor = [UIColor whiteColor];
label.numberOfLines = 0 ;
label.opaque = NO; // 選中Opaque表示視圖后面的任何內容都不應該繪制
label.backgroundColor = [UIColor clearColor];
[cell.contentView addSubview:label];
[label release];
}

UILabel *label = (UILabel *)[cell viewWithTag: 1 ];
NSString *text;
text = [textArray objectAtIndex:indexPath.row];
CGRect cellFrame = [cell frame];
cellFrame.origin = CGPointMake( 0 , 0 );

label.text = text;
CGRect rect = CGRectInset(cellFrame, 2 , 2 );
label.frame = rect;
[label sizeToFit];
if (label.frame.size.height > 46 ) {
cellFrame.size.height = 50 + label.frame.size.height - 46 ;
}
else {
cellFrame.size.height = 50 ;
}
[cell setFrame:cellFrame];

return cell;
}
      - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
      
{
UITableViewCell *cell = [self tableView:tableView cellForRowAtIndexPath:indexPath];
return cell.frame.size.height;
}

如何用圖片自定義Table Separeator分割線
一般地,利用類似[tableView? setSeparatorColor: [UIColor redColor]];語句即可修改cell中間分割線的顏色。那又如何用一個圖片作為分割線背景呢?可以嘗試如下:
方法一:
先設置cell separatorColor為clear,然后把圖片做的分割線添加到自定義的custom cell上。

方法二:
在cell里添加一個像素的imageView后將圖片載入進,之后設置tableView.separatorStyle = UITableViewCellSeparatorStyleNone

自定義首行Cell與其上面導航欄間距

      tableView.tableHeaderView = [[[UIView alloc] initWithFrame:CGRectMake(
      
        0
      
      ,
      
        0
      
      ,
      
        5
      
      ,
      
        20
      
      )] autorelease];
    

自定義UITableViewCell的accessory樣式
? ? ? 默認的accessoryType屬性有四種取值:UITableViewCellAccessoryNone、UITableViewCellAccessoryDisclosureIndicator、UITableViewCellAccessoryDetailDisclosureButton、UITableViewCellAccessoryCheckmark。如果想使用自定義附件按鈕的其他樣式,則需使用UITableView的 accessoryView 屬性來指定。

      UIButton *button;
      
if (isEditableOrNot) {
UIImage *image = [UIImage imageNamed: @" delete.png " ];
button = [UIButton buttonWithType:UIButtonTypeCustom];
CGRect frame = CGRectMake( 0.0 , 0.0 ,image.size.width,image.size.height);
button.frame = frame;
[button setBackgroundImage:image forState:UIControlStateNormal];
button.backgroundColor = [UIColor clearColor];
cell.accessoryView = button;
} else {
button = [UIButton buttonWithType:UIButtonTypeCustom];
button.backgroundColor = [UIColor clearColor];
cell.accessoryView = button;
}

以上代碼僅僅是定義了附件按鈕兩種狀態(tài)下的樣式,問題是現(xiàn)在這個自定義附件按鈕的事件仍不可用。即事件還無法傳遞到UITableViewDelegate的accessoryButtonTappedForRowWithIndexPath方法上。當我們在上述代碼中在加入以下語句:
? ? ? ? ? ? ? [button addTarget:self action:@selector(btnClicked:event:) forControlEvents:UIControlEventTouchUpInside];
后,雖然可以捕捉到每個附件按鈕的點擊事件,但我們還無法進行區(qū)別到底是哪一行的附件按鈕發(fā)生了點擊動作!因為addTarget:方法最多允許傳遞兩個參數(shù):target和event,這兩個參數(shù)都有各自的用途了(target指向事件委托對象,event指向所發(fā)生的事件)。看來只依靠Cocoa框架已經(jīng)無法做到了。

? ? ? 但我們還是可以利用event參數(shù),在自定義的btnClicked方法中判斷出事件發(fā)生在UITableView的哪一個cell上。因為UITableView有一個很關鍵的方法 indexPathForRowAtPoint ,可以根據(jù)觸摸發(fā)生的位置,返回觸摸發(fā)生在哪一個cell的indexPath。而且通過event對象,正好也可以獲得每個觸摸在視圖中的位置。

      
        //
      
      
         檢查用戶點擊按鈕時的位置,并轉發(fā)事件到對應的accessory tapped事件
      
      
        
- ( void )btnClicked:( id )sender event :( id ) event
{
NSSet *touches = [ event allTouches];
UITouch *touch = [touches anyObject];
CGPoint currentTouchPosition = [touch locationInView:self.tableView];
NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:currentTouchPosition];
if (indexPath != nil)
{
[self tableView:self.tableView accessoryButtonTappedForRowWithIndexPath:indexPath];
}
}

這樣,UITableView的accessoryButtonTappedForRowWithIndexPath方法會被觸發(fā),并且獲得一個indexPath參數(shù)。通過這個indexPath參數(shù),我們即可區(qū)分到底哪一行的附件按鈕發(fā)生了觸摸事件。

      - (
      
        void
      
      )tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath
      
{
int *idx = indexPath.row;
// 這里加入自己的邏輯
}
?

可任意自定義的UITableViewCell


更多文章、技術交流、商務合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 三门县| 江口县| 峡江县| 竹山县| 无棣县| 隆回县| 新宁县| 安庆市| 江都市| 伊宁县| 台前县| 馆陶县| 玛多县| 永春县| 通道| 马尔康县| 綦江县| 静海县| 丰镇市| 都江堰市| 霍州市| 永寿县| 图们市| 乌鲁木齐市| 桐城市| 永城市| 康定县| 乐亭县| 牡丹江市| 漯河市| 荥经县| 北流市| 嵩明县| 西林县| 云梦县| 安远县| 吐鲁番市| 梁平县| 庆安县| 修文县| 高邑县|