extension UIButton {
func setSubViewPosition(image anImage: UIImage? = nil,
title: String? = nil,
titlePosition: UIViewContentMode,
additionalSpacing: CGFloat,
state: UIControlState){
self.imageView?.contentMode = .center
self.setImage(anImage, for: state)
let title = title ?? (self.titleLabel?.text ?? "")
positionLabelRespectToImage(title: title,
position: titlePosition,
spacing: additionalSpacing)
self.titleLabel?.contentMode = .center
self.setTitle(title, for: state)
}
private func positionLabelRespectToImage(title: String,
position: UIViewContentMode,
spacing: CGFloat) {
let imageSize = self.imageRect(forContentRect: self.frame)
let titleFont = self.titleLabel?.font!
let titleSize = title.size(withAttributes: [NSAttributedStringKey.font: titleFont!])
var titleInsets: UIEdgeInsets
var imageInsets: UIEdgeInsets
switch (position){
case .top:
let top = -imageSize.height
- titleSize.height
- spacing
let left = -imageSize.width
titleInsets = UIEdgeInsets(top: top,
left: left,
bottom: 0,
right: 0)
imageInsets = UIEdgeInsets(top: 0,
left: 0,
bottom: 0,
right: -titleSize.width)
case .bottom:
let top = imageSize.height
+ titleSize.height
+ spacing
let left = -imageSize.width
titleInsets = UIEdgeInsets(top: top,
left: left,
bottom: 0,
right: 0)
let right = -titleSize.width
imageInsets = UIEdgeInsets(top: 0,
left: 0,
bottom: 0, right: right)
case .left:
let left = -(imageSize.width * 2)
titleInsets = UIEdgeInsets(top: 0,
left:left,
bottom: 0,
right: 0)
let right = -(titleSize.width * 2 + spacing)
imageInsets = UIEdgeInsets(top: 0,
left: 0,
bottom: 0,
right: right)
case .right:
titleInsets = UIEdgeInsets(top: 0,
left: 0,
bottom: 0,
right: -spacing)
imageInsets = UIEdgeInsets(top: 0,
left: 0,
bottom: 0,
right: 0)
default:
titleInsets = UIEdgeInsets(top: 0,
left: 0,
bottom: 0,
right: 0)
imageInsets = UIEdgeInsets(top: 0,
left: 0,
bottom: 0,
right: 0)
}
self.titleEdgeInsets = titleInsets
self.imageEdgeInsets = imageInsets
}
}