diff --git a/.travis.yml b/.travis.yml index 8565bda..af40f39 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,5 +1,5 @@ language: objective-c -osx_image: xcode7 +osx_image: xcode7.3 branches: only: - master diff --git a/ISSUE_TEMPLATE.md b/ISSUE_TEMPLATE.md index 15d85b7..eaa5e58 100644 --- a/ISSUE_TEMPLATE.md +++ b/ISSUE_TEMPLATE.md @@ -1,25 +1,11 @@ ### New Issue Checklist -- [ ] I have looked at the [Documentation](http://snapkit.io/docs) -- [ ] I have read the [F.A.Q.](http://snapkit.io/faq) - -### Environment / Configuration - -##### Platform - -* [ ] OS X -* [ ] iOS - -##### Versions - +* I have looked at the [Documentation](http://snapkit.io/docs): `INSERT yes/no` +* I have read the [F.A.Q.](http://snapkit.io/faq): `INSERT yes/no` +* Platform is: `INSERT iOS/OSX/tvOS` * Platform version is: `INSERT PLATFORM VERSION` * SnapKit version is: `INSERT SNAPKIT VERSION` - -##### Integration - -- [ ] Carthage -- [ ] Cocoapods -- [ ] Manually / Other +* Integration method is: `INSERT carthage/cocoapods/manually/other` ### Issue diff --git a/SnapKit.podspec b/SnapKit.podspec index 5f69fa7..c0b19ec 100644 --- a/SnapKit.podspec +++ b/SnapKit.podspec @@ -1,12 +1,12 @@ Pod::Spec.new do |s| s.name = 'SnapKit' - s.version = '0.19.1' + s.version = '0.20.0' s.license = 'MIT' s.summary = 'Harness the power of auto layout with a simplified, chainable, and compile time safe syntax.' s.homepage = 'https://github.com/SnapKit/SnapKit' s.authors = { 'Robert Payne' => 'robertpayne@me.com' } s.social_media_url = 'http://twitter.com/robertjpayne' - s.source = { :git => 'https://github.com/SnapKit/SnapKit.git', :tag => '0.19.1' } + s.source = { :git => 'https://github.com/SnapKit/SnapKit.git', :tag => '0.20.0' } s.ios.deployment_target = '8.0' s.osx.deployment_target = '10.10' diff --git a/Source/Constraint.swift b/Source/Constraint.swift index 5d57e02..4f291e6 100644 --- a/Source/Constraint.swift +++ b/Source/Constraint.swift @@ -193,15 +193,18 @@ internal class ConcreteConstraint: Constraint { } } + private let label: String? + private var installInfo: ConcreteConstraintInstallInfo? = nil - internal init(fromItem: ConstraintItem, toItem: ConstraintItem, relation: ConstraintRelation, constant: Any, multiplier: Float, priority: Float) { + internal init(fromItem: ConstraintItem, toItem: ConstraintItem, relation: ConstraintRelation, constant: Any, multiplier: Float, priority: Float, label: String? = nil) { self.fromItem = fromItem self.toItem = toItem self.relation = relation self.constant = constant self.multiplier = multiplier self.priority = priority + self.label = label } internal func installOnView(updateExisting updateExisting: Bool = false, file: String? = nil, line: UInt? = nil) -> [LayoutConstraint] { @@ -269,6 +272,7 @@ internal class ConcreteConstraint: Constraint { attribute: layoutToAttribute, multiplier: CGFloat(self.multiplier), constant: layoutConstant) + layoutConstraint.identifier = self.label // set priority layoutConstraint.priority = self.priority diff --git a/Source/ConstraintDescription.swift b/Source/ConstraintDescription.swift index 2fc8d84..6eb5492 100644 --- a/Source/ConstraintDescription.swift +++ b/Source/ConstraintDescription.swift @@ -34,6 +34,8 @@ public protocol ConstraintDescriptionFinalizable: class { var constraint: Constraint { get } + func labeled(label: String) -> ConstraintDescriptionFinalizable + } /** @@ -191,6 +193,7 @@ internal class ConstraintDescription: ConstraintDescriptionExtendable, Constrain internal var centerX: ConstraintDescriptionExtendable { return self.addConstraint(ConstraintAttributes.CenterX) } internal var centerY: ConstraintDescriptionExtendable { return self.addConstraint(ConstraintAttributes.CenterY) } internal var baseline: ConstraintDescriptionExtendable { return self.addConstraint(ConstraintAttributes.Baseline) } + internal var label: String? @available(iOS 8.0, *) internal var firstBaseline: ConstraintDescriptionExtendable { return self.addConstraint(ConstraintAttributes.FirstBaseline) } @@ -487,11 +490,17 @@ internal class ConstraintDescription: ConstraintDescriptionExtendable, Constrain relation: self.relation!, constant: self.constant, multiplier: self.multiplier, - priority: self.priority) + priority: self.priority, + label: self.label) } return self.concreteConstraint! } + func labeled(label: String) -> ConstraintDescriptionFinalizable { + self.label = label + return self + } + // MARK: Private private let fromItem: ConstraintItem diff --git a/Source/View+SnapKit.swift b/Source/View+SnapKit.swift index 8672b81..a6ed6e4 100644 --- a/Source/View+SnapKit.swift +++ b/Source/View+SnapKit.swift @@ -127,7 +127,7 @@ public extension View { :returns: the constraints made */ - public func snp_prepareConstraints(file: String = __FILE__, line: UInt = __LINE__, @noescape closure: (make: ConstraintMaker) -> Void) -> [Constraint] { + public func snp_prepareConstraints(file: String = #file, line: UInt = #line, @noescape closure: (make: ConstraintMaker) -> Void) -> [Constraint] { return ConstraintMaker.prepareConstraints(view: self, file: file, line: line, closure: closure) } @@ -136,7 +136,7 @@ public extension View { :param: closure that will be passed the `ConstraintMaker` to make the constraints with */ - public func snp_makeConstraints(file: String = __FILE__, line: UInt = __LINE__, @noescape closure: (make: ConstraintMaker) -> Void) -> Void { + public func snp_makeConstraints(file: String = #file, line: UInt = #line, @noescape closure: (make: ConstraintMaker) -> Void) -> Void { ConstraintMaker.makeConstraints(view: self, file: file, line: line, closure: closure) } @@ -147,7 +147,7 @@ public extension View { :param: closure that will be passed the `ConstraintMaker` to update the constraints with */ - public func snp_updateConstraints(file: String = __FILE__, line: UInt = __LINE__, @noescape closure: (make: ConstraintMaker) -> Void) -> Void { + public func snp_updateConstraints(file: String = #file, line: UInt = #line, @noescape closure: (make: ConstraintMaker) -> Void) -> Void { ConstraintMaker.updateConstraints(view: self, file: file, line: line, closure: closure) } @@ -156,7 +156,7 @@ public extension View { :param: closure that will be passed the `ConstraintMaker` to remake the constraints with */ - public func snp_remakeConstraints(file: String = __FILE__, line: UInt = __LINE__, @noescape closure: (make: ConstraintMaker) -> Void) -> Void { + public func snp_remakeConstraints(file: String = #file, line: UInt = #line, @noescape closure: (make: ConstraintMaker) -> Void) -> Void { ConstraintMaker.remakeConstraints(view: self, file: file, line: line, closure: closure) } diff --git a/Tests/Tests.swift b/Tests/Tests.swift index e21c85d..eea55b9 100644 --- a/Tests/Tests.swift +++ b/Tests/Tests.swift @@ -249,4 +249,17 @@ class SnapKitTests: XCTestCase { XCTAssertEqual(constraints[1].constant, 50, "Should be 50") } + func testConstraintIdentifier() { + let identifier = "Test-Identifier" + let view = View() + self.container.addSubview(view) + + view.snp_makeConstraints { (make) -> Void in + make.top.equalTo(self.container.snp_top).labeled(identifier) + } + + let constraints = container.snp_constraints as! [NSLayoutConstraint] + XCTAssertEqual(constraints[0].identifier, identifier, "Identifier should be 'Test'") + } + }