it-swarm.com.ru

Как изменить изображение 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

  • Когда я запускаю приложение, изображения ячеек квадратные. Если я потяну команду «Обновить» на «раунд» или начну прокручивать таблицу, они изменят на «раунд». 

РЕДАКТИРОВАТЬ ВТОРОЙ

Другая проблема, с которой я сталкиваюсь, - это изменение изображений при прокрутке. 

Как мне это предотвратить? 

17
Luke Irvin

Для того, если у кого-то есть эта проблема, вот решение в 

Стриж

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!
}

Как вы могли заметить, жесткий код 35 в основном составляет половину размера изображения, который здесь 70 . А вот функция изменения размера:

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

class 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
    }
}

Мне действительно понадобилось время, чтобы понять это. Сначала изображения прокручиваются после прокрутки, но теперь, используя этот код, вы получите округленные изображения внутри ячейки с самого начала. Надеюсь, это помогло кому-нибудь.

10
Siavash Alp

Попробуйте это в 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
}
7
Binoy jose

Скорее всего, кадр ячейки (и, следовательно, кадр imageView) не устанавливается при первом создании ячейки. Поэтому установка cornerRadius слоя imageView на основе этого начального кадра не работает. Лучшее решение - реализовать метод делегата tableView:willDisplayCell:forRowAtIndexPath: и установить там слой:

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

Это просто..

- (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-ounded-avatars-in-your-ios-application/

3
svmrajesh

Создайте пользовательскую ячейку и добавьте представление изображения (с 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;
}
1
rdelmar

Установите представление изображения на круг внутри асинхронного вызова, где вы устанавливаете изображение. 

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
dreamer.psp
@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
Roman Solodyashkin

Вот идеальное решение для кругового изображения в ячейке 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

0
Laxmikant W.

У меня была похожая проблема, мой UIImageView изначально был квадратом и отображался круглым только тогда, когда UITableViewCell, в котором он находился, был выделен или выделен.

Это было простое исправление:

Swift 2.0

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

Это было размещено внутри awakeFromNib () для моего пользовательского UITableViewCell. 

Предполагается, что imgView - это имя UIImageView, подключенного через раскадровку внутри этого пользовательского UITableViewCell.

0
Elliott Davies