Commit 068676f9 by Daniel Dahan

development: updated willRenderView to willLayout

parent a969227d
...@@ -63,9 +63,10 @@ open class BarView: ContentView { ...@@ -63,9 +63,10 @@ open class BarView: ContentView {
open override func layoutSubviews() { open override func layoutSubviews() {
super.layoutSubviews() super.layoutSubviews()
if willRenderView { guard willLayout else {
divider.reload() return
} }
divider.reload()
} }
/** /**
......
...@@ -31,27 +31,71 @@ ...@@ -31,27 +31,71 @@
import UIKit import UIKit
open class ContentCard: PulseView { open class ContentCard: PulseView {
/// Will render the view.
open var willLayout: Bool {
return 0 < width && 0 < height && nil != superview
}
/// A preset wrapper around contentInset.
open var contentEdgeInsetsPreset: EdgeInsetsPreset {
get {
return grid.contentEdgeInsetsPreset
}
set(value) {
grid.contentEdgeInsetsPreset = value
}
}
/// A wrapper around grid.contentInset.
@IBInspectable
open var contentEdgeInsets: EdgeInsets {
get {
return grid.contentEdgeInsets
}
set(value) {
grid.contentEdgeInsets = value
}
}
/// A preset wrapper around interimSpace.
open var interimSpacePreset = InterimSpacePreset.none {
didSet {
interimSpace = InterimSpacePresetToValue(preset: interimSpacePreset)
}
}
/// A wrapper around grid.interimSpace.
@IBInspectable
open var interimSpace: InterimSpace {
get {
return grid.interimSpace
}
set(value) {
grid.interimSpace = value
}
}
/// An internal reference to the titleToolbar. /// An internal reference to the titleToolbar.
internal var internalTitleToolbar: Toolbar? internal var internalTitleToolbar: Toolbar?
/// An internal reference to the contentView.
internal var internalContentView: UIView?
/// An internal reference to the detailToolbar.
internal var internalDetailToolbar: Toolbar?
/// A reference to the titleToolbar. /// A reference to the titleToolbar.
open var titleToolbar: Toolbar { open var titleToolbar: Toolbar {
prepareTitleToolbar() prepareTitleToolbar()
return internalTitleToolbar! return internalTitleToolbar!
} }
/// An internal reference to the contentView.
internal var internalContentView: UIView?
/// A reference to the contentView. /// A reference to the contentView.
open var contentView: UIView { open var contentView: UIView {
prepareContentView() prepareContentView()
return internalContentView! return internalContentView!
} }
/// An internal reference to the detailToolbar.
internal var internalDetailToolbar: Toolbar?
/// A reference to the detailToolbar. /// A reference to the detailToolbar.
open var detailToolbar: Toolbar { open var detailToolbar: Toolbar {
prepareDetailToolbar() prepareDetailToolbar()
...@@ -70,15 +114,36 @@ open class ContentCard: PulseView { ...@@ -70,15 +114,36 @@ open class ContentCard: PulseView {
pulseAnimation = .none pulseAnimation = .none
} }
/// Reloads the open override func layoutSubviews() {
open func reload() { super.layoutSubviews()
guard willLayout else {
return
}
// clear constraints so new ones do not conflict // clear constraints so new ones do not conflict
removeConstraints(constraints) removeConstraints(constraints)
for v in subviews { for v in subviews {
v.removeFromSuperview() v.removeFromSuperview()
} }
var h: CGFloat = 0
if let v = internalTitleToolbar {
v.layoutIfNeeded()
h += v.height
}
if let v = internalContentView {
v.layoutIfNeeded()
h += v.height
}
if let v = internalDetailToolbar {
v.layoutIfNeeded()
h += v.height
}
height = h
} }
/// Prepares the titleToolbar. /// Prepares the titleToolbar.
......
...@@ -45,7 +45,7 @@ open class ContentView: View { ...@@ -45,7 +45,7 @@ open class ContentView: View {
} }
/// Will render the view. /// Will render the view.
open var willRenderView: Bool { open var willLayout: Bool {
return 0 < width && 0 < height && nil != superview return 0 < width && 0 < height && nil != superview
} }
...@@ -162,57 +162,59 @@ open class ContentView: View { ...@@ -162,57 +162,59 @@ open class ContentView: View {
open override func layoutSubviews() { open override func layoutSubviews() {
super.layoutSubviews() super.layoutSubviews()
if willRenderView { guard willLayout else {
var lc = 0 return
var rc = 0 }
let l = (CGFloat(leftControls.count) * interimSpace)
let r = (CGFloat(rightControls.count) * interimSpace) var lc = 0
let p = width - l - r - contentEdgeInsets.left - contentEdgeInsets.right var rc = 0
let columns = Int(p / gridFactor) let l = (CGFloat(leftControls.count) * interimSpace)
let r = (CGFloat(rightControls.count) * interimSpace)
grid.begin() let p = width - l - r - contentEdgeInsets.left - contentEdgeInsets.right
grid.views.removeAll() let columns = Int(p / gridFactor)
grid.axis.columns = columns
grid.begin()
for v in leftControls { grid.views.removeAll()
(v as? UIButton)?.contentEdgeInsets = .zero grid.axis.columns = columns
v.sizeToFit()
v.grid.columns = Int(ceil(v.width / gridFactor)) + 1 for v in leftControls {
(v as? UIButton)?.contentEdgeInsets = .zero
lc += v.grid.columns v.sizeToFit()
v.grid.columns = Int(ceil(v.width / gridFactor)) + 1
grid.views.append(v)
}
grid.views.append(contentView) lc += v.grid.columns
for v in rightControls { grid.views.append(v)
(v as? UIButton)?.contentEdgeInsets = .zero }
v.sizeToFit()
v.grid.columns = Int(ceil(v.width / gridFactor)) + 1 grid.views.append(contentView)
rc += v.grid.columns for v in rightControls {
(v as? UIButton)?.contentEdgeInsets = .zero
grid.views.append(v) v.sizeToFit()
} v.grid.columns = Int(ceil(v.width / gridFactor)) + 1
contentView.grid.begin() rc += v.grid.columns
if .center == contentViewAlignment { grid.views.append(v)
if lc < rc { }
contentView.grid.columns = columns - 2 * rc
contentView.grid.offset.columns = rc - lc contentView.grid.begin()
} else {
contentView.grid.columns = columns - 2 * lc if .center == contentViewAlignment {
rightControls.first?.grid.offset.columns = lc - rc if lc < rc {
} contentView.grid.columns = columns - 2 * rc
contentView.grid.offset.columns = rc - lc
} else { } else {
contentView.grid.columns = columns - lc - rc contentView.grid.columns = columns - 2 * lc
rightControls.first?.grid.offset.columns = lc - rc
} }
} else {
grid.commit() contentView.grid.columns = columns - lc - rc
contentView.grid.commit()
} }
grid.commit()
contentView.grid.commit()
} }
/** /**
......
...@@ -270,7 +270,7 @@ open class Menu: View { ...@@ -270,7 +270,7 @@ open class Menu: View {
usingSpringWithDamping: usingSpringWithDamping, usingSpringWithDamping: usingSpringWithDamping,
initialSpringVelocity: initialSpringVelocity, initialSpringVelocity: initialSpringVelocity,
options: options, options: options,
animations: { [weak self, base = base, v = views[i]] in animations: { [base = base, v = views[i]] in
v.alpha = 0 v.alpha = 0
v.y = base.y v.y = base.y
...@@ -366,11 +366,7 @@ open class Menu: View { ...@@ -366,11 +366,7 @@ open class Menu: View {
usingSpringWithDamping: usingSpringWithDamping, usingSpringWithDamping: usingSpringWithDamping,
initialSpringVelocity: initialSpringVelocity, initialSpringVelocity: initialSpringVelocity,
options: options, options: options,
animations: { [weak self, base = base, v = views[i]] in animations: { [base = base, v = views[i]] in
guard let s = self else {
return
}
v.alpha = 0 v.alpha = 0
v.y = base.y + h v.y = base.y + h
...@@ -462,7 +458,7 @@ open class Menu: View { ...@@ -462,7 +458,7 @@ open class Menu: View {
usingSpringWithDamping: usingSpringWithDamping, usingSpringWithDamping: usingSpringWithDamping,
initialSpringVelocity: initialSpringVelocity, initialSpringVelocity: initialSpringVelocity,
options: options, options: options,
animations: { [weak self, v = views[i]] in animations: { [v = views[i]] in
v.alpha = 0 v.alpha = 0
v.x = base.x v.x = base.x
...@@ -553,19 +549,14 @@ open class Menu: View { ...@@ -553,19 +549,14 @@ open class Menu: View {
let w = baseSize.width let w = baseSize.width
for i in 1..<views.count { for i in 1..<views.count {
UIView.animate(withDuration: Double(i) * duration, UIView.animate(withDuration: Double(i) * duration,
delay: delay, delay: delay,
usingSpringWithDamping: usingSpringWithDamping, usingSpringWithDamping: usingSpringWithDamping,
initialSpringVelocity: initialSpringVelocity, initialSpringVelocity: initialSpringVelocity,
options: options, options: options,
animations: { [weak self, base = base, v = views[i]] in animations: { [base = base, v = views[i]] in
guard let s = self else {
return
}
v.alpha = 0 v.alpha = 0
v.x = s.x + w v.x = base.x + w
animations?(v) animations?(v)
}) { [weak self, v = views[i]] _ in }) { [weak self, v = views[i]] _ in
......
...@@ -67,11 +67,7 @@ open class MenuController: RootController { ...@@ -67,11 +67,7 @@ open class MenuController: RootController {
} }
s.rootViewController.view.alpha = 0.25 s.rootViewController.view.alpha = 0.25
}) })
menu.open { [weak self] (view) in menu.open { [completion = completion] (view) in
guard let s = self else {
return
}
completion?(view) completion?(view)
} }
} }
......
...@@ -60,7 +60,7 @@ open class NavigationBar: UINavigationBar { ...@@ -60,7 +60,7 @@ open class NavigationBar: UINavigationBar {
internal var animating = false internal var animating = false
/// Will render the view. /// Will render the view.
open var willRenderView: Bool { open var willLayout: Bool {
return 0 < width && 0 < height && nil != superview return 0 < width && 0 < height && nil != superview
} }
...@@ -190,97 +190,99 @@ open class NavigationBar: UINavigationBar { ...@@ -190,97 +190,99 @@ open class NavigationBar: UINavigationBar {
- Parameter item: A UINavigationItem to layout. - Parameter item: A UINavigationItem to layout.
*/ */
internal func layoutNavigationItem(item: UINavigationItem) { internal func layoutNavigationItem(item: UINavigationItem) {
if willRenderView { guard willLayout else {
prepareItem(item: item) return
prepareTitleView(item: item) }
item.titleView!.frame.origin = .zero prepareItem(item: item)
item.titleView!.frame.size = intrinsicContentSize prepareTitleView(item: item)
item.titleView!.frame.origin = .zero
item.titleView!.frame.size = intrinsicContentSize
var lc = 0 var lc = 0
var rc = 0 var rc = 0
let l = (CGFloat(item.leftControls.count) * interimSpace) let l = (CGFloat(item.leftControls.count) * interimSpace)
let r = (CGFloat(item.rightControls.count) * interimSpace) let r = (CGFloat(item.rightControls.count) * interimSpace)
let p = width - l - r - contentEdgeInsets.left - contentEdgeInsets.right let p = width - l - r - contentEdgeInsets.left - contentEdgeInsets.right
let columns = Int(p / gridFactor) let columns = Int(p / gridFactor)
item.titleView!.grid.begin() item.titleView!.grid.begin()
item.titleView!.grid.views.removeAll() item.titleView!.grid.views.removeAll()
item.titleView!.grid.axis.columns = columns item.titleView!.grid.axis.columns = columns
for v in item.leftControls {
(v as? UIButton)?.contentEdgeInsets = .zero
v.sizeToFit()
v.grid.columns = Int(ceil(v.width / gridFactor)) + 1
for v in item.leftControls { lc += v.grid.columns
(v as? UIButton)?.contentEdgeInsets = .zero
v.sizeToFit()
v.grid.columns = Int(ceil(v.width / gridFactor)) + 1
lc += v.grid.columns
item.titleView!.grid.views.append(v)
}
item.titleView!.grid.views.append(item.contentView) item.titleView!.grid.views.append(v)
}
item.titleView!.grid.views.append(item.contentView)
for v in item.rightControls {
(v as? UIButton)?.contentEdgeInsets = .zero
v.sizeToFit()
v.grid.columns = Int(ceil(v.width / gridFactor)) + 1
for v in item.rightControls { rc += v.grid.columns
(v as? UIButton)?.contentEdgeInsets = .zero
v.sizeToFit()
v.grid.columns = Int(ceil(v.width / gridFactor)) + 1
rc += v.grid.columns
item.titleView!.grid.views.append(v)
}
item.contentView.grid.begin() item.titleView!.grid.views.append(v)
if .center == item.contentViewAlignment { }
if lc < rc {
item.contentView.grid.columns = columns - 2 * rc item.contentView.grid.begin()
item.contentView.grid.offset.columns = rc - lc if .center == item.contentViewAlignment {
} else { if lc < rc {
item.contentView.grid.columns = columns - 2 * lc item.contentView.grid.columns = columns - 2 * rc
item.rightControls.first?.grid.offset.columns = lc - rc item.contentView.grid.offset.columns = rc - lc
}
} else { } else {
item.contentView.grid.columns = columns - lc - rc item.contentView.grid.columns = columns - 2 * lc
item.rightControls.first?.grid.offset.columns = lc - rc
} }
} else {
item.titleView!.grid.interimSpace = interimSpace item.contentView.grid.columns = columns - lc - rc
item.titleView!.grid.contentEdgeInsets = contentEdgeInsets }
item.titleView!.grid.commit()
item.contentView.grid.commit() item.titleView!.grid.interimSpace = interimSpace
item.titleView!.grid.contentEdgeInsets = contentEdgeInsets
// contentView alignment. item.titleView!.grid.commit()
if nil != item.title && "" != item.title { item.contentView.grid.commit()
if nil == item.titleLabel.superview {
item.contentView.addSubview(item.titleLabel) // contentView alignment.
} if nil != item.title && "" != item.title {
item.titleLabel.frame = item.contentView.bounds if nil == item.titleLabel.superview {
} else { item.contentView.addSubview(item.titleLabel)
item.titleLabel.removeFromSuperview() }
item.titleLabel.frame = item.contentView.bounds
} else {
item.titleLabel.removeFromSuperview()
}
if nil != item.detail && "" != item.detail {
if nil == item.detailLabel.superview {
item.contentView.addSubview(item.detailLabel)
} }
if nil != item.detail && "" != item.detail { if nil == item.titleLabel.superview {
if nil == item.detailLabel.superview { item.detailLabel.frame = item.contentView.bounds
item.contentView.addSubview(item.detailLabel)
}
if nil == item.titleLabel.superview {
item.detailLabel.frame = item.contentView.bounds
} else {
item.titleLabel.sizeToFit()
item.detailLabel.sizeToFit()
let diff = (item.contentView.height - item.titleLabel.height - item.detailLabel.height) / 2
item.titleLabel.height += diff
item.titleLabel.width = item.contentView.width
item.detailLabel.height += diff
item.detailLabel.width = item.contentView.width
item.detailLabel.y = item.titleLabel.height
}
} else { } else {
item.detailLabel.removeFromSuperview() item.titleLabel.sizeToFit()
item.detailLabel.sizeToFit()
let diff = (item.contentView.height - item.titleLabel.height - item.detailLabel.height) / 2
item.titleLabel.height += diff
item.titleLabel.width = item.contentView.width
item.detailLabel.height += diff
item.detailLabel.width = item.contentView.width
item.detailLabel.y = item.titleLabel.height
} }
} else {
item.detailLabel.removeFromSuperview()
} }
} }
......
...@@ -92,10 +92,12 @@ open class SearchBar: BarView { ...@@ -92,10 +92,12 @@ open class SearchBar: BarView {
open override func layoutSubviews() { open override func layoutSubviews() {
super.layoutSubviews() super.layoutSubviews()
if willRenderView { guard willLayout else {
textField.frame = contentView.bounds return
layoutClearButton() }
}
textField.frame = contentView.bounds
layoutClearButton()
} }
/** /**
......
...@@ -79,9 +79,11 @@ open class Snackbar: BarView { ...@@ -79,9 +79,11 @@ open class Snackbar: BarView {
open override func layoutSubviews() { open override func layoutSubviews() {
super.layoutSubviews() super.layoutSubviews()
if willRenderView { guard willLayout else {
textLabel.frame = contentView.bounds return
} }
textLabel.frame = contentView.bounds
} }
/** /**
......
...@@ -129,29 +129,31 @@ open class TabBar: BarView { ...@@ -129,29 +129,31 @@ open class TabBar: BarView {
open override func layoutSubviews() { open override func layoutSubviews() {
super.layoutSubviews() super.layoutSubviews()
if willRenderView { guard willLayout else {
guard 0 < buttons.count else { return
return }
}
guard 0 < buttons.count else {
return
}
let columns: Int = contentView.grid.axis.columns / buttons.count let columns: Int = contentView.grid.axis.columns / buttons.count
for b in buttons { for b in buttons {
b.grid.columns = columns b.grid.columns = columns
b.contentEdgeInsets = .zero b.contentEdgeInsets = .zero
b.cornerRadius = 0 b.cornerRadius = 0
if isLineAnimated { if isLineAnimated {
prepareLineAnimationHandler(button: b) prepareLineAnimationHandler(button: b)
}
}
contentView.grid.reload()
if nil == selected {
selected = buttons.first
} }
line.frame = CGRect(x: selected!.x, y: .bottom == lineAlignment ? height - lineHeight : 0, width: selected!.width, height: lineHeight)
} }
contentView.grid.reload()
if nil == selected {
selected = buttons.first
}
line.frame = CGRect(x: selected!.x, y: .bottom == lineAlignment ? height - lineHeight : 0, width: selected!.width, height: lineHeight)
} }
/// Handles the button touch event. /// Handles the button touch event.
......
...@@ -102,39 +102,41 @@ open class Toolbar: BarView { ...@@ -102,39 +102,41 @@ open class Toolbar: BarView {
open override func layoutSubviews() { open override func layoutSubviews() {
super.layoutSubviews() super.layoutSubviews()
if willRenderView { guard willLayout else {
if nil != title && "" != title { return
if nil == titleLabel.superview { }
contentView.addSubview(titleLabel)
} if nil != title && "" != title {
titleLabel.frame = contentView.bounds if nil == titleLabel.superview {
} else { contentView.addSubview(titleLabel)
titleLabel.removeFromSuperview() }
titleLabel.frame = contentView.bounds
} else {
titleLabel.removeFromSuperview()
}
if nil != detail && "" != detail {
if nil == detailLabel.superview {
contentView.addSubview(detailLabel)
} }
if nil != detail && "" != detail { if nil == titleLabel.superview {
if nil == detailLabel.superview { detailLabel.frame = contentView.bounds
contentView.addSubview(detailLabel)
}
if nil == titleLabel.superview {
detailLabel.frame = contentView.bounds
} else {
titleLabel.sizeToFit()
detailLabel.sizeToFit()
let diff: CGFloat = (contentView.height - titleLabel.height - detailLabel.height) / 2
titleLabel.height += diff
titleLabel.width = contentView.width
detailLabel.height += diff
detailLabel.width = contentView.width
detailLabel.y = titleLabel.height
}
} else { } else {
detailLabel.removeFromSuperview() titleLabel.sizeToFit()
detailLabel.sizeToFit()
let diff: CGFloat = (contentView.height - titleLabel.height - detailLabel.height) / 2
titleLabel.height += diff
titleLabel.width = contentView.width
detailLabel.height += diff
detailLabel.width = contentView.width
detailLabel.y = titleLabel.height
} }
} else {
detailLabel.removeFromSuperview()
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment