// // UnreadCountView.swift // NetNewsWire // // Created by Brent Simmons on 11/22/15. // Copyright © 2015 Ranchero Software, LLC. All rights reserved. // import UIKit class FeedUnreadCountView : UIView { var padding: UIEdgeInsets { return UIEdgeInsets(top: 1.0, left: 9.0, bottom: 1.0, right: 9.0) } let cornerRadius = 8.0 let bgColor = AppAssets.controlBackgroundColor var textColor: UIColor { return UIColor.white } var textAttributes: [NSAttributedString.Key: AnyObject] { let textFont = UIFont.preferredFont(forTextStyle: .caption1).bold() return [NSAttributedString.Key.foregroundColor: textColor, NSAttributedString.Key.font: textFont, NSAttributedString.Key.kern: NSNull()] } var textSizeCache = [Int: CGSize]() var unreadCount = 0 { didSet { contentSizeIsValid = false invalidateIntrinsicContentSize() setNeedsDisplay() } } var unreadCountString: String { return unreadCount < 1 ? "" : "\(unreadCount)" } private var contentSizeIsValid = false private var _contentSize = CGSize.zero override init(frame: CGRect) { super.init(frame: frame) self.isOpaque = false } required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) self.isOpaque = false } override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) { textSizeCache = [Int: CGSize]() contentSizeIsValid = false setNeedsDisplay() } var contentSize: CGSize { if !contentSizeIsValid { var size = CGSize.zero if unreadCount > 0 { size = textSize() size.width += (padding.left + padding.right) size.height += (padding.top + padding.bottom) } _contentSize = size contentSizeIsValid = true } return _contentSize } // Prevent autolayout from messing around with our frame settings override var intrinsicContentSize: CGSize { return CGSize(width: UIView.noIntrinsicMetric, height: UIView.noIntrinsicMetric) } func textSize() -> CGSize { if unreadCount < 1 { return CGSize.zero } if let cachedSize = textSizeCache[unreadCount] { return cachedSize } var size = unreadCountString.size(withAttributes: textAttributes) size.height = ceil(size.height) size.width = ceil(size.width) textSizeCache[unreadCount] = size return size } func textRect() -> CGRect { let size = textSize() var r = CGRect.zero r.size = size r.origin.x = (bounds.maxX - padding.right) - r.size.width r.origin.y = padding.top return r } override func draw(_ dirtyRect: CGRect) { let cornerRadii = CGSize(width: cornerRadius, height: cornerRadius) let path = UIBezierPath(roundedRect: bounds, byRoundingCorners: .allCorners, cornerRadii: cornerRadii) bgColor.setFill() path.fill() if unreadCount > 0 { unreadCountString.draw(at: textRect().origin, withAttributes: textAttributes) } } }