Xcode Imageview Aspect Fit Удалить лишнее пространство

У меня есть изображение в UITableViewCell.

Просмотр изображений с помощью Aspect Fit создает много дополнительного пространства сверху и снизу, если изображение большое. Дополнительное пространство (серый цвет фона) показано на рисунке ниже.

Как мне удалить лишнее пространство?

Imageview Extra Space
Несколько заметок:

  1. Это конкретное изображение размером 890 x 589 и снимок экрана был сделан на симуляторе iphone 6S.

  2. Я использую UITableViewAutomaticDimension для автоматической высоты ячейки таблицы.

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

Заранее спасибо.

2 ответа

Я была такая же проблема. Это происходит, когда размер исходного изображения больше (по ширине и / или высоте), чем у UIImageView, в котором он находится, и размер изображения изменяется с помощью Aspect Fit, чтобы соответствовать UIImageView.

Здесь ширина изображения больше, чем может поместиться в UIImageView, поэтому Aspect Fit изменяет размер изображения, сохраняя исходное соотношение сторон. Если вы прочитаете размер изображения (через часы или точку останова или что-то еще), вы увидите, что размер изображения составляет (например) 600(ч) х 800(ш) (соотношение 3:4). Ширина UIImageView составляет (например) 320(w), таким образом, отображаемое изображение масштабируется до 240(h) x 320(w) (с сохранением соотношения 3:4). НО ширина изображения все еще ДЕЙСТВИТЕЛЬНО 600 x 800, и, поскольку нет никаких ограничений на высоту UIImageView, размер UIImageView равен 600 x 320 -> он устанавливает высоту UIImageView равной исходной высоте изображения (600), потому что это возможно.

Мое решение таково: (Swift 3)

Добавьте ограничение высоты для UIImageView в Main.storyboard и свяжите его через Outlet:

@IBOutlet weak var displayimage: UIImageView!
@IBOutlet weak var displayimageHeightConstraint: NSLayoutConstraint!

Затем проверьте, меньше ли UIImageView (ширина), чем изображение, которое он содержит. Если это так, установите ограничение высоты так, чтобы соотношение высоты и ширины UIImageView было таким же, как соотношение сторон изображения:

if displayimage.frame.size.width < (displayimage.image?.size.width)! {
    displayimageHeightConstraint.constant = displayimage.frame.size.width / (displayimage.image?.size.width)! * (displayimage.image?.size.height)!
}

Дополнительная операция также возможна, если по бокам изображения имеются пробелы из-за проблемы изменения размера, когда высота UIImageView ограничена, а ширина установлена ​​равной ширине исходного изображения.

@IBOutlet weak var displayimageWidthConstraint: NSLayoutConstraint!

if displayimage.frame.size.height < (displayimage.image?.size.height)! {
    displayimageWidthConstraint.constant = displayimage.frame.size.height / (displayimage.image?.size.height)! * (displayimage.image?.size.height)!
}

Приведенный выше ответ не работает при использовании UITableViewAutomaticDimension.

В общем проблема заключается в том, что в функции tableView "cellForRowAt indexPath" tableView еще не размечена ячейка и ее подпредставления.

Поэтому одним из решений этой проблемы является использование подкласса UITableView:

class MyUITableView: UITableView {

    // Makes real device cell width available in "cellForRowAt indexPath"
    override func dequeueReusableCell(withIdentifier identifier: String, for indexPath: IndexPath) -> UITableViewCell {
        let cell = super.dequeueReusableCell(withIdentifier: identifier, for: indexPath)
        cell.frame.size.width = self.frame.size.width
        cell.layoutIfNeeded()
        return cell
    }
}

Теперь вы можете использовать любое из решений, например, по ссылке в комментарии Md Rais. В качестве примера мой собственный код:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! ViewCell

    if let attach = eventsByDay[indexPath.section][indexPath.row].attachPhoto {
        let cellWidth = cell.attachPhoto.frame.size.width
        let scale = cellWidth / attach.size.width
        let size = CGSize(width: cellWidth, height: attach.size.height * scale)

        UIGraphicsBeginImageContextWithOptions(size, true, 0.0)             
        attach.draw(in: CGRect(origin: CGPoint.zero, size: size))
        cell.attachPhoto.image = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
    } else {
        cell.attachPhoto.image = nil
    }

    // ...
    return cell
}
Другие вопросы по тегам