如何在TableView中调整cell.imageView的大小并在Swift中应用tintColor

时间:2015-07-25 08:51:50

标签: ios swift uitableview

我有一个tableView,其中包含在cellForRowAtIndexPath中创建的单元格并添加一些虚拟文本:

cell = UITableViewCell(style: UITableViewCellStyle.Subtitle,
            reuseIdentifier: "cell")
cell.textLabel?.text = "Test Title"
cell.detailTextLabel?.text = "Test detail label"

然后我将测试图像添加到单元格的imageView:

var image = UIImage(named: "cd.png")
cell.imageView!.image = image

结果:

enter image description here

要调整颜色,请使用以下代码:

cell.imageView?.tintColor = UIColor.redColor()

结果:

Color adjusted cell imageView

单元格中的图像太大,因此我使用以下代码调整大小:

var itemSize:CGSize = CGSizeMake(20, 20)
UIGraphicsBeginImageContextWithOptions(itemSize, false, UIScreen.mainScreen().scale)
var imageRect : CGRect = CGRectMake(0, 0, itemSize.width, itemSize.height)
cell.imageView!.image?.drawInRect(imageRect)
cell.imageView!.image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()

虽然图像会调整大小,但tintColor会丢失:

enter image description here

有什么想法吗?

8 个答案:

答案 0 :(得分:22)

没有自定义单元格的解决方案

func imageWithImage(image:UIImage,scaledToSize newSize:CGSize)->UIImage{

    UIGraphicsBeginImageContext( newSize )
    image.drawInRect(CGRect(x: 0,y: 0,width: newSize.width,height: newSize.height))
    let newImage = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()
    return newImage.imageWithRenderingMode(.AlwaysTemplate)
  }




override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! UITableViewCell

    cell.imageView?.tintColor = UIColor.greenColor()
    cell.imageView?.image = imageWithImage(UIImage(named: "imageName")!, scaledToSize: CGSize(width: 20, height: 20))

    // Configure the cell...

    return cell
  }

答案 1 :(得分:16)

您可以通过其他方式实现:

1)使用您自己的UIImageView尺寸和2个单独的标签创建自定义单元格

2)将UIImageView添加为Cell的Subview

var cellImg : UIImageView = UIImageView(frame: CGRectMake(5, 5, 50, 50))
cellImg.image = UIImage(named: "yourimage.png")
cell.addSubview(cellImg)

答案 2 :(得分:5)

对于Swift 3

func imageWithImage(image:UIImage,scaledToSize newSize:CGSize)->UIImage{

        UIGraphicsBeginImageContext( newSize )
        image.draw(in: CGRect(x: 0,y: 0,width: newSize.width,height: newSize.height))
        let newImage = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return newImage!.withRenderingMode(.alwaysTemplate)
    }

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! UITableViewCell

    cell.imageView?.tintColor = UIColor.greenColor()
    cell.imageView?.image = imageWithImage(image: UIImage(named: "imageName")!,scaledToSize: CGSize(width: 20, height: 20))

    // Configure the cell...

    return cell
  }

答案 3 :(得分:3)

对于没有自定义tableViewCell

的OBJECTIVE C.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

 {
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"abc" forIndexPath:indexPath];

    // Configure the cell...

    if (cell==nil) {

        cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"abc"];

    }


    cell.textLabel.text = [menuItemsArray objectAtIndex:indexPath.row];

    cell.imageView.image = [UIImage imageNamed:[menuItemsImagesArray objectAtIndex:indexPath.row]];


    CGSize  itemSize = CGSizeMake(20, 20);

    UIGraphicsBeginImageContextWithOptions(itemSize, false, self.view.contentScaleFactor);

    CGRect  imageRect = CGRectMake(0, 0, itemSize.width, itemSize.height);

    [cell.imageView.image drawInRect:imageRect];

    cell.imageView.image = UIGraphicsGetImageFromCurrentImageContext();

    UIGraphicsEndImageContext();






    return cell; }

答案 4 :(得分:3)

快速4:

func image( _ image:UIImage, withSize newSize:CGSize) -> UIImage {

    UIGraphicsBeginImageContext(newSize)
    image.draw(in: CGRect(x: 0,y: 0,width: newSize.width,height: newSize.height))
    let newImage = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()
    return newImage!.withRenderingMode(.automatic)
}

cell.imageView?.image = image(UIImage(named: "yourImage.png")!, withSize: CGSize(width: 30, height: 30))

答案 5 :(得分:0)

我来这里是因为我试图找到同一问题的答案。

有几种处理图像的答案。我有同样的问题。但不想操纵图像。

我发现我的图像是200x200,然后将其降为1x。 我将其移至3x部分,iOS会自动将其调整为图标大小。供大家参考,我添加了1倍与3倍的比较

我认为发布确实解决了我的问题。对于与我有相同意图的任何人可能会有帮助。

编码愉快。

enter image description here

答案 6 :(得分:0)

SwiftUI解决方案

Image("YourImage")
    .resizable()
    .scaledToFit()
    .frame(width: 40, height: 40)

答案 7 :(得分:0)

万一有人在使用 Xamarin ,这是代码段

    private static UIImage ImageWithImage(UIImage image, CGSize newSize)
    {
        UIGraphics.BeginImageContext(newSize);
        image.Draw(new CGRect(x: 0, y: 0, width: newSize.Width, height: newSize.Height));
        var newImage = UIGraphics.GetImageFromCurrentImageContext();
        UIGraphics.EndImageContext();

        return newImage.ImageWithRenderingMode(UIImageRenderingMode.AlwaysOriginal);
    }