来自 xib 文件的自动调整信息窗口大小取决于 swift 中的内容
Posted
技术标签:
【中文标题】来自 xib 文件的自动调整信息窗口大小取决于 swift 中的内容【英文标题】:Autoresize infowindow from xib file depended from the content in swift 【发布时间】:2018-04-05 11:22:34 【问题描述】:我尝试调整从 UIView 在 xib 文件中创建的自定义信息窗口的大小。宽度取决于窗口的内容,但我没有找到任何解决方案。我尝试了情节提要中的所有内容,但没有任何反应。我有上传截图看看我的问题:
这是我在 xib 的 UIView 中的代码
public protocol nonPaidDelegate: class
func didTapMapsSelectButton()
class MapInfoWindow: UIView
@IBOutlet weak var titleInfo: UILabel!
@IBOutlet weak var adressInfo: UILabel!
@IBOutlet weak var buttonAction: UIButton!
open var delegate:nonPaidDelegate?
@IBAction func didTapInButton(_ sender: Any)
self.delegate?.didTapMapsSelectButton()
print("button tapped")
class func instanceFromNib() -> UIView
return UINib(nibName: "MapInfoWindowView", bundle: nil).instantiate(withOwner: self, options: nil).first as! UIView
在我的视图控制器中,我调用 MapInfoWindow
var infoWindow = MapInfoWindow()
infoWindow = loadNiB()
我为标记创建 infoWindow UIView:
func mapView(_ mapView: GMSMapView, markerInfoWindow marker: GMSMarker) -> UIView?
if let venueItem = marker.userData as? Venue
infoWindow.titleInfo?.text = venueItem.name
infoWindow.adressInfo?.text = venueItem.locationName
NSLog(venueItem.name!)
else
NSLog("Did tap a normal marker")
return UIView()
【问题讨论】:
不清楚到底是什么问题。应该发生什么以及正在发生什么?您应该在哪里实现它的代码?我们不知道你在做什么,你想做什么,结果是什么。 你使用了多少个标签? 你们是对的,我用一些代码更新了我的问题 【参考方案1】:您可以像这样以编程方式实现您的目标,我使用了两个标签(titleLabel
& snippetLabel
):
func mapView(_ mapView: GMSMapView, markerInfoWindow marker: GMSMarker) -> UIView?
let infoWindowView = UIView()
let titleStringWidth = marker.title?.widthOfString(usingFont: UIFont.boldSystemFont(ofSize: 13.0))
var infoWidth = 0
if titleStringWidth!+10>self.view.frame.size.width - 50
infoWindowView.frame.size.width = self.view.frame.size.width - 50
infoWidth = Int(self.view.frame.size.width - 50.0)
else
infoWindowView.frame.size.width = titleStringWidth!+10
infoWidth = Int(titleStringWidth!)+10
infoWindowView.frame.size.width = self.view.frame.size.width - 50
infoWindowView.backgroundColor = UIColor.white
let titleLabel = UILabel()
titleLabel.frame.size.width = infoWindowView.frame.size.width-10
titleLabel.numberOfLines = 0
titleLabel.lineBreakMode = .byWordWrapping
titleLabel.font = UIFont.boldSystemFont(ofSize: 13.0)
titleLabel.frame.origin.x = 3
titleLabel.frame.origin.y = 5
titleLabel.text = "your text"
titleLabel.textAlignment = .center
titleLabel.sizeToFit()
let actualNumberOfLinesForTiltle = titleLabel.numberOfVisibleLines
titleLabel.frame.size.height = CGFloat(actualNumberOfLinesForTiltle*20)
let snippetLabel = UILabel()
snippetLabel.frame.size.width = infoWindowView.frame.size.width-10
snippetLabel.numberOfLines = 0
snippetLabel.lineBreakMode = .byWordWrapping
snippetLabel.font = UIFont.boldSystemFont(ofSize: 13.0)
snippetLabel.text = "your text"
snippetLabel.textAlignment = .center
snippetLabel.sizeToFit()
let snippet_y = 20*actualNumberOfLinesForTiltle+10
let actualNumberOfLinesForSnippet = snippetLabel.numberOfVisibleLines
snippetLabel.frame.origin.x = 3
snippetLabel.frame.origin.y = CGFloat(snippet_y)
snippetLabel.frame.size.height = CGFloat(actualNumberOfLinesForSnippet*20)
let visibleHeightOfView = 15+actualNumberOfLinesForTiltle*20+actualNumberOfLinesForSnippet*20
infoWindowView.frame = CGRect(x: 0, y: 0, width: infoWidth, height: visibleHeightOfView)
infoWindowView.addSubview(titleLabel)
infoWindowView.addSubview(snippetLabel)
return infoWindowView
并添加此扩展程序
extension UILabel
var numberOfVisibleLines: Int
let textSize = CGSize(width: CGFloat(self.frame.size.width), height: CGFloat(MAXFLOAT))
let rHeight: Int = lroundf(Float(self.sizeThatFits(textSize).height))
let charSize: Int = lroundf(Float(self.font.pointSize))
return rHeight / charSize
extension String
func widthOfString(usingFont font: UIFont) -> CGFloat
let fontAttributes = [NSFontAttributeName: font]
let size = self.size(attributes: fontAttributes)
return size.width
【讨论】:
我认为所有这些代码都可以从 xib 文件的情节提要中完成。我集成了代码,我看到 infoWindow 从屏幕的 100% 开始,它可以根据int 你放在这里:infoWindow.frame.size.width = self.view.frame.size.width - 50self.view.frame.size.width - 50
是最大宽度,如果你的文字小于这个,它会很小以上是关于来自 xib 文件的自动调整信息窗口大小取决于 swift 中的内容的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Chart.js 2.9.3 中绘制具有动态厚度的水平条(在浏览器窗口高度调整大小时自动调整大小)?