2010-10-29 18 views
4

我有一個顯示用戶圖像,名稱和一些文本的表格單元格。用戶的圖像是50x50,但我想要一個邊框,所以我將視圖設置爲居中圖像並將幀設置爲52x52,然後將該視圖的背景顏色設置爲我的邊框顏色。這顯示了圖像周圍的1像素邊框。UITableViewCell的selectedBackgroundView獲取應用於單元格中的所有視圖

我也想在單元格被選中時在單元格的右邊顯示一個30像素寬的邊框。我試圖通過創建一個UIView單元框架的大小,然後添加一個子視圖到UIView的寬度和背景顏色,我想。然後我將該視圖設置爲單元格的selectedBackgroundView。

這裏的問題是,單元格的selectedBackgroundView被應用到單元格內所有視圖的背景。所以當我選擇一個單元格時,圖像「邊框」被設置爲單元格的選定背景顏色,我添加的另一個30像素「邊框」也被更改爲該背景顏色。

代碼我的cellForRowAtIndexPath裏面:

cell = (UserCellView *) currentObject; 

UIView *c = [[UIView alloc ] initWithFrame:CGRectMake(0, 0, 30, cell.frame.size.height)]; 
c.backgroundColor = [[UIColor alloc] initWithRed:64/255.0 green:64/255.0 blue:64/255.0 alpha:1.0]; 

UIView *v = [[UIView alloc ] initWithFrame:cell.frame];    
v.backgroundColor = [[UIColor alloc] initWithRed:35/255.0 green:35/255.0 blue:35/255.0 alpha:1.0];    

[v addSubview:c];  

cell.selectedBackgroundView = v; 

[c release]; 
[v release]; 

回答

-5

你將需要自定義單元格的內容查看和處理委託tableView:cellForRowAtIndexPath

See Posting Here

+0

你能有更多的解釋?我如何設置contentView上的backgroundView? – JasonB 2010-10-29 15:32:47

10

我假設你沒有實際上測試了發生了什麼事情來形成你的分析,它「適用於單元格內所有視圖的背景」。

我確實是這樣的:

@interface TestView : UIView { 
} 
@end 
@implementation TestView 
-(void)setBackgroundColor:(UIColor*)c { 
    // Breakpoint here. 
    NSLog("setBackgroundColor: %@",c); 
    [super setBackgroundColor:c]; 
} 
@end 

... 

UIView * v = [[[UIView alloc] initWithFrame:(CGRect){{0,0},{20,20}}] autorelease]; 
v.backgroundColor = [UIColor magentaColor]; 
UIView * v2 = [[[TestView alloc] initWithFrame:(CGRect){{5,5},{10,10}}] autorelease]; 
v2.backgroundColor = [UIColor yellowColor]; 
[v addSubview:v2]; 
cell.selectedBackgroundView = v; 

最終的結果是,-setBackgroundColor:-[UITableViewCell _setOpaque:forSubview:]稱爲被選擇的視圖的情況下,與像UIDeviceWhiteColorSpace 0 0(即[UIColor clearColor])。

或換言之,當選中單元格時,某些子視圖的背景顏色設置爲[UIColor clearColor],允許selectedBackgroundView顯示。我想認爲發生這種情況是因爲常見的優化是給予表的背景顏色(例如白色),以便繪製得更快,但這意味着在選擇單元格時必須重置背景顏色。

最簡單的解決方法是使用圖像代替:如果有點混亂,UIImageView中正確顏色的1×1像素圖像將起作用。 (I繪製與1象素高UIViews定製隔板線時有這樣的問題,所以我只包括在分離器進入的背景圖像。)

一個替代解決辦法是使用一個的CALayer代替:一個52x52子層添加到所述UIImageView的圖層,並設置子圖層的背景顏色。我非常確定UITableViewCell只是走視圖層次結構,所以它應該忽略自定義圖層。 (圖層最大的缺點是它們不會自動調整大小,這使得它們不適合我的目的,並且意味着30像素的右邊框不會自動調整大小。)

解決方法是將相關視圖如果它等於[UIColor clearColor],則忽略-setBackgroundColor:

+3

這就是答案。我剛剛發現相同的問題,並以相同的結果結束。原因可能是允許selectedBackgroundView顯示,但仍然是一個糟糕的(和未公開的)UI組件設計。 – Sulthan 2012-05-26 18:35:00

+1

死了。結論可能是不依賴於tableView中的backgroundColor(也可能在其他視圖中)。我想使用空白UIView的backgroundColor作爲顏色指示器,但每當我彈回到tableView後顏色都會重置。原來,取消選擇動畫會將backgroundColor重置爲選擇動畫開始之前的值。因此,如果在選擇動畫的開始和取消選擇動畫的結束之間設置backgroundColor,它將被覆蓋。我現在要使用CALayer。 – 2013-03-06 09:49:31

1

一個簡單但令人討厭的解決方案是覆蓋setSelected:animated:和setHighlighted:animated:通過實現重新設置所需的各種背景。沿着線的東西:

- (void)setSelected:(BOOL)selected animated:(BOOL)animated 
{ 
    [super setSelected:selected animated:animated]; 
    self.childView.backgroundColor = [UIColor blueColor]; // whichever you want 
} 
1

首先添加到您的文件

#import <QuartzCore/QuartzCore.h>

然後把你的觀點成圖像...

UIView *rowView = [[UIView alloc] initWithFrame:CGRectMake(0.0, 0.0, 1.0, 60.0)]; 
    rowView.backgroundColor = [UIColor colorWithRed:35/255.0 green:35/255.0 blue:35/255.0 alpha:1.0];   

    UIGraphicsBeginImageContext(rowView.bounds.size); 
    [rowView.layer renderInContext:UIGraphicsGetCurrentContext()]; 
    UIImage *yourImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

然後,而不是添加的一個UIView到你的單元格,只需添加一個帶有「yourImage」的UIImageView即可。

0

一個簡單的解決方案,如果受影響的視圖可以是自定義的子類覆蓋-setBackgroundColor:

- (void)setBackgroundColor:(UIColor *)color 
{ 
    // Ignore requests and do nothing 
} 

因此UITableViewCell的企圖設置顏色會去理會。在自定義視圖代碼確實要設置背景顏色需要調用super

- (void)setColor:(UIColor *)color 
{ 
    [super setBackgroundColor:color]; 
} 

(或很可能消息直接底層CALayer

相關問題