myUILabel是一个可以根据文字内容计算出文字在标签上的垂直居中功能的插件。

地址:

http://blog.csdn.net/yexiaozi_007/article/details/8636522

没有做成一个项目,只是两个文件。导入项目,桥接之后,就可正常使用。

拖入组件到Storyboard中,在Identity Inspector中Custom Class的Class设置为myUILabel。如哪里设置这个UILabel的垂直居然中呢?在代码中去设置相应Label的垂直对齐方式即可。

    @IBOutlet weak var textLbel: myUILabel!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        textLbel.verticalAlignment = VerticalAlignmentTop
    }

三种对齐方式分别是:

  • 上:VerticalAlignmentTop

  • 中:VerticalAlignmentMiddle,

  • 下:VerticalAlignmentBottom,

发现一个Swift版的:

https://github.com/clwm01/RCTools/blob/776c2fd555340077aea90a95771bb1f012e9f579/RCToolsDemo/MyUILabel.swift

参考这段代码,我作了一些调整,这段代码可以放到Swift项目中,可以拖入给件建立关联,指定Class为myUILabel后,即能正常使用,也可以直接在以代码的方式创建一个myUILabel也可。

//
//  myUILabel.swift
//  myUILabelDemo
//
//  Created by wyatt on 15/11/29.
//  Copyright © 2015年 Wanqing Wang. All rights reserved.
//

import UIKit

enum VerticalAlignment {
    case Top
    case Middle
    case Bottom
}


class myUILabel: UILabel {
    
    var verticalAlignment: VerticalAlignment = .Bottom {
        willSet {
            self.setNeedsDisplay()
        }
    }
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        self.verticalAlignment = VerticalAlignment.Middle
        
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }
    
    override func textRectForBounds(bounds: CGRect, limitedToNumberOfLines numberOfLines: Int) -> CGRect {
        var textRect = super.textRectForBounds(bounds, limitedToNumberOfLines: numberOfLines)
        switch self.verticalAlignment {
        case .Top:
            textRect.origin.y = bounds.origin.y
        case .Bottom:
            textRect.origin.y = bounds.origin.y + bounds.size.height - textRect.size.height
        case .Middle:
            fallthrough
        default:
            textRect.origin.y = bounds.origin.y + (bounds.size.height - textRect.size.height) / 2

        }
        return textRect
    }


    // Only override drawRect: if you perform custom drawing.
    // An empty implementation adversely affects performance during animation.
    override func drawRect(rect: CGRect) {
        let actualRect = self.textRectForBounds(rect, limitedToNumberOfLines: self.numberOfLines)
        super.drawTextInRect(actualRect)
    }
}

关于required init?(coder aDecoder: NSCoder) 这个初始化方法是必须定义的,Xcode提供的默认的代码是这样的:

 required init(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

但以组件关联的方式就会报错,而如以代码的方式来创建myUILabel的话,却是能正常工作的,当然这不是我所需要的,我需要的是可以直接拖放的方式进行操作即可的。

具体的什么原因Xcode选用这种方式来初始化,我暂时没能想明白。而这个初始化方式是怎么回事,我也还不清楚。

如果你知道怎么回事,还麻烦告诉一下我。


wwq0327
519 声望8 粉丝

业余学做编码。