Xcode Imageview Соотношение сторон Удаление лишнего пробела

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

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

Как убрать лишний пробел?

Imageview Extra Space
Несколько замечаний:

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

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

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

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


person hmzfier    schedule 20.07.2016    source источник
comment
Вы когда-нибудь догадывались об этом? Мне нужно сделать то же самое, но нигде не могу найти ответ.   -  person Keith    schedule 05.09.2016
comment
Я также хочу сделать то же самое.   -  person lostintranslation    schedule 08.10.2016
comment
кто-нибудь исправит эту проблему. Пожалуйста, помогите мне.   -  person user1629977    schedule 09.06.2017
comment
@lostintranslation Я также столкнулся с той же проблемой, пожалуйста, помогите мне.   -  person user1629977    schedule 09.06.2017
comment
Найдите решение здесь   -  person Md Rais    schedule 10.06.2017


Ответы (2)


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

Здесь ширина изображения больше, чем может поместиться в UIImageView, поэтому Aspect Fit изменяет размер изображения, сохраняя исходное соотношение сторон. Если вы прочитаете размер изображения (через часы или точку останова или что-то еще), вы увидите, что размер изображения составляет (например) 600 (в) x 800 (ш) (соотношение 3: 4). Ширина UIImageView составляет (например) 320 (ш), поэтому отображаемое изображение масштабируется до 240 (в) x 320 (ш) (с сохранением соотношения 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)!
}
person Mick    schedule 02.03.2017

Приведенный выше ответ не работает при использовании 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
}
person Hugo F    schedule 02.06.2018