尤里卡:自定义行的动态高度

时间:2017-03-06 22:45:37

标签: ios swift eureka-forms

我制作了一个自定义单元格,应该只有一个UIImageView。当图像改变时,单元格应改变高度以适合图像:

import UIKit
import Eureka

public class FirebaseImageCell: Cell<UIImage>, CellType{

    @IBOutlet weak var customImageView: UIImageView!

    public override func setup() {
        super.setup()
    }

    public override func update() {
        super.update()

        guard let image = row.value else { return }
        customImageView.image = image

        guard let cellWidth = UIApplication.shared.keyWindow?.frame.width else { return }
        height = { cellWidth * ( image.size.height / image.size.width ) }
    }

}

public final class FirebaseImageRow: Row<FirebaseImageCell>, RowType {
    required public init(tag: String?) {
        super.init(tag: tag)
        cellProvider = CellProvider<FirebaseImageCell>(nibName: "FirebaseImageCell")
    }
}

我创建了这样的行:

let image = UIImage(named: "testImage")!

let testSection = Section("Test Section")
    <<< FirebaseImageRow("firebaseImageRow") { row in
            row.value = image
        }
form +++ testSection

在某些时候,我想要更改单元格中的图像,单元格应该更改它的高度以适合图像。在这里我改变了图像:

func imageChange() {

    guard let imageRow = form.rowBy(tag: "firebaseImageRow") as? FirebaseImageRow else { return }
    let image = UIImage(named: "testImage2")        
    imageRow.value = image
    imageRow.updateCell()

}

当表单初始化时,单元格的高度正确,适合“testImage”,但图像更改后高度保持不变。

如何让细胞动态改变它的高度?

2 个答案:

答案 0 :(得分:1)

不确定我是否回答了你的问题,也许你可以尝试我的功能:

(1)你可以创建一个NSMutableDictionary来记住单元格的高度。更改高度后,重新加载tableView或section或indexPath。

(2)您还可以使用ReactiveCocoa来解决该问题。首先,我建议你了解KVO,MVVM,Hook

(3)我们的项目设置了活动图像网址:http://example.com/data/img.gif?width=271&height=360

因此我们可以轻松获取活动的imageView的大小并更新&#34; heightForRowAtIndexPath:&#34;功能

enter image description here  enter image description here

答案 1 :(得分:0)

你可以试试这个替代方案:

<<< FormTextRow(tag: "phone", title: "Teléfono", isPhone: true).cellUpdate({ [weak self] cell, row in
         row.add(rule: RuleRequired(msg: "Debes indicar tu teléfono", id: "phone required"))
         row.add(rule: RuleMinLength(minLength: Locale.current.regionCode ?? "" == "CL" ? 6 : 10, msg: "Debes ingresar un número celular de 8 dígitos", id: "cell invalid"))
         if (self?.params["phone"] as? String ?? "") != row.value ?? "" {
             self?.params["phone"] = row.value ?? ""
             self?.updateParams?(self?.params ?? [:])
             cell.setupErrorMessage()
             self?.tableView.reloadData()
         }
     })

注意:params 是填写表单的参数,setupErrorMessage 是渲染方法,reloadData 是用于显示消息

快乐编码