Skip to content

Commit

Permalink
update CardPartIconLabel drawText and intrinsicContentSize calculatio…
Browse files Browse the repository at this point in the history
…ns to be compatible with multiline text (#206)
  • Loading branch information
Ryan Cole authored and croossin committed Dec 6, 2019
1 parent 080de20 commit 03a5ee1
Showing 1 changed file with 16 additions and 11 deletions.
27 changes: 16 additions & 11 deletions CardParts/src/Classes/Card Parts/CardPartIconLabel.swift
Original file line number Diff line number Diff line change
Expand Up @@ -75,8 +75,15 @@ public class CardPartIconLabel: UILabel, CardPartView {
self.clipsToBounds = true
}

private func getAdjustedTextSize() -> CGSize? {
guard let text = text as NSString?, let icon = icon else { return nil }
return text.boundingRect(with: CGSize(width: frame.width - icon.size.width - iconPadding - padding * 2, height: .greatestFiniteMagnitude),
options: NSStringDrawingOptions.usesLineFragmentOrigin,
attributes: [.font : font as Any ],
context: nil).size
}

open override func drawText(in rect: CGRect) {
guard let text = text as NSString? else { return }

guard let icon = icon else {
super.drawText(in: rect)
Expand All @@ -88,10 +95,7 @@ public class CardPartIconLabel: UILabel, CardPartView {
iconView = UIImageView(image: icon)

//calculate frame of the text based on content.
let size = text.boundingRect(with: CGSize(width: frame.width - icon.size.width - iconPadding, height: .greatestFiniteMagnitude),
options: NSStringDrawingOptions.usesLineFragmentOrigin,
attributes: [.font : font as Any ],
context: nil).size
guard let size = getAdjustedTextSize() else { return }

var newRect = CGRect.zero
guard let iconView = iconView else { return }
Expand All @@ -108,18 +112,18 @@ public class CardPartIconLabel: UILabel, CardPartView {
newRect = CGRect(x: iconView.frame.width + iconPadding + padding, y: 0, width: frame.width - (iconView.frame.width + iconPadding), height: height)
}else if textAlignment == .right {
iconView.frame = iconView.frame.offsetBy(dx: frame.width - size.width - iconPadding - iconView.frame.width - padding, dy: iconYPosition)
newRect = CGRect(x: frame.width - size.width - iconPadding - padding , y: 0, width: size.width + iconPadding, height: height)
newRect = CGRect(x: frame.width - size.width - padding , y: 0, width: size.width, height: height)
}else if textAlignment == .center {
iconView.frame = iconView.frame.offsetBy(dx: (frame.width - size.width) / 2 - iconPadding - iconView.frame.width, dy: iconYPosition)
newRect = CGRect(x: (frame.width - size.width) / 2 , y: 0, width: size.width + iconPadding, height: height)
newRect = CGRect(x: (frame.width - size.width) / 2 , y: 0, width: size.width, height: height)
}
case .right:
if textAlignment == .left {
iconView.frame = iconView.frame.offsetBy(dx: size.width + iconPadding + padding, dy: iconYPosition)
newRect = CGRect(x: 0, y: 0, width: size.width, height: height)
newRect = CGRect(x: padding, y: 0, width: size.width, height: height)
}else if textAlignment == .right {
iconView.frame = iconView.frame.offsetBy(dx: frame.width - iconView.frame.width - padding , dy: iconYPosition)
newRect = CGRect(x: frame.width - size.width - iconView.frame.width - iconPadding - 2 * padding, y: 0, width: size.width + iconPadding, height: height)
newRect = CGRect(x: frame.width - size.width - iconView.frame.width - iconPadding - padding, y: 0, width: size.width, height: height)
}else if textAlignment == .center {
iconView.frame = iconView.frame.offsetBy(dx: frame.width / 2 + size.width / 2 + iconPadding, dy: iconYPosition)
newRect = CGRect(x: (frame.width - size.width) / 2, y: 0, width: size.width, height: height)
Expand All @@ -142,8 +146,9 @@ public class CardPartIconLabel: UILabel, CardPartView {

/// returns new size with updated vertical and horizantal padding.
public override var intrinsicContentSize: CGSize {
let superSize = super.intrinsicContentSize
let newWidth = superSize.width + superSize.height + (2 * horizontalPadding)
let superSize = getAdjustedTextSize() ?? super.intrinsicContentSize
let iconWidth : CGFloat = iconView?.frame.width ?? 0.0
let newWidth = superSize.width + iconPadding + iconWidth + (padding * 2) + (2 * horizontalPadding)
let newHeight = superSize.height + (2 * verticalPadding)
let size = CGSize(width: newWidth, height: newHeight)
return size
Expand Down

0 comments on commit 03a5ee1

Please sign in to comment.