Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 添加imageView时UILabel文本截断对齐错误_Swift_Uiimageview_Uiimage_Uilabel_Subclass - Fatal编程技术网

Swift 添加imageView时UILabel文本截断对齐错误

Swift 添加imageView时UILabel文本截断对齐错误,swift,uiimageview,uiimage,uilabel,subclass,Swift,Uiimageview,Uiimage,Uilabel,Subclass,我有一个子类UILabel,我将用于IB中大约10个不同长度的标签(全部在一行!)。每个标签中的文本都是静态的 此子类UILabel应在文本左侧显示一个imageView。此图像视图将保留一个小图标 它几乎可以工作了,除了从下面的屏幕截图中看到的奇怪的截断和对齐 模拟器: class ImageMarkLabel: UILabel { var labelHeight:CGFloat = 0.0 let smileView = UIView() let smileImag

我有一个子类UILabel,我将用于IB中大约10个不同长度的标签(全部在一行!)。每个标签中的文本都是静态的

此子类UILabel应在文本左侧显示一个imageView。此图像视图将保留一个小图标

它几乎可以工作了,除了从下面的屏幕截图中看到的奇怪的截断和对齐

模拟器:

class ImageMarkLabel: UILabel {

    var labelHeight:CGFloat = 0.0
    let smileView = UIView()
    let smileImageView = UIImageView()

    required init(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)!
        self.commonInit()

    }

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

    override func layoutSubviews() {
        super.layoutSubviews()
        uiStuff()
    }

    func uiStuff() {
        labelHeight = self.frame.height
        smileView.frame = CGRect(x: 0, y: 0, width: labelHeight, height: labelHeight)
        smileImageView.image = UIImage(named: "smile")
        smileImageView.frame = CGRect(x: 0, y: 0, width: smileView.frame.width, height: smileView.frame.height)
    }

    func commonInit(){
        smileView.addSubview(smileImageView)
        self.addSubview(smileView)
    }

    override func drawText(in rect: CGRect) {
        var insets = UIEdgeInsets()
        if UIDevice.current.userInterfaceIdiom == .pad {
            insets = UIEdgeInsets(top: 0, left: labelHeight + 10.0, bottom: 0, right: labelHeight + 10.0)
        }
        else {
            insets = UIEdgeInsets(top: 0, left: labelHeight + 5.0, bottom: 0, right: labelHeight + 5.0)
        }
        super.drawText(in: rect.inset(by: insets))
    }

}

情节提要设置:

class ImageMarkLabel: UILabel {

    var labelHeight:CGFloat = 0.0
    let smileView = UIView()
    let smileImageView = UIImageView()

    required init(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)!
        self.commonInit()

    }

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

    override func layoutSubviews() {
        super.layoutSubviews()
        uiStuff()
    }

    func uiStuff() {
        labelHeight = self.frame.height
        smileView.frame = CGRect(x: 0, y: 0, width: labelHeight, height: labelHeight)
        smileImageView.image = UIImage(named: "smile")
        smileImageView.frame = CGRect(x: 0, y: 0, width: smileView.frame.width, height: smileView.frame.height)
    }

    func commonInit(){
        smileView.addSubview(smileImageView)
        self.addSubview(smileView)
    }

    override func drawText(in rect: CGRect) {
        var insets = UIEdgeInsets()
        if UIDevice.current.userInterfaceIdiom == .pad {
            insets = UIEdgeInsets(top: 0, left: labelHeight + 10.0, bottom: 0, right: labelHeight + 10.0)
        }
        else {
            insets = UIEdgeInsets(top: 0, left: labelHeight + 5.0, bottom: 0, right: labelHeight + 5.0)
        }
        super.drawText(in: rect.inset(by: insets))
    }

}

这是我的代码:

class ImageMarkLabel: UILabel {

    var labelHeight:CGFloat = 0.0
    let smileView = UIView()
    let smileImageView = UIImageView()

    required init(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)!
        self.commonInit()

    }

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

    override func layoutSubviews() {
        super.layoutSubviews()
        uiStuff()
    }

    func uiStuff() {
        labelHeight = self.frame.height
        smileView.frame = CGRect(x: 0, y: 0, width: labelHeight, height: labelHeight)
        smileImageView.image = UIImage(named: "smile")
        smileImageView.frame = CGRect(x: 0, y: 0, width: smileView.frame.width, height: smileView.frame.height)
    }

    func commonInit(){
        smileView.addSubview(smileImageView)
        self.addSubview(smileView)
    }

    override func drawText(in rect: CGRect) {
        var insets = UIEdgeInsets()
        if UIDevice.current.userInterfaceIdiom == .pad {
            insets = UIEdgeInsets(top: 0, left: labelHeight + 10.0, bottom: 0, right: labelHeight + 10.0)
        }
        else {
            insets = UIEdgeInsets(top: 0, left: labelHeight + 5.0, bottom: 0, right: labelHeight + 5.0)
        }
        super.drawText(in: rect.inset(by: insets))
    }

}
关于自动布局-所有标签都在垂直堆栈视图中


如何使文本和图像视图居中而不导致任何文本截断?

UIStuff方法中更改框架

class ImageMarkLabel: UILabel {

    var labelHeight:CGFloat = 0.0
    let smileView = UIView()
    let smileImageView = UIImageView()

    required init(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)!
        self.commonInit()

    }

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

    override func layoutSubviews() {
        super.layoutSubviews()
        uiStuff()
    }

    func uiStuff() {
        labelHeight = self.frame.height
        smileView.frame = CGRect(x: 0, y: 0, width: labelHeight, height: labelHeight)
        smileImageView.image = UIImage(named: "smile")
        smileImageView.frame = CGRect(x: 0, y: 0, width: smileView.frame.width, height: smileView.frame.height)

        var insets = UIEdgeInsets()
        if UIDevice.current.userInterfaceIdiom == .pad {
            insets = UIEdgeInsets(top: 0, left: (labelHeight + 10.0), bottom: 0, right: (labelHeight + 10.0))
        }
        else {
            insets = UIEdgeInsets(top: 0, left: (labelHeight + 5.0), bottom: 0, right: (labelHeight + 5.0))
        }
        let newRect = CGRect(origin: self.frame.origin, size: CGSize(width: self.frame.width + 2*insets.left, height: self.frame.height))
        self.frame = newRect
    }

    func commonInit(){
        smileView.addSubview(smileImageView)
        self.addSubview(smileView)

    }

    override func drawText(in rect: CGRect) {
        super.drawText(in: rect)
    }

}
输出:

class ImageMarkLabel: UILabel {

    var labelHeight:CGFloat = 0.0
    let smileView = UIView()
    let smileImageView = UIImageView()

    required init(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)!
        self.commonInit()

    }

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

    override func layoutSubviews() {
        super.layoutSubviews()
        uiStuff()
    }

    func uiStuff() {
        labelHeight = self.frame.height
        smileView.frame = CGRect(x: 0, y: 0, width: labelHeight, height: labelHeight)
        smileImageView.image = UIImage(named: "smile")
        smileImageView.frame = CGRect(x: 0, y: 0, width: smileView.frame.width, height: smileView.frame.height)
    }

    func commonInit(){
        smileView.addSubview(smileImageView)
        self.addSubview(smileView)
    }

    override func drawText(in rect: CGRect) {
        var insets = UIEdgeInsets()
        if UIDevice.current.userInterfaceIdiom == .pad {
            insets = UIEdgeInsets(top: 0, left: labelHeight + 10.0, bottom: 0, right: labelHeight + 10.0)
        }
        else {
            insets = UIEdgeInsets(top: 0, left: labelHeight + 5.0, bottom: 0, right: labelHeight + 5.0)
        }
        super.drawText(in: rect.inset(by: insets))
    }

}

UIStuff方法中更改帧

class ImageMarkLabel: UILabel {

    var labelHeight:CGFloat = 0.0
    let smileView = UIView()
    let smileImageView = UIImageView()

    required init(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)!
        self.commonInit()

    }

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

    override func layoutSubviews() {
        super.layoutSubviews()
        uiStuff()
    }

    func uiStuff() {
        labelHeight = self.frame.height
        smileView.frame = CGRect(x: 0, y: 0, width: labelHeight, height: labelHeight)
        smileImageView.image = UIImage(named: "smile")
        smileImageView.frame = CGRect(x: 0, y: 0, width: smileView.frame.width, height: smileView.frame.height)

        var insets = UIEdgeInsets()
        if UIDevice.current.userInterfaceIdiom == .pad {
            insets = UIEdgeInsets(top: 0, left: (labelHeight + 10.0), bottom: 0, right: (labelHeight + 10.0))
        }
        else {
            insets = UIEdgeInsets(top: 0, left: (labelHeight + 5.0), bottom: 0, right: (labelHeight + 5.0))
        }
        let newRect = CGRect(origin: self.frame.origin, size: CGSize(width: self.frame.width + 2*insets.left, height: self.frame.height))
        self.frame = newRect
    }

    func commonInit(){
        smileView.addSubview(smileImageView)
        self.addSubview(smileView)

    }

    override func drawText(in rect: CGRect) {
        super.drawText(in: rect)
    }

}
输出:

class ImageMarkLabel: UILabel {

    var labelHeight:CGFloat = 0.0
    let smileView = UIView()
    let smileImageView = UIImageView()

    required init(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)!
        self.commonInit()

    }

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

    override func layoutSubviews() {
        super.layoutSubviews()
        uiStuff()
    }

    func uiStuff() {
        labelHeight = self.frame.height
        smileView.frame = CGRect(x: 0, y: 0, width: labelHeight, height: labelHeight)
        smileImageView.image = UIImage(named: "smile")
        smileImageView.frame = CGRect(x: 0, y: 0, width: smileView.frame.width, height: smileView.frame.height)
    }

    func commonInit(){
        smileView.addSubview(smileImageView)
        self.addSubview(smileView)
    }

    override func drawText(in rect: CGRect) {
        var insets = UIEdgeInsets()
        if UIDevice.current.userInterfaceIdiom == .pad {
            insets = UIEdgeInsets(top: 0, left: labelHeight + 10.0, bottom: 0, right: labelHeight + 10.0)
        }
        else {
            insets = UIEdgeInsets(top: 0, left: labelHeight + 5.0, bottom: 0, right: labelHeight + 5.0)
        }
        super.drawText(in: rect.inset(by: insets))
    }

}

更改每个标签的背景色(不同)并向我们显示结果。@dahiya_boy完成!堆栈视图是否有任何约束?居中水平/居中垂直更改每个标签的背景颜色(不同)并向我们显示结果。@dahiya_男孩完成!堆栈视图是否有任何限制??水平居中/垂直居中图像视图应仅位于文本开头左侧约10点处,而不是标签开头处。@如果共享虚拟项目,效果会更好。图像视图应仅位于文本开头左侧约10点处,不是标签的开头。@如果共享虚拟项目,效果会更好。