来自 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()
我的目标是为 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()