2013-11-20 37 views
1

我想用單元格左側的按鈕和按鈕右側的文本創建(不是非常)自定義的UITableView。IOS - 如何在UITableViewCell中移動UILabel?

我嘗試計算將UILabel放置在單元格的哪個位置,但改變框架沒有效果(甚至看起來並沒有計算 - 全爲0)。

我的問題是:何時計算標籤的幀大小? (所以改變會產生影響)。

這是正確的做法嗎?

下面的代碼片段。 首先是從細胞的init(稱爲響應dequeueReusable ... 是的, 'buttonColor', 'onTapSel', 'buttonFrame' 和 'buttonColor' 都是「成員變量(文件靜態全局)

- (id)initWithStyle: (UITableViewCellStyle)style 
    reuseIdentifier: (NSString *)reuseIdentifier 
{ 
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]; 

    if (nil == buttonColor) 
    { buttonColor = kDefaultCellButtonColor; } 

    if (nil == onTapSel) 
    { onTapSel = @selector(defaultCellButtonTapped:); } 

    if (self) 
    { 
     EGCellButton * cellButton = (EGCellButton *)[[EGCellButton alloc ] initWithFrame:buttonFrame ]; 
     cellButton.backgroundColor = buttonColor; 
     [cellButton setTitle:buttonLabel forState:UIControlStateNormal]; 
     [cellButton addTarget:self action:(onTapSel) forControlEvents: UIControlEventTouchUpInside]; 
     [self setCellButton:cellButton]; 

     float xx = buttonFrame.origin.x + buttonFrame.size.width + 5; 
     CGRect frame = self.textLabel.frame; 
     frame.origin.x += xx; 
     self.textLabel.frame = frame; 
     [self addSubview:cellButton]; 
    } 
    return self; 
} 

和現在從的cellForRowAtIndexPath:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *CellIdentifier = @"EGButtonTableCellID"; 
    EGButtonTableCell * cell = (EGButtonTableCell *) [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath]; 
    cell.cellButton.indexPath = indexPath; 

    // Configure the cell... 

    cell.textLabel.text = @"abcdefghijklmnopqrstuvwxyz"; 

    float xx = cell.cellButton.frame.origin.x + cell.cellButton.frame.size.width + 5; 
    CGRect frame = cell.textLabel.frame; 
    frame.origin.x += xx; 
    cell.textLabel.frame = frame; 

    return cell; 
} 

的結果是出現在細胞(如預期)的左側的按鈕,但第一個字母我在標籤看到的是「G」,因此前6個字符隱藏在按鈕後面(不打算)。

當我轉儲框架中的值時,除了origin.x以外,兩種方法都爲零。

這應該工作,是嗎?沒有?爲什麼不?等等 非常感謝大家!

:BP:在您的自定義的layoutSubviews方法爲您的UILabel和UIButton的

+0

你在哪裏設置buttonFrame的價值? – rdelmar

+0

試圖在'cellForRow ...'中定製單元格是一個巨大的痛苦。我知道它看起來似乎比較容易,但你應該總是繼承UITableViewCell並且這樣做。 (按照Maggie的回答。) –

回答

1

設定框架的UITableViewCell

關於這個問題

看到蘋果文檔:根據需要

子類可以重寫此方法執行其子視圖的更精確的 佈局。只有在子視圖的 自動調整和基於約束的行爲不是 纔會提供所需的行爲時,您應該重寫此方法。您可以使用您的實現直接設置子視圖的框架矩形。

+1

**重要**:確保您調用'[super layoutSubviews]'作爲您實施的第一行。 – rmaddy

0

你可以創建一個自定義的UITableViewCell,訪問類中的對象或實現方法。

CustomCell.h

#import <UIKit/UIKit.h> 

@interface CustomCell : UITableViewCell 

@property (nonatomic, retain) UILabel *customCellLabel; 
@property (nonatomic, retain) UIButton *customCellButton; 

@end 

CustomCell.m

#import "TLCell.h" 
@implementation CustomCell 

@synthesize customCellLabel, customCellButton 
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier 
{ 
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]; 
    if (self) { 
     customCellLabel = [[UILabel alloc] init]; 
     customCellLabel.frame = CGRectMake(180, 0, 60, 30); 
     [self addSubview:customCellLabel]; 

     customCellButton = [UIButton buttonWithType:UIButtonTypeRoundedRect]; 
     customCellButton.frame = CGRectMake(0, 0, 60, 30); 
     [self addSubview:customCellButton]; 
    } 
    return self; 
} 

@end 

CustomTableView.m

/* --- */ 
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    static NSString *cellIdentifier = @"Cell"; 
    CustomCell *cell = (CustomCell *)[tableView dequeueReusableCellWithIdentifier:cellIdentifier]; 

    if (cell==nil) { 
     cell = [[CustomCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier]; 
    } 
    [cell.customLabel setText:@"hello"]; 
    // [cell. 
    [cell.customButton addTarget:self action:@selector(yourMethod:) forControlEvents:UIControlEventTouchUpInside]; 
} 
/* --- */ 
相關問題