2009-08-25 58 views
9

我找不到任何可以在剪輯子視圖的元素上找到任何顯示如何創建圓角(特別是在分組表格視圖中)的任何地方(搜索引擎,文檔,此處等) 。UITableViewCell圓角和剪輯子視圖

我有代碼,正確創建一個圓角的矩形4弧(圓角),已經在我的子類uitableviewcell中的drawRect:方法測試的路徑。問題在於子視圖碰巧是uibuttons的內部uiimageviews,不服從uitableviewcell服從的CGContextClip()。

下面是代碼:

- (void)drawRect:(CGRect)rect 
{  
    CGContextRef context = UIGraphicsGetCurrentContext(); 

    CGFloat radius = 12; 
    CGFloat width = CGRectGetWidth(rect); 
    CGFloat height = CGRectGetHeight(rect); 

    // Make sure corner radius isn't larger than half the shorter side 
    if (radius > width/2.0) 
     radius = width/2.0; 
    if (radius > height/2.0) 
     radius = height/2.0;  

    CGFloat minx = CGRectGetMinX(rect) + 10; 
    CGFloat midx = CGRectGetMidX(rect); 
    CGFloat maxx = CGRectGetMaxX(rect) - 10; 
    CGFloat miny = CGRectGetMinY(rect); 
    CGFloat midy = CGRectGetMidY(rect); 
    CGFloat maxy = CGRectGetMaxY(rect); 

    [[UIColor greenColor] set]; 


    CGContextBeginPath(context); 

    CGContextMoveToPoint(context, minx, midy); 

    CGContextAddArcToPoint(context, minx, miny, midx, miny, radius); 
    CGContextAddArcToPoint(context, maxx, miny, maxx, midy, radius); 
    CGContextAddArcToPoint(context, maxx, maxy, midx, maxy, radius); 
    CGContextAddArcToPoint(context, minx, maxy, minx, midy, radius); 

    CGContextClip(context); 
    CGContextFillRect(context, rect); 

    [super drawRect:rect];  
} 

由於這種特定的情況是靜態的(僅示出了按鈕1特定行),我可以編輯所使用的圖像的按鈕,以獲得所需的效果。

但是,我還有另一種情況是動態的。具體而言,包含大量數據庫驅動結果的分組表格,將顯示可能位於具有圓角的第一行或最後一行的照片,因此需要進行裁剪)。

那麼,是否有可能創建一個CGContextClip()也可以剪輯子視圖?如果是這樣,怎麼樣?

+0

主要問題在這裏沒有答案。是否有可能得到CGContextClip()影響子視圖? – 2012-10-22 22:25:44

+0

這就是這個簡單的... http://stackoverflow.com/a/20410857/294884這也是剪輯所有SUBVIEWS。 – Fattie 2014-09-01 14:41:50

回答

0

創建一個具有圓角和透明度的UIImageView的子類。爲了獲得更好的性能,UITableViewCell本身應該是不透明的。

看一看this example

+0

不能測試這個,但這看起來像是一個很好的現代解決方案 – Brenden 2011-12-21 03:40:22

7

的CALayer的對象具有的功能四捨五入的角落:

UIView * someview = something here; 
CALayer * layer = [someview layer]; 
layer.masksToBounds = YES; 
layer.cornerRadius = radius; 

而你所有的設置。您還可以添加一些邊框顏色和內容,如果您有興趣,請查看文檔。

+2

你不應該在UITableViewCell中使用CALayer的cornerRadius。它的性能受到的影響太大,因此必須繪製這些單元以獲得快速滾動表。 – 2010-04-27 17:21:46

+1

由於cornerRadius設置適用於所有角落,因此無法將其用於表格單元格。有沒有辦法做一個圓頂只有單元格 – coneybeare 2010-05-11 20:58:44

+0

'view.layer.masksToBounds = YES'和'view.layer.cornerRadius = 8.0f'給了我完全一樣的東西。謝謝。 – 2011-03-24 05:13:22

3

看到這個代碼:http://gist.github.com/292384

我已經在多個項目中使用它,性能是偉大的,它的高度可定製的。它不使用cornerRadius,並且單元格的繪圖是上下文敏感的。

+0

哦,我不確定代碼是否可以解決您的子查詢查詢。儘管如此,上下文敏感的舍入組風格表的代碼依然存在。 – 2010-05-02 02:49:39

+0

感謝您的支持!這正是我正在尋找的。 – Greg 2012-09-24 19:06:55

1

在你看來初始化器試試這個:

self.layer.borderWidth = 2.0f; 
self.layer.borderColor = [[UIColor greenColor] CGColor]; 
self.layer.masksToBounds = YES; 
self.layer.cornerRadius = 12.0f; 

然後你並不需要實現所有任何drawRect方法

+0

這不會剪裁UIButton子視圖。 – 2011-10-06 16:33:48

+0

因爲你必須去IB按鈕的屬性檢查器,在查看部分,繪圖下選中「Clip Subviews」 – Zennichimaro 2013-06-07 19:50:21

0

(爲圓形邊框和剪裁的目的至少)。如果你有一個自定義的UITableViewCell,你可以在雨燕4.0做到這一點:

class CustomTVC: UITableViewCell { 

override func awakeFromNib() { 
    super.awakeFromNib() 
    // Initialization code 
} 

override func setSelected(_ selected: Bool, animated: Bool) { 
    super.setSelected(selected, animated: animated) 

    self.layer.cornerRadius = 20 
    self.layer.masksToBounds = true 
} 

}