251 lines
11 KiB
Swift
251 lines
11 KiB
Swift
// The MIT License (MIT)
|
|
// Copyright © 2017 Ivan Varabei (varabeis@icloud.com)
|
|
//
|
|
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
// of this software and associated documentation files (the "Software"), to deal
|
|
// in the Software without restriction, including without limitation the rights
|
|
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
// copies of the Software, and to permit persons to whom the Software is
|
|
// furnished to do so, subject to the following conditions:
|
|
//
|
|
// The above copyright notice and this permission notice shall be included in all
|
|
// copies or substantial portions of the Software.
|
|
//
|
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
// SOFTWARE.
|
|
|
|
import UIKit
|
|
|
|
open class SPFakeBarView: UIView {
|
|
|
|
public var style: SPFakeBarNavigationStyle = .small {
|
|
didSet {
|
|
self.updateStyle()
|
|
}
|
|
}
|
|
|
|
private var settedHeight: CGFloat = 0
|
|
public var height: CGFloat {
|
|
get {
|
|
return (self.settedHeight) + (self.addStatusBarHeight ? UIApplication.shared.statusBarFrame.height : 0)
|
|
}
|
|
set {
|
|
self.settedHeight = newValue
|
|
self.updateHeight()
|
|
}
|
|
|
|
}
|
|
|
|
public var addStatusBarHeight: Bool = true {
|
|
didSet {
|
|
self.updateHeight()
|
|
}
|
|
}
|
|
|
|
public var elementsColor: UIColor = SPFakeBarView.navigationElementsColor {
|
|
didSet {
|
|
self.leftButton.setTitleColor(self.elementsColor, for: .normal)
|
|
self.leftButton.setTitleColor(self.elementsColor.withAlphaComponent(0.7), for: .highlighted)
|
|
self.rightButton.setTitleColor(self.elementsColor, for: .normal)
|
|
self.rightButton.setTitleColor(self.elementsColor.withAlphaComponent(0.7), for: .highlighted)
|
|
}
|
|
}
|
|
|
|
public var closeButtonPossition: CloseButtonPosition = .none {
|
|
didSet {
|
|
self.leftButton.titleLabel?.font = UIFont.systemFont(ofSize: 17, weight: .regular)
|
|
self.rightButton.titleLabel?.font = UIFont.systemFont(ofSize: 17, weight: .regular)
|
|
switch self.closeButtonPossition {
|
|
case .left:
|
|
self.leftButton.titleLabel?.font = UIFont.systemFont(ofSize: 17, weight: .semibold)
|
|
case .right:
|
|
self.rightButton.titleLabel?.font = UIFont.systemFont(ofSize: 17, weight: .semibold)
|
|
case .none:
|
|
break
|
|
}
|
|
}
|
|
}
|
|
|
|
public var titleLabel = UILabel.init()
|
|
public var subtitleLabel = UILabel.init()
|
|
public var leftButton = UIButton.init()
|
|
public var rightButton = UIButton.init()
|
|
|
|
public let separatorView = UIView()
|
|
public let blurView: UIVisualEffectView = {
|
|
let effect = UIBlurEffect(style: .extraLight)
|
|
return UIVisualEffectView.init(effect: effect)
|
|
}()
|
|
|
|
private var titleBottomConstraint: NSLayoutConstraint?
|
|
private var heightConstraint: NSLayoutConstraint?
|
|
private var topConstraint: NSLayoutConstraint?
|
|
private var leadingConstraint: NSLayoutConstraint?
|
|
private var trailingConstraint: NSLayoutConstraint?
|
|
|
|
public init(style: SPFakeBarNavigationStyle) {
|
|
super.init(frame: CGRect.zero)
|
|
self.style = style
|
|
self.commonInit()
|
|
}
|
|
|
|
required public init?(coder aDecoder: NSCoder) {
|
|
super.init(coder: aDecoder)
|
|
self.style = .small
|
|
self.commonInit()
|
|
}
|
|
|
|
private func commonInit() {
|
|
self.translatesAutoresizingMaskIntoConstraints = false
|
|
|
|
self.addSubview(self.blurView)
|
|
self.blurView.translatesAutoresizingMaskIntoConstraints = false
|
|
self.blurView.leadingAnchor.constraint(equalTo: self.leadingAnchor).isActive = true
|
|
self.blurView.trailingAnchor.constraint(equalTo: self.trailingAnchor).isActive = true
|
|
self.blurView.topAnchor.constraint(equalTo: self.topAnchor).isActive = true
|
|
self.blurView.bottomAnchor.constraint(equalTo: self.bottomAnchor).isActive = true
|
|
|
|
self.addSubview(self.separatorView)
|
|
self.separatorView.backgroundColor = UIColor.init(red: 191 / 255.0, green: 191 / 255.0, blue: 191 / 255.0, alpha: 1)
|
|
self.separatorView.translatesAutoresizingMaskIntoConstraints = false
|
|
self.separatorView.leadingAnchor.constraint(equalTo: self.leadingAnchor).isActive = true
|
|
self.separatorView.trailingAnchor.constraint(equalTo: self.trailingAnchor).isActive = true
|
|
self.separatorView.bottomAnchor.constraint(equalTo: self.bottomAnchor).isActive = true
|
|
self.separatorView.heightAnchor.constraint(equalToConstant: 0.5).isActive = true
|
|
|
|
self.addSubview(self.titleLabel)
|
|
self.titleLabel.translatesAutoresizingMaskIntoConstraints = false
|
|
self.titleLabel.leadingAnchor.constraint(equalTo: self.leadingAnchor, constant: 16).isActive = true
|
|
self.titleLabel.trailingAnchor.constraint(equalTo: self.trailingAnchor, constant: -16).isActive = true
|
|
self.titleBottomConstraint = self.titleLabel.bottomAnchor.constraint(equalTo: self.bottomAnchor, constant: -12)
|
|
self.titleBottomConstraint?.isActive = true
|
|
|
|
self.addSubview(self.subtitleLabel)
|
|
self.subtitleLabel.textColor = UIColor.init(red: 142 / 255.0, green: 142 / 255.0, blue: 146 / 255.0, alpha: 1)
|
|
self.subtitleLabel.font = UIFont.systemFont(ofSize: 13, weight: .semibold)
|
|
self.subtitleLabel.translatesAutoresizingMaskIntoConstraints = false
|
|
self.subtitleLabel.leadingAnchor.constraint(equalTo: self.leadingAnchor, constant: 16).isActive = true
|
|
self.subtitleLabel.trailingAnchor.constraint(equalTo: self.trailingAnchor, constant: -16).isActive = true
|
|
self.subtitleLabel.bottomAnchor.constraint(equalTo: self.titleLabel.topAnchor, constant: 0).isActive = true
|
|
|
|
self.leftButton.setTitleColor(self.elementsColor, for: .normal)
|
|
self.leftButton.setTitleColor(self.elementsColor.withAlphaComponent(0.7), for: .highlighted)
|
|
self.leftButton.titleLabel?.textAlignment = .left
|
|
self.leftButton.titleLabel?.font = UIFont.systemFont(ofSize: 16, weight: .semibold)
|
|
self.leftButton.contentEdgeInsets = UIEdgeInsets(top: 0, left: 17, bottom: 0, right: 0)
|
|
self.addSubview(self.leftButton)
|
|
self.leftButton.translatesAutoresizingMaskIntoConstraints = false
|
|
self.leftButton.leadingAnchor.constraint(equalTo: self.leadingAnchor).isActive = true
|
|
self.leftButton.bottomAnchor.constraint(equalTo: self.bottomAnchor, constant: -12).isActive = true
|
|
|
|
self.rightButton.setTitleColor(self.elementsColor, for: .normal)
|
|
self.rightButton.setTitleColor(self.elementsColor.withAlphaComponent(0.7), for: .highlighted)
|
|
self.rightButton.titleLabel?.textAlignment = .right
|
|
self.rightButton.titleLabel?.font = UIFont.systemFont(ofSize: 17, weight: .semibold)
|
|
self.rightButton.contentEdgeInsets = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 16)
|
|
self.addSubview(self.rightButton)
|
|
self.rightButton.translatesAutoresizingMaskIntoConstraints = false
|
|
self.rightButton.trailingAnchor.constraint(equalTo: self.trailingAnchor).isActive = true
|
|
self.rightButton.bottomAnchor.constraint(equalTo: self.bottomAnchor, constant: -12).isActive = true
|
|
|
|
self.closeButtonPossition = .none
|
|
|
|
self.setContraints()
|
|
self.updateStyle()
|
|
}
|
|
|
|
override open func layoutSubviews() {
|
|
super.layoutSubviews()
|
|
self.setContraints()
|
|
}
|
|
|
|
private func setContraints() {
|
|
if let superview = self.superview {
|
|
if self.topConstraint == nil {
|
|
|
|
self.topConstraint = self.topAnchor.constraint(equalTo: superview.topAnchor)
|
|
self.topConstraint?.isActive = true
|
|
self.leadingConstraint = self.leadingAnchor.constraint(equalTo: superview.leadingAnchor)
|
|
self.leadingConstraint?.isActive = true
|
|
self.trailingConstraint = self.trailingAnchor.constraint(equalTo: superview.trailingAnchor)
|
|
self.trailingConstraint?.isActive = true
|
|
|
|
self.heightConstraint = self.heightAnchor.constraint(equalToConstant: self.height)
|
|
self.heightConstraint?.isActive = true
|
|
self.updateHeight()
|
|
}
|
|
}
|
|
}
|
|
|
|
private func updateStyle() {
|
|
switch self.style {
|
|
case .small:
|
|
if UIApplication.shared.statusBarFrame.height == 44 {
|
|
self.height = 88 - 44
|
|
self.titleBottomConstraint?.constant = -12
|
|
} else {
|
|
self.height = 64 - 20
|
|
self.titleBottomConstraint?.constant = -12
|
|
}
|
|
self.addStatusBarHeight = true
|
|
self.titleLabel.font = UIFont.systemFont(ofSize: 17, weight: .semibold)
|
|
self.titleLabel.textAlignment = .center
|
|
case .stork:
|
|
self.height = 66
|
|
self.titleBottomConstraint?.constant = -12
|
|
self.addStatusBarHeight = false
|
|
self.titleLabel.font = UIFont.systemFont(ofSize: 17, weight: .semibold)
|
|
self.titleLabel.textAlignment = .center
|
|
case .large:
|
|
if UIApplication.shared.statusBarFrame.height == 44 {
|
|
self.height = 140 - 44
|
|
self.titleBottomConstraint?.constant = -8
|
|
} else {
|
|
self.height = 116 - 20
|
|
self.titleBottomConstraint?.constant = -4
|
|
}
|
|
self.addStatusBarHeight = true
|
|
self.titleLabel.font = UIFont.systemFont(ofSize: 34, weight: .bold)
|
|
self.titleLabel.textAlignment = .left
|
|
break
|
|
case .noContent:
|
|
self.height = 0
|
|
self.addStatusBarHeight = true
|
|
}
|
|
|
|
self.updateConstraints()
|
|
}
|
|
|
|
private func updateHeight() {
|
|
self.heightConstraint?.constant = self.height
|
|
self.updateConstraints()
|
|
}
|
|
|
|
public enum CloseButtonPosition {
|
|
case left
|
|
case right
|
|
case none
|
|
}
|
|
}
|
|
|
|
extension SPFakeBarView {
|
|
|
|
static var navigationElementsColor: UIColor {
|
|
get {
|
|
if UINavigationBar.appearance().tintColor != nil {
|
|
return UINavigationBar.appearance().tintColor
|
|
} else {
|
|
return UIColor.init(red: 0 / 255.0, green: 122 / 255.0, blue: 255 / 255.0, alpha: 1)
|
|
}
|
|
}
|
|
set {
|
|
UINavigationBar.appearance().tintColor = newValue
|
|
}
|
|
}
|
|
}
|