2014-04-28 56 views
16

我的代碼大部分都適用。如何將UITableViewCell圖像更改爲UITableView中的圓圈

  • 我遇到的問題是圖像以平方開始,當我滾動表格或刷新它時變爲圓形。

我錯過了什麼?

這裏是我的代碼:

cell.imageView.layer.cornerRadius = cell.imageView.frame.size.width/2.0; 
    cell.imageView.layer.borderWidth = 3.0; 
    cell.imageView.layer.borderColor = [UIColor colorWithRed:157.0/255.0 green:34.0/255.0 blue:53.0/255.0 alpha:1.0] 
    .CGColor; 
    cell.imageView.clipsToBounds = YES; 

    NSDictionary *tweet = (self.results)[indexPath.row]; 

    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); 
    dispatch_async(queue, ^{ 

     NSString * imageString = [tweet valueForKeyPath:@"user.profile_image_url"]; 
     NSData * imageData = [[NSData alloc] initWithContentsOfURL: [NSURL URLWithString:imageString]]; 

     if (imageData != nil) 
     { 
      dispatch_async(dispatch_get_main_queue(), ^{ 

       cell.imageView.image = [UIImage imageWithData: imageData]; 

       [cell setNeedsLayout]; 
      }); 
     } 
    }); 

編輯 ----的代碼是的cellForRowAtIndexPath

  • 權當我啓動應用程序的細胞圖像是方形的。如果我pullToRefresh更改爲圓形或者如果我開始滾動表格,它們將變爲圓形。

編輯兩個

另外一個問題,我看到的是圖像的改變以及滾動。

我該如何預防?

+0

你在哪裏有這樣的代碼? – rdelmar

+0

您發佈的代碼表明您希望圖片視圖是圓形的,正確的?所以問題在於它們最初不會出現? – rmaddy

+0

它位於cellForRowAtIndexPath中。是的,我希望它們始終保持圓形,但是如果我刷新或滾動,它們將以方形開始並更新爲圓形。 –

回答

4

最有可能的單元格框架(因此imageView的框架)不是第一次創建單元格。因此,基於該初始幀設置imageView的圖層cornerRadius不起作用。最佳的解決方案是實現tableView:willDisplayCell:forRowAtIndexPath:委託方法和設置在那裏的層:

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { 
    cell.imageView.layer.cornerRadius = cell.imageView.frame.size.width/2.0; 
} 
+0

仍然以平方當我執行這個時候開始 –

+0

你對'cell.imageView'和'cell.imageView.frame'有什麼瞭解? – rmaddy

+0

cell.imageView:>和cell.imageView.frame:0.000000 –

2

創建自定義細胞,並添加圖片預覽(一個IBOutlet),大小和位置,但是你想(出口是「 iv「在我的例子中)。把代碼放在awakeFromNib方法中(假設你的單元格是在一個筆尖或故事板中創建的)。

-(void)awakeFromNib { 
    self.iv.layer.cornerRadius = self.iv.frame.size.width/2.0; 
    self.iv.layer.borderWidth = 3.0; 
    self.iv.layer.borderColor = [UIColor colorWithRed:157.0/255.0 green:34.0/255.0 blue:53.0/255.0 alpha:1.0].CGColor; 
    self.iv.clipsToBounds = YES; 
} 
+2

單元格已經有一個'imageView'屬性。迄今爲止的問題是,默認的imageView的框架沒有設置,直到它得到一個圖像。 – rmaddy

+0

@rmaddy,是的,我知道單元格帶有圖像視圖屬性。它的工作方式是我在這裏做的,沒有圖像。另外,我通常不喜歡在表視圖的委託/數據源中設置不依賴indexPath的東西。我認爲這些東西應該屬於細胞,所以這就是我提出這種方法的原因。 – rdelmar

+0

這很有效,但只有在故事板中爲'imageView'明確指定高度。 – Coder1224

3

其簡單..

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    cell.ImageView.layer.cornerRadius = 150.0f; 
    cell.ImageView.layer.borderWidth = 2.0f; 
    cell.ImageView.layer.borderColor = [UIColor blackColor].CGColor; 
    cell.ImageView.clipsToBounds = YES; 
} 

請參閱此鏈接瞭解更多信息:http://ios-blog.co.uk/tutorials/quick-tips/how-to-create-rounded-avatars-in-your-ios-application/

+0

它的工作很好,在我的代碼..試試你的項目.. – svmrajesh

10

爲了如果有這個問題的人,這裏是

斯威夫特的解決方案

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    var cell:ContactCellTableViewCell? = tableView.dequeueReusableCellWithIdentifier("contactCell", forIndexPath: indexPath) as? ContactCellTableViewCell 



    var contact : ContactStruct 
    image = searchResults[indexPath.row] 
    let newImage = resizeImage(image, toTheSize: CGSizeMake(70, 70)) 
    var cellImageLayer: CALayer? = cell?.imageView.layer 
    cellImageLayer!.cornerRadius = 35 
    cellImageLayer!.masksToBounds = true 
    cell?.imageView.image = newImage 


    return cell! 
} 

正如你可能注意到了硬編碼基本上是圖像大小是在這裏的一半。 這裏是調整大小功能:

func resizeImage(image:UIImage, toTheSize size:CGSize)->UIImage{ 


    var scale = CGFloat(max(size.width/image.size.width, 
     size.height/image.size.height)) 
    var width:CGFloat = image.size.width * scale 
    var height:CGFloat = image.size.height * scale; 

    var rr:CGRect = CGRectMake(0, 0, width, height); 

    UIGraphicsBeginImageContextWithOptions(size, false, 0); 
    image.drawInRect(rr) 
    let newImage = UIGraphicsGetImageFromCurrentImageContext() 
    UIGraphicsEndImageContext(); 
    return newImage 
} 

注:我使用如下的自定義單元格類:

import UIKit 

類ContactCellTableViewCell:UITableViewCell的{

@IBOutlet weak var nameLabel: UILabel! 
@IBOutlet weak var contactImage: UIImageView! 
@IBOutlet weak var phoneLabel: UILabel! 




override func awakeFromNib() { 
    super.awakeFromNib() 

} 

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

    // Configure the view for the selected state 
} 

}

我花了一段時間才弄清楚這一點。圖像在第一次滾動後會變成圓形,但現在使用此代碼將從頭開始在單元格內顯示圓形圖像。 希望它幫助任何人。

7

試試這個在override-

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 

    // image Width(84)/2 = 42 
      cell.CellImage.layer.cornerRadius = 42.0 
      cell.CellImage.layer.masksToBounds = true 
     //or 

     cell.CellImage.layer.cornerRadius = cell.CellImage.frame.width/2 
     cell.CellImage.clipsToBounds = true 
} 
0

我也有類似的問題,我的UIImageView最初是一個正方形,只會顯示爲圓形時的UITableViewCell它是內要麼突顯或選擇。

這是一個簡單的解決辦法:

雨燕2.0

imgView.layer.cornerRadius = imgView.frame.width/2 
imgView.clipsToBounds = true 

這被放置在awakeFromNib()內爲我的自定義的UITableViewCell。

這是假設imgView是的UIImageView的名稱通過故事板迷上了這個自定義的UITableViewCell內。

0

設置圖像視圖到您設置圖像的異步調用內部的一個圓。

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); 
dispatch_async(queue, ^{ 

    NSString * imageString = [tweet valueForKeyPath:@"user.profile_image_url"]; 
    NSData * imageData = [[NSData alloc] initWithContentsOfURL: [NSURL URLWithString:imageString]]; 

    if (imageData != nil) 
    { 
     dispatch_async(dispatch_get_main_queue(), ^{ 

      cell.imageView.image = [UIImage imageWithData: imageData]; 
cell.imageView.layer.cornerRadius = cell.imageView.frame.size.width/2.0; 
cell.imageView.layer.borderWidth = 3.0; 
cell.imageView.layer.borderColor = [UIColor colorWithRed:157.0/255.0 green:34.0/255.0 blue:53.0/255.0 alpha:1.0] 
.CGColor; 
cell.imageView.clipsToBounds = YES; 
      [cell setNeedsLayout]; 
     }); 
    } 
}); 
0
@interface MyCell : UITableViewCell 
@end 

@implementation MyCell 

- (void)awakeFromNib 
{ 
    [super awakeFromNib]; 
    self.imageView.layer.masksToBounds = YES; 
    self.textLabel.font = [UIFont systemFontOfSize:17]; 
    self.textLabel.textColor = [UIColor darkTextColor]; 
} 

// --- image view frame is empty rect inside tableView: willDisplayCell: 
// +++ set cornerRadius inside layoutSubviews works. 
- (void)layoutSubviews 
{ 
    [super layoutSubviews]; 

    // layout image view 
    CGRect vfr = self.frame; 
    CGRect imgvr = self.imageView.frame; 
    imgvr.origin.x = 16; 
    imgvr.size.width = CGRectGetHeight(vfr); 
    self.imageView.frame = imgvr; 

    // update corner radius 
    self.imageView.layer.cornerRadius = imgvr.size.width * 0.5f; 

    // layout label 
    CGRect lblr = self.textLabel.frame; 
    lblr.origin.x = CGRectGetMaxX(imgvr) + 16; 
    lblr.size.width = CGRectGetWidth(vfr) - CGRectGetMaxX(imgvr) - 32; 
    self.textLabel.frame = lblr; 
} 

@end 
0

這裏是一個完美的並說明離開在UITableView的細胞圓形圖像溶液。 只需使用以下代碼修改您的UITableviewCell(自定義單元)類。

override func awakeFromNib() { 
    super.awakeFromNib() 
    imgEvent.layer.frame = (imgEvent.layer.frame).insetBy(dx: 0, dy: 0) 
    imgEvent.layer.borderColor = UIColor.gray.cgColor 
    imgEvent.layer.cornerRadius = (imgEvent.frame.height)/2 
    imgEvent.layer.masksToBounds = false 
    imgEvent.clipsToBounds = true 
    imgEvent.layer.borderWidth = 0.5 
    imgEvent.contentMode = UIViewContentMode.scaleAspectFill 
    } 

這也將有助於只滾動表之後,解決圖像循環的問題..(如果有的話![enter image description here] 1