Skip to content

Commit

Permalink
Add BlurDesignable support to IB
Browse files Browse the repository at this point in the history
  • Loading branch information
tbaranes committed Feb 2, 2018
1 parent c614e15 commit fca5429
Show file tree
Hide file tree
Showing 2 changed files with 70 additions and 37 deletions.
22 changes: 21 additions & 1 deletion Sources/Others/IB.swift
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
import Foundation

public final class IB: NSObject, CornerDesignable, FillDesignable, BorderDesignable,
RotationDesignable, ShadowDesignable {
RotationDesignable, ShadowDesignable, BlurDesignable {

private let view: UIView

Expand Down Expand Up @@ -120,6 +120,26 @@ public final class IB: NSObject, CornerDesignable, FillDesignable, BorderDesigna
}
}

// MARK: - BlurDesignable

public var blurEffectStyle: UIBlurEffectStyle? {
didSet {
configureBlurEffectStyle(in: view)
}
}

public var vibrancyEffectStyle: UIBlurEffectStyle? {
didSet {
configureBlurEffectStyle(in: view)
}
}

public var blurOpacity: CGFloat = CGFloat.nan {
didSet {
configureBlurEffectStyle(in: view)
}
}

}

// MARK: -
Expand Down
85 changes: 49 additions & 36 deletions Sources/Protocols/Designable/BlurDesignable.swift
Original file line number Diff line number Diff line change
Expand Up @@ -23,34 +23,66 @@ public protocol BlurDesignable: class {
var blurOpacity: CGFloat { get set }
}

public extension BlurDesignable where Self: UIView {
/**
configureBlurEffectStyle method, should be called in layoutSubviews() method
*/
// MARK: - UIView

extension BlurDesignable where Self: UIView {

public func configureBlurEffectStyle() {
configureBlurEffectStyle(for: self)
configureBlurEffectStyle(for: self, in: self)
}

}

// MARK: - UITableView

extension BlurDesignable where Self: UITableView {
public func configureBackgroundBlurEffectStyle() {
guard let blurableView = backgroundView else {
separatorEffect = nil
return
}

configureBlurEffectStyle(for: blurableView, in: self)
guard let blurEffectStyle = blurEffectStyle else {
return
}
if let style = vibrancyEffectStyle {
separatorEffect = UIVibrancyEffect(blurEffect: UIBlurEffect(style: style))
} else {
separatorEffect = UIBlurEffect(style: blurEffectStyle)
}
}
public func configureBlurEffectStyle(for blurableView: UIView) {
}

// MARK: - Common

extension BlurDesignable {

func configureBlurEffectStyle(in view: UIView) {
configureBlurEffectStyle(for: view, in: view)
}

// configureBlurEffectStyle method, should be called in layoutSubviews() method
func configureBlurEffectStyle(for blurableView: UIView, in view: UIView) {
// Used for caching the previous visual effect view
var privateVisualEffectView: PrivateVisualEffectView?

// Remove the existing visual effect view
blurableView.subviews.flatMap { $0 as? PrivateVisualEffectView }
.forEach {
privateVisualEffectView = $0 // Cache it for the subviews
$0.removeFromSuperview()
}
blurableView.subviews.flatMap { $0 as? PrivateVisualEffectView }.forEach {
privateVisualEffectView = $0 // Cache it for the subviews
$0.removeFromSuperview()
}

guard let blurEffectStyle = blurEffectStyle else {
return
}

let blurEffectView = makeVisualEffectView(effect: UIBlurEffect(style: blurEffectStyle))
let blurEffectView = makeVisualEffectView(effect: UIBlurEffect(style: blurEffectStyle), in: view)

// If `vibrancyEffectStyle` has been set, add `vibrancyEffectView` into `blurEffectView`.
if let vibrancyEffectStyle = vibrancyEffectStyle {
let blurEffectStyleForVibrancy = UIBlurEffect(style: vibrancyEffectStyle)
let vibrancyEffectView = makeVisualEffectView(effect: UIVibrancyEffect(blurEffect: blurEffectStyleForVibrancy))
let vibrancyEffectView = makeVisualEffectView(effect: UIVibrancyEffect(blurEffect: blurEffectStyleForVibrancy), in: view)
blurableView.subviews.forEach {
vibrancyEffectView.contentView.addSubview($0)
}
Expand All @@ -69,39 +101,20 @@ public extension BlurDesignable where Self: UIView {

blurableView.insertSubview(blurEffectView, at: 0)
}
}

private extension BlurDesignable where Self: UIView {
func makeVisualEffectView(effect: UIVisualEffect) -> UIVisualEffectView {
private func makeVisualEffectView(effect: UIVisualEffect, in view: UIView) -> UIVisualEffectView {
let visualEffectView = PrivateVisualEffectView(effect: effect)
visualEffectView.alpha = blurOpacity.isNaN ? 1.0 : blurOpacity
if layer.cornerRadius > 0 {
visualEffectView.layer.cornerRadius = layer.cornerRadius
if view.layer.cornerRadius > 0 {
visualEffectView.layer.cornerRadius = view.layer.cornerRadius
visualEffectView.clipsToBounds = true
}

visualEffectView.frame = bounds
visualEffectView.frame = view.bounds
visualEffectView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
return visualEffectView
}
}

public extension BlurDesignable where Self: UITableView {
public func configureBackgroundBlurEffectStyle() {
guard let blurableView = backgroundView else {
separatorEffect = nil
return
}
configureBlurEffectStyle(for: blurableView)
guard let blurEffectStyle = blurEffectStyle else {
return
}
if let style = vibrancyEffectStyle {
separatorEffect = UIVibrancyEffect(blurEffect: UIBlurEffect(style: style))
} else {
separatorEffect = UIBlurEffect(style: blurEffectStyle)
}
}
}

/// Private class of visual effect view used in `BlurDesignable` only
Expand Down

0 comments on commit fca5429

Please sign in to comment.