How do I make UITableViewCell's ImageView a fixed size even when the image is smaller

后端 未结 16 2425
不思量自难忘°
不思量自难忘° 2020-11-27 10:27

I have a bunch of images I am using for cell\'s image views, they are all no bigger than 50x50. e.g. 40x50, 50x32, 20x37 .....

When I load the table view, the tex

相关标签:
16条回答
  • 2020-11-27 11:01
    UIImage *image = cell.imageView.image;
    
    UIGraphicsBeginImageContext(CGSizeMake(35,35));
    // draw scaled image into thumbnail context
    
    [image drawInRect:CGRectMake(5, 5, 35, 35)]; //
    UIImage *newThumbnail = UIGraphicsGetImageFromCurrentImageContext();
    // pop the context
    UIGraphicsEndImageContext();
    if(newThumbnail == nil)
    {
        NSLog(@"could not scale image");
        cell.imageView.image = image;
    }
    else
    {
        cell.imageView.image = newThumbnail;
    }
    
    0 讨论(0)
  • 2020-11-27 11:01

    The solution we ended up with is similar to many of the others. But to get the correct position of the separator we had to set it before calling super.layoutSubviews(). Simplified example:

    class ImageTableViewCell: UITableViewCell {
    
        override func layoutSubviews() {
            separatorInset.left = 70
            super.layoutSubviews()
    
            imageView?.frame = CGRect(x: 0, y: 0, width: 50, height: 50)
            textLabel?.frame = CGRect(x: 70, y: 0, width: 200, height: 50)
        }
    
    }
    
    0 讨论(0)
  • 2020-11-27 11:07

    This worked for me in swift:

    Create a subclass of UITableViewCell (make sure you link up your cell in the storyboard)

    class MyTableCell:UITableViewCell{
        override func layoutSubviews() {
            super.layoutSubviews()
    
            if(self.imageView?.image != nil){
    
                let cellFrame = self.frame
                let textLabelFrame = self.textLabel?.frame
                let detailTextLabelFrame = self.detailTextLabel?.frame
                let imageViewFrame = self.imageView?.frame
    
                self.imageView?.contentMode = .ScaleAspectFill
                self.imageView?.clipsToBounds = true
                self.imageView?.frame = CGRectMake((imageViewFrame?.origin.x)!,(imageViewFrame?.origin.y)! + 1,40,40)
                self.textLabel!.frame = CGRectMake(50 + (imageViewFrame?.origin.x)! , (textLabelFrame?.origin.y)!, cellFrame.width-(70 + (imageViewFrame?.origin.x)!), textLabelFrame!.height)
                self.detailTextLabel!.frame = CGRectMake(50 + (imageViewFrame?.origin.x)!, (detailTextLabelFrame?.origin.y)!, cellFrame.width-(70 + (imageViewFrame?.origin.x)!), detailTextLabelFrame!.height)
            }
        }
    }
    

    In cellForRowAtIndexPath , dequeue the cell as your new cell type:

        let cell = tableView.dequeueReusableCellWithIdentifier("MyCell", forIndexPath: indexPath) as! MyTableCell
    

    Obviously change number values to suit your layout

    0 讨论(0)
  • 2020-11-27 11:07

    This solution essentially draws the image as 'aspect fit' within the given rect.

    CGSize itemSize = CGSizeMake(80, 80);
    UIGraphicsBeginImageContextWithOptions(itemSize, NO, UIScreen.mainScreen.scale);
    UIImage *image = cell.imageView.image;
    
    CGRect imageRect;
    if(image.size.height > image.size.width) {
        CGFloat width = itemSize.height * image.size.width / image.size.height;
        imageRect = CGRectMake((itemSize.width - width) / 2, 0, width, itemSize.height);
    } else {
        CGFloat height = itemSize.width * image.size.height / image.size.width;
        imageRect = CGRectMake(0, (itemSize.height - height) / 2, itemSize.width, height);
    }
    
    [cell.imageView.image drawInRect:imageRect];
    cell.imageView.image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    
    0 讨论(0)
提交回复
热议问题