ios - 以编程方式填充图像

标签 ios swift

我需要创建一个组件来快速显示带有标签的图像。

我创建了一个类,它扩展了 UIStackView 并放置了一个 ImageView 和一个 UILabel 并且它起作用了。

问题:结果很难看,我需要在 UIImage 周围添加一些填充。我试图将图像包含在比 UIImage 更大的 UIView 中,但它使图像消失了!在运行时,会显示此警告消息:

Probably at least one of the constraints in the following list is one you don't want. 
Try this: 
    (1) look at each constraint and try to figure out which you don't expect; 
    (2) find the code that added the unwanted constraint or constraints and fix it. 
(Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints) 
(
"<NSAutoresizingMaskLayoutConstraint:0x60000009e820 h=--& v=--& UIImageView:0x7fea7fc02850.width == 0   (active)>",
"<NSLayoutConstraint:0x60400009b4e0 UIImageView:0x7fea7fc02850.width == 40   (active)>"
)

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x60400009b4e0 UIImageView:0x7fea7fc02850.width == 40   (active)>

所以,出于我不明白的原因,图像自动获得约束 width = 0,它丢弃约束 width = 40

代码如下:

class HeaderView: UIStackView {

    var label: UILabel = UILabel()

    override init(frame: CGRect) {
        super.init(frame: frame)
    }

    required init(coder: NSCoder) {
        super.init(coder: coder)
    }

    func setup(title: String, image: UIImage?) {
        axis = UILayoutConstraintAxis.horizontal
        let imgView = UIImageView()
        imgView.image = image!
        imgView.widthAnchor.constraint(equalToConstant: 40).isActive = true
        imgView.heightAnchor.constraint(equalToConstant: 40).isActive = true

        let paddedView = UIView()
        paddedView.addSubview(imgView)
        paddedView.widthAnchor.constraint(equalToConstant: 50).isActive = true
        paddedView.heightAnchor.constraint(equalToConstant: 50).isActive = true

        addArrangedSubview(paddedView)

        label.text = title
        addArrangedSubview(label)
    }
}

最佳答案

  • 您应该将 translatesAutoresizingMaskIntoConstraints 设置为 false 以避免与自动布局冲突。
  • imgViewpaddedView 中的位置不明确。最好将 imgView 的边缘约束到 paddedView 而不是直接设置 imgView 大小。
  • 正如@Luzo 提到的,您需要更改堆栈 View 对齐方式,因为默认情况下它是.fill

这是代码

func setup(title: String, image: UIImage?) {
    axis = .vertical
    alignment = .center

    label.text = title

    let imageView = UIImageView(image: image)
    imageView.translatesAutoresizingMaskIntoConstraints = false

    let containerView = UIView()
    containerView.translatesAutoresizingMaskIntoConstraints = false
    containerView.addSubview(imageView)

    NSLayoutConstraint.activate([
        imageView.topAnchor.constraint(equalTo: containerView.topAnchor, constant: 10.0),
        imageView.leadingAnchor.constraint(equalTo: containerView.leadingAnchor, constant: 10.0),
        imageView.trailingAnchor.constraint(equalTo: containerView.trailingAnchor, constant: -10.0),
        imageView.bottomAnchor.constraint(equalTo: containerView.bottomAnchor, constant: -10.0),
        containerView.heightAnchor.constraint(equalToConstant: 50.0),
        containerView.widthAnchor.constraint(equalToConstant: 50.0)
    ])

    stackView.addArrangedSubview(containerView)
    stackView.addArrangedSubview(label)
}

关于ios - 以编程方式填充图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47857703/

相关文章:

ios - swift iOS : custom keyboard only slightly different from default keyboard

ios - 将特定的 NSTimeInterval 传递给 setMinimumBackgroundFetchInterval 是一种好习惯吗?

swift - 如何迭代有序集?

ios - 如何通过HTTP POST将字符“&”发送到带有iOS 7的服务器?

objective-c - iPad 将图像显示得很大 - 但不应该

ios - 改变 UIView 相对于 UITableview 的高度

objective-c - 如何在 Swift 中调用也有多个参数的 Objective C 方法

ios - 通过 Carthage 导入和使用 Swift SnapshotTesting 框架

ios - UITableView 无法正确地为在屏幕外重新排序的单元格设置动画

ios - 在哪里放置模式 TabBarController 的“关闭”按钮