mirror of https://github.com/SnapKit/SnapKit
Reworked how constraints are stored against installed view
This commit is contained in:
parent
9fe13a042b
commit
0b687e37bd
|
@ -268,13 +268,13 @@ public class Constraint {
|
|||
self.offset = amount
|
||||
return self
|
||||
}
|
||||
|
||||
|
||||
// MARK: install / uninstall
|
||||
|
||||
|
||||
public func install() -> Array<LayoutConstraint> {
|
||||
return self.installOnView(updateExisting: false)
|
||||
}
|
||||
|
||||
|
||||
public func uninstall() {
|
||||
self.uninstallFromView()
|
||||
}
|
||||
|
@ -297,14 +297,14 @@ public class Constraint {
|
|||
} else {
|
||||
installOnView = self.fromItem.view?.superview
|
||||
if installOnView == nil {
|
||||
if self.fromItem.attributes == ConstraintAttributes.Width || self.fromItem.attributes == ConstraintAttributes.Height {
|
||||
installOnView = self.fromItem.view
|
||||
}
|
||||
|
||||
if installedOnView == nil {
|
||||
NSException(name: "Cannot Install Constraint", reason: "Missing superview", userInfo: nil).raise()
|
||||
return []
|
||||
}
|
||||
if self.fromItem.attributes == ConstraintAttributes.Width || self.fromItem.attributes == ConstraintAttributes.Height {
|
||||
installOnView = self.fromItem.view
|
||||
}
|
||||
|
||||
if installedOnView == nil {
|
||||
NSException(name: "Cannot Install Constraint", reason: "Missing superview", userInfo: nil).raise()
|
||||
return []
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -388,40 +388,40 @@ public class Constraint {
|
|||
|
||||
// add constraints
|
||||
installOnView!.addConstraints(layoutConstraints)
|
||||
|
||||
|
||||
self.installedOnView = installOnView
|
||||
self.installedLayoutConstraints = NSHashTable.weakObjectsHashTable()
|
||||
for layoutConstraint in layoutConstraints {
|
||||
self.installedLayoutConstraints!.addObject(layoutConstraint)
|
||||
}
|
||||
|
||||
return layoutConstraints
|
||||
}
|
||||
|
||||
internal func uninstallFromView() {
|
||||
if let view = self.installedOnView {
|
||||
#if os(iOS)
|
||||
var installedConstraints = view.constraints()
|
||||
#else
|
||||
var installedConstraints = view.constraints
|
||||
#endif
|
||||
var constraintsToRemove: Array<LayoutConstraint> = []
|
||||
for installedConstraint in installedConstraints {
|
||||
if let layoutConstraint = installedConstraint as? LayoutConstraint {
|
||||
if layoutConstraint.constraint === self {
|
||||
constraintsToRemove.append(layoutConstraint)
|
||||
}
|
||||
}
|
||||
// remove all installed layout constraints
|
||||
var layoutConstraintsToRemove = Array<LayoutConstraint>()
|
||||
if let installedLayoutConstraints = self.installedLayoutConstraints?.allObjects as? Array<LayoutConstraint> {
|
||||
layoutConstraintsToRemove += installedLayoutConstraints
|
||||
}
|
||||
if constraintsToRemove.count > 0 {
|
||||
view.removeConstraints(constraintsToRemove)
|
||||
|
||||
if layoutConstraintsToRemove.count > 0 {
|
||||
view.removeConstraints(layoutConstraintsToRemove)
|
||||
}
|
||||
|
||||
|
||||
// clean up the snp_installedLayoutConstraints
|
||||
var layoutConstraints = view.snp_installedLayoutConstraints
|
||||
var layoutConstraintsToKeep = Array<LayoutConstraint>()
|
||||
for layoutConstraint in layoutConstraints {
|
||||
if !contains(constraintsToRemove, layoutConstraint) {
|
||||
if !contains(layoutConstraintsToRemove, layoutConstraint) {
|
||||
layoutConstraintsToKeep.append(layoutConstraint)
|
||||
}
|
||||
}
|
||||
view.snp_installedLayoutConstraints = layoutConstraintsToKeep
|
||||
}
|
||||
self.installedOnView = nil
|
||||
self.installedLayoutConstraints = nil
|
||||
}
|
||||
|
||||
// MARK: private
|
||||
|
@ -434,6 +434,7 @@ public class Constraint {
|
|||
private var priority: Float = 1000.0
|
||||
private var offset: Any?
|
||||
|
||||
private var installedLayoutConstraints: NSHashTable?
|
||||
private weak var installedOnView: View?
|
||||
|
||||
private func addConstraint(attributes: ConstraintAttributes) -> Constraint {
|
||||
|
|
Loading…
Reference in New Issue