Skip to content

Instantly share code, notes, and snippets.

@erica
Last active July 12, 2017 00:41
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save erica/c24017dd643b4dfcf9117909af8127f4 to your computer and use it in GitHub Desktop.
Save erica/c24017dd643b4dfcf9117909af8127f4 to your computer and use it in GitHub Desktop.
A0 B0 Optional("A0") Optional("A0")
A0 B1 Optional("A0") Optional("A0")
A0 B2 Optional("A0") Optional("A0")
A0 B3 Optional("A0") Optional("A0")
A0 B4 Optional("A0") Optional("A0")
A0 B5 Optional("A0") Optional("A0")
A1 B0 Optional("A0") Optional("A0")
A1 B1 Optional("A1") Optional("A1")
A1 B2 Optional("A1") Optional("A1")
A1 B3 Optional("A1") Optional("A1")
A1 B4 Optional("A1") Optional("A1")
A1 B5 Optional("A1") Optional("A1")
A2 B0 Optional("A0") Optional("A0")
A2 B1 Optional("A1") Optional("A1")
A2 B2 Optional("A2") Optional("A2")
A2 B3 Optional("A2") Optional("A2")
A2 B4 Optional("A2") Optional("A2")
A2 B5 Optional("A2") Optional("A2")
A3 B0 Optional("A0") Optional("A0")
A3 B1 Optional("A1") Optional("A1")
A3 B2 Optional("A2") Optional("A2")
A3 B3 Optional("A3") Optional("A3")
A3 B4 Optional("A3") Optional("A3")
A3 B5 Optional("A3") Optional("A3")
A4 B0 Optional("A0") Optional("A0")
A4 B1 Optional("A1") Optional("A1")
A4 B2 Optional("A2") Optional("A2")
A4 B3 Optional("A3") Optional("A3")
A4 B4 Optional("A4") Optional("A4")
A4 B5 Optional("A4") Optional("A4")
A5 B0 Optional("A0") Optional("A0")
A5 B1 Optional("A1") Optional("A1")
A5 B2 Optional("A2") Optional("A2")
A5 B3 Optional("A3") Optional("A3")
A5 B4 Optional("A4") Optional("A4")
A5 B5 Optional("A5") Optional("A5")
A0 A0 Optional("A0") Optional("A0")
A0 A1 Optional("A0") Optional("A0")
A0 A2 Optional("A0") Optional("A0")
A0 A3 Optional("A0") Optional("A0")
A0 A4 Optional("A0") Optional("A0")
A0 A5 Optional("A0") Optional("A0")
A1 A0 Optional("A0") Optional("A0")
A1 A1 Optional("A1") Optional("A1")
A1 A2 Optional("A1") Optional("A1")
A1 A3 Optional("A1") Optional("A1")
A1 A4 Optional("A1") Optional("A1")
A1 A5 Optional("A1") Optional("A1")
A2 A0 Optional("A0") Optional("A0")
A2 A1 Optional("A1") Optional("A1")
A2 A2 Optional("A2") Optional("A2")
A2 A3 Optional("A2") Optional("A2")
A2 A4 Optional("A2") Optional("A2")
A2 A5 Optional("A2") Optional("A2")
A3 A0 Optional("A0") Optional("A0")
A3 A1 Optional("A1") Optional("A1")
A3 A2 Optional("A2") Optional("A2")
A3 A3 Optional("A3") Optional("A3")
A3 A4 Optional("A3") Optional("A3")
A3 A5 Optional("A3") Optional("A3")
A4 A0 Optional("A0") Optional("A0")
A4 A1 Optional("A1") Optional("A1")
A4 A2 Optional("A2") Optional("A2")
A4 A3 Optional("A3") Optional("A3")
A4 A4 Optional("A4") Optional("A4")
A4 A5 Optional("A4") Optional("A4")
A5 A0 Optional("A0") Optional("A0")
A5 A1 Optional("A1") Optional("A1")
A5 A2 Optional("A2") Optional("A2")
A5 A3 Optional("A3") Optional("A3")
A5 A4 Optional("A4") Optional("A4")
A5 A5 Optional("A5") Optional("A5")
import UIKit
public extension UIView {
// Return nearest common ancestor between two views
public func nearestCommonAncestor(with otherView: UIView) -> UIView? {
var mySuperviews = sequence(first: self, next: { $0.superview }).reversed().makeIterator()
var theirSuperviews = sequence(first: otherView, next: { $0.superview }).reversed().makeIterator()
var nca: UIView? = nil
while var mine = mySuperviews.next(), var theirs = theirSuperviews.next(), mine === theirs {
nca = mine
}
return nca
}
public func nca(with otherView: UIView) -> UIView? {
let mySuperviews = sequence(first: self, next: { $0.superview })
let theirSuperviews = Set(sequence(first: otherView, next: { $0.superview }))
return mySuperviews.first(where: theirSuperviews.contains)
}
}
public var sharedNametagKey: UnsafeMutablePointer<UInt8> = UnsafeMutablePointer.allocate(capacity: 1)
public extension NSObject {
public var nametag: String? {
get {return objc_getAssociatedObject(self, &sharedNametagKey) as? String}
set {
if let newNameTag = newValue {
// Store unwrapped new value
objc_setAssociatedObject(self, &sharedNametagKey, newNameTag, .OBJC_ASSOCIATION_RETAIN)
} else {
// Remove by assignment to nil
objc_setAssociatedObject(self, &sharedNametagKey, nil, .OBJC_ASSOCIATION_RETAIN)
}
}
}
}
let viewsA = (0...5).map({ _ in UIView() })
let viewsB = (0...5).map({ _ in UIView() })
(0...4).forEach { viewsA[$0].addSubview(viewsA[$0 + 1])}
(0...5).forEach { viewsA[$0].addSubview(viewsB[$0])}
(0 ... 5).forEach {
viewsA[$0].nametag = "A\($0)"
viewsB[$0].nametag = "B\($0)"
}
for (v1, v2) in CartesianSequence(viewsA, viewsB) {
print(v1.nametag!, v2.nametag!, v1.nearestCommonAncestor(with: v2)?.nametag!, v1.nca(with: v2)?.nametag!)
}
for (v1, v2) in CartesianSequence(viewsA, viewsA) {
print(v1.nametag!, v2.nametag!, v1.nearestCommonAncestor(with: v2)?.nametag!, v1.nca(with: v2)?.nametag!)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment