2014-04-28 34 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