来自 XIB 的自定义 UIView 未调整大小

Custom UIView from XIB not resizing

我的目标是为 MKAnnotationView 创建自定义图像。

图像中“服务项目”的数量对于每个注释可能不同 -> 应该可以动态更改视图中的项目。

我的想法是创建自定义 UIView (xib),以编程方式加载 xib 并动态更改项目。然后我将 UIView 转换为 UIImage。

//ServiceAnnotationView.xib

//ServiceAnnotationView.class
class ServiceAnnotationView: UIView{
    
}

//扩展 UIView -> 可以从代码加载 xib 文件

extension UIView {
    class func fromNib<T: UIView>() -> T {
        return Bundle(for: T.self).loadNibNamed(String(describing: T.self), owner: nil, options: nil)![0] as! T
    }

正在动态创建注释图像。

let view = MKAnnotationView(annotation: annotation, reuseIdentifier: identifier)
let serviceAnnotationView: ServiceAnnotationView = ServiceAnnotationView.fromNib()
view.image = serviceAnnotationView.asImage()

显示 2 个项目时的结果:

显示 1 项时的结果

在这种情况下,UIView 应该会自动收缩。 UIView 的宽度始终相同。无论 UIStackView 中有多少项目。

到目前为止我尝试了什么? 我试图根据项目数为 UIView 指定框架。 -> 没有成功

然后我根据项目数更改 UIView 的约束大小。 -> 没有成功

由于 UIStackView,UIView 应该会自动调整大小。为什么在这种情况下没有发生?

您遗漏了很多关于您的设置以及您实际如何尝试使用它的信息,但这可能会有所帮助...

假设您有:

  • ServiceAnnotationView 中的一些 var/func 到 show/hide 堆栈视图中的图像
  • 您有一个 UIView 扩展 .asImage()
  • 您已对图像设置大小限制(例如高度和宽度)

在 调用 .asImage():

之前调用 .setNeedsLayout().layoutIfNeeded()
    let serviceAnnotationView: ServiceAnnotationView = ServiceAnnotationView.fromNib()

    // however you're setting the number of images to show in the stack view        
    serviceAnnotationView.numItems = 3
    
    serviceAnnotationView.translatesAutoresizingMaskIntoConstraints = false
    
    serviceAnnotationView.setNeedsLayout()
    serviceAnnotationView.layoutIfNeeded()
    
    let img = serviceAnnotationView.asImage()