来自 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 - 50 self.view.frame.size.width - 50 是最大宽度,如果你的文字小于这个,它会很小

以上是关于来自 xib 文件的自动调整信息窗口大小取决于 swift 中的内容的主要内容,如果未能解决你的问题,请参考以下文章

将 XIB 文件自动调整为屏幕大小

自动调整大小不适用于 xib 文件中的视图内容

从 xib 文件加载的自动调整视图大小

如何在 Chart.js 2.9.3 中绘制具有动态厚度的水平条(在浏览器窗口高度调整大小时自动调整大小)?

winforms:datagridview:高度(自动调整大小)取决于行数

UIView 未调整大小以填充 iPhone 6 窗口