Warm tip: This article is reproduced from serverfault.com, please click

ios-如何向UILabel添加填充(和背景)

(ios - How can I add padding (and a background) to a UILabel)

发布于 2020-12-01 09:21:54

之前在Stackoverflow上已经问过这个问题,但是解决方案对我不起作用。

我正在SwiftUI中构建应用程序,但是我需要使用MapKit来绘制 map,所以我要在UIKit中创建一些视图(以编程方式,没有界面生成器)。我当前的问题是我想使用UILabel周围的一些填充物来制作胶囊背景。它需要容纳任意文本,因此我无法对大小进行硬编码,但找不到在运行时确定UILabel文本固有大小的方法。我尝试过UIEdgeInsets没有成功。

在所附的代码中,我将显示我要实现的SwiftUI版本,然后是UIKit尝试。我想遵循最佳做法,所以请随时告诉我实现此目标的任何更好方法。

(代码产生的屏幕截图)

import SwiftUI

struct SwiftUICapsuleView: View {
    var body: some View {
        Text("Hello, World!")
            .padding(6)
            .background(Color.gray)
            .cornerRadius(15)
    }
}

struct UIKitCapsuleView: UIViewRepresentable {
    func makeUIView(context: Context) -> UIView {
        let view = UIView(frame: .zero)
        view.translatesAutoresizingMaskIntoConstraints = false

        let label = UILabel(frame: .zero)
        label.numberOfLines = 0
        label.font = UIFont.systemFont(ofSize: 17)
        label.text = "Goodbye, World!"
        label.layer.cornerRadius = 15
        label.layer.backgroundColor = UIColor.gray.cgColor
        label.translatesAutoresizingMaskIntoConstraints = false
        
        view.addSubview(label)
        label.heightAnchor.constraint(equalTo: view.heightAnchor).isActive = true
        label.widthAnchor.constraint(equalTo: view.widthAnchor).isActive = true

        return view
    }

    func updateUIView(_ view: UIView, context: Context) {
    }
}

struct ExperimentView_Previews: PreviewProvider {
    static var previews: some View {
        VStack {
            SwiftUICapsuleView()
            UIKitCapsuleView()
        }
    }
}
Questioner
gtrichar
Viewed
11
DonMag 2020-12-02 01:38:41

你可能想设置背景颜色和圆角view,不是label

你还应该使用全套约束。

试试看:

struct UIKitCapsuleView: UIViewRepresentable {
    func makeUIView(context: Context) -> UIView {
        let view = UIView(frame: .zero)
        view.translatesAutoresizingMaskIntoConstraints = false
        
        // set the view's background color
        view.backgroundColor = .cyan

        // set the cornerRadius on the view's layer
        view.layer.cornerRadius = 15
        
        let label = UILabel(frame: .zero)
        label.numberOfLines = 0
        label.font = UIFont.systemFont(ofSize: 17)
        label.text = "Goodbye, World!"
        
        label.translatesAutoresizingMaskIntoConstraints = false
        
        view.addSubview(label)

        // you can adjust padding here
        let padding: CGFloat = 6
        
        // use full constraints
        NSLayoutConstraint.activate([
            label.topAnchor.constraint(equalTo: view.topAnchor, constant: padding),
            label.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: padding),
            label.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -padding),
            label.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: -padding),
        ])

        return view
    }
    
    func updateUIView(_ view: UIView, context: Context) {
    }
}