diff --git a/Example/JJFloatingActionButton/ConfigurationExampleViewController.swift b/Example/JJFloatingActionButton/ConfigurationExampleViewController.swift index d35bf2f..a5b3096 100644 --- a/Example/JJFloatingActionButton/ConfigurationExampleViewController.swift +++ b/Example/JJFloatingActionButton/ConfigurationExampleViewController.swift @@ -65,7 +65,6 @@ class ConfigurationExampleViewController: UIViewController { item.bottomAnchor.constraint(equalTo: previousView.topAnchor, constant: -5).isActive = true item.leftAnchor.constraint(equalTo: previousView.rightAnchor, constant: -2).isActive = true previousItem = item - } } diff --git a/Example/Tests/AnimationConfigurationSpec.swift b/Example/Tests/AnimationConfigurationSpec.swift index 7b7ef2b..76e1137 100644 --- a/Example/Tests/AnimationConfigurationSpec.swift +++ b/Example/Tests/AnimationConfigurationSpec.swift @@ -29,7 +29,6 @@ import Quick import XCTest class AnimationConfigurationSpec: QuickSpec { - let pixelTolerance = 0.5 override class func spec() { describe("JJFloatingActionButton") { var actionButton: JJFloatingActionButton! @@ -51,7 +50,8 @@ class AnimationConfigurationSpec: QuickSpec { actionButton.addItem(image: #imageLiteral(resourceName: "Balloon")) actionButton.addItem(image: #imageLiteral(resourceName: "Owl")) - setNimbleTolerance(0.003) + setNimbleTolerance(0.01) + setNimblePixelTolerance(0.01) } it("is on the right side of the screen") { @@ -71,7 +71,7 @@ class AnimationConfigurationSpec: QuickSpec { it("it looks correct") { actionButton.open(animated: false) - expect(superview).to(haveValidSnapshot(pixelTolerance: 0.01)) + expect(superview).to(haveValidSnapshot()) } } @@ -84,7 +84,7 @@ class AnimationConfigurationSpec: QuickSpec { it("it looks correct") { actionButton.open(animated: false) - expect(superview).to(haveValidSnapshot(pixelTolerance: 0.01)) + expect(superview).to(haveValidSnapshot()) } } @@ -96,7 +96,7 @@ class AnimationConfigurationSpec: QuickSpec { it("it looks correct") { actionButton.open(animated: false) - expect(superview).to(haveValidSnapshot(pixelTolerance: 0.01)) + expect(superview).to(haveValidSnapshot()) } } @@ -114,7 +114,7 @@ class AnimationConfigurationSpec: QuickSpec { actionButton.open(animated: false) - expect(superview).to(haveValidSnapshot(pixelTolerance: 0.01)) + expect(superview).to(haveValidSnapshot()) } it("it looks correct with 2 items") { @@ -123,7 +123,7 @@ class AnimationConfigurationSpec: QuickSpec { actionButton.open(animated: false) - expect(superview).to(haveValidSnapshot(pixelTolerance: 0.01)) + expect(superview).to(haveValidSnapshot()) } it("it looks correct with 1 item") { @@ -132,7 +132,7 @@ class AnimationConfigurationSpec: QuickSpec { actionButton.open(animated: false) - expect(superview).to(haveValidSnapshot(pixelTolerance: 0.01)) + expect(superview).to(haveValidSnapshot()) } it("looks correct when item have background color") { @@ -146,7 +146,7 @@ class AnimationConfigurationSpec: QuickSpec { actionButton.open(animated: false) - expect(superview).to(haveValidSnapshot(pixelTolerance: 0.01)) + expect(superview).to(haveValidSnapshot()) } it("it looks correct when opened and closed") { @@ -157,7 +157,7 @@ class AnimationConfigurationSpec: QuickSpec { actionButton.open(animated: false) actionButton.close(animated: false) - expect(superview).to(haveValidSnapshot(pixelTolerance: 0.01)) + expect(superview).to(haveValidSnapshot()) } } @@ -170,7 +170,7 @@ class AnimationConfigurationSpec: QuickSpec { it("it looks correct") { actionButton.open(animated: false) - expect(superview).to(haveValidSnapshot(pixelTolerance: 0.01)) + expect(superview).to(haveValidSnapshot()) } } @@ -190,7 +190,7 @@ class AnimationConfigurationSpec: QuickSpec { actionButton.open(animated: false) - expect(superview).to(haveValidSnapshot(pixelTolerance: 0.01)) + expect(superview).to(haveValidSnapshot()) } it("it looks correct with horizontal offset") { @@ -199,7 +199,7 @@ class AnimationConfigurationSpec: QuickSpec { actionButton.open(animated: false) - expect(superview).to(haveValidSnapshot(pixelTolerance: 0.01)) + expect(superview).to(haveValidSnapshot()) } it("it looks correct with items offsetted") { @@ -208,7 +208,7 @@ class AnimationConfigurationSpec: QuickSpec { actionButton.open(animated: false) - expect(superview).to(haveValidSnapshot(pixelTolerance: 0.01)) + expect(superview).to(haveValidSnapshot()) } it("it looks correct with circular offset items") { @@ -217,7 +217,7 @@ class AnimationConfigurationSpec: QuickSpec { actionButton.open(animated: false) - expect(superview).to(haveValidSnapshot(pixelTolerance: 0.01)) + expect(superview).to(haveValidSnapshot()) } } } @@ -240,7 +240,8 @@ class AnimationConfigurationSpec: QuickSpec { actionButton.addItem(image: #imageLiteral(resourceName: "Balloon")) actionButton.addItem(image: #imageLiteral(resourceName: "Owl")) - setNimbleTolerance(0.002) + setNimbleTolerance(0.01) + setNimblePixelTolerance(0.01) } it("is on the left side of the screen") { @@ -261,7 +262,7 @@ class AnimationConfigurationSpec: QuickSpec { actionButton.open(animated: false) - expect(superview).to(haveValidSnapshot(pixelTolerance: 0.01)) + expect(superview).to(haveValidSnapshot()) } it("it looks correct with 2 items") { @@ -270,7 +271,7 @@ class AnimationConfigurationSpec: QuickSpec { actionButton.open(animated: false) - expect(superview).to(haveValidSnapshot(pixelTolerance: 0.01)) + expect(superview).to(haveValidSnapshot()) } it("it looks correct with 1 item") { @@ -279,7 +280,7 @@ class AnimationConfigurationSpec: QuickSpec { actionButton.open(animated: false) - expect(superview).to(haveValidSnapshot(pixelTolerance: 0.01)) + expect(superview).to(haveValidSnapshot()) } } @@ -299,7 +300,7 @@ class AnimationConfigurationSpec: QuickSpec { actionButton.open(animated: false) - expect(superview).to(haveValidSnapshot(pixelTolerance: 0.01)) + expect(superview).to(haveValidSnapshot()) } it("it looks correct with items offsetted") { @@ -308,7 +309,7 @@ class AnimationConfigurationSpec: QuickSpec { actionButton.open(animated: false) - expect(superview).to(haveValidSnapshot(pixelTolerance: 0.01)) + expect(superview).to(haveValidSnapshot()) } it("it looks correct with circular offset items") { @@ -317,7 +318,7 @@ class AnimationConfigurationSpec: QuickSpec { actionButton.open(animated: false) - expect(superview).to(haveValidSnapshot(pixelTolerance: 0.01)) + expect(superview).to(haveValidSnapshot()) } } @@ -348,11 +349,10 @@ class AnimationConfigurationSpec: QuickSpec { it("looks correct") { actionButton.open(animated: false) - expect(superview).to(haveValidSnapshot(pixelTolerance: 0.01)) + expect(superview).to(haveValidSnapshot()) } - // disabled for now. Fails on older operating systems. ToDo! - xit("looks correct with slide in configuration") { + it("looks correct with slide in configuration") { let configuration = JJItemAnimationConfiguration() configuration.openState = JJItemPreparation { item, _, _, _ in item.alpha = 1 @@ -366,5 +366,43 @@ class AnimationConfigurationSpec: QuickSpec { } } } + + describe("JJFloatingActionButton in center") { + var actionButton: JJFloatingActionButton! + var superview: UIView! + + beforeEach { + let superviewFrame = CGRect(origin: .zero, size: CGSize(width: 300, height: 400)) + let actionButtonFrame = CGRect(origin: CGPoint(x: 132, y: 330), size: CGSize(width: 56, height: 56)) + + superview = UIView(frame: superviewFrame) + superview.backgroundColor = .white + + actionButton = JJFloatingActionButton(frame: actionButtonFrame) + superview.addSubview(actionButton) + + actionButton.addItem(image: #imageLiteral(resourceName: "Like")) + actionButton.addItem(image: #imageLiteral(resourceName: "Balloon")) + actionButton.addItem(image: #imageLiteral(resourceName: "Owl")) + + setNimbleTolerance(0.01) + setNimblePixelTolerance(0.01) + } + + context("when using circular pop up style with custom angles") { + beforeEach { + actionButton.itemAnimationConfiguration = .circularPopUp(withRadius: 80, + angleForItem: { index, numberOfItems, _ in + CGFloat.pi + CGFloat(index) * CGFloat.pi / (CGFloat(numberOfItems) - 1) + }) + } + + it("it looks correct") { + actionButton.open(animated: false) + + expect(superview).to(haveValidSnapshot()) + } + } + } } } diff --git a/Example/Tests/JJActionItemSpec.swift b/Example/Tests/JJActionItemSpec.swift index 6b9d5c4..4a883b7 100644 --- a/Example/Tests/JJActionItemSpec.swift +++ b/Example/Tests/JJActionItemSpec.swift @@ -44,7 +44,7 @@ class JJActionItemSpec: QuickSpec { actionItem.circleView.widthAnchor.constraint(equalToConstant: 40).isActive = true actionItem.circleView.heightAnchor.constraint(equalToConstant: 40).isActive = true - setNimbleTolerance(0.002) + setNimbleTolerance(0.01) } it("looks correct") { @@ -104,13 +104,11 @@ class JJActionItemSpec: QuickSpec { } it("looks correct with smaller image size") { - setNimbleTolerance(0.005) actionItem.imageSize = CGSize(width: 10, height: 10) expect(actionItem).to(haveValidSnapshot()) } it("looks correct with bigger image size") { - setNimbleTolerance(0.025) actionItem.imageSize = CGSize(width: 30, height: 30) expect(actionItem).to(haveValidSnapshot()) } @@ -132,7 +130,7 @@ class JJActionItemSpec: QuickSpec { actionItem?.circleView.widthAnchor.constraint(equalToConstant: 40).isActive = true actionItem?.circleView.heightAnchor.constraint(equalToConstant: 40).isActive = true - setNimbleTolerance(0.002) + setNimbleTolerance(0.01) } it("looks correct") { diff --git a/Example/Tests/JJFloatingActionButtonSpec.swift b/Example/Tests/JJFloatingActionButtonSpec.swift index 3df5ffd..2c7f929 100644 --- a/Example/Tests/JJFloatingActionButtonSpec.swift +++ b/Example/Tests/JJFloatingActionButtonSpec.swift @@ -44,7 +44,8 @@ class JJFloatingActionButtonSpec: QuickSpec { actionButton = JJFloatingActionButton(frame: actionButtonFrame) superview.addSubview(actionButton) - setNimbleTolerance(0.004) + setNimbleTolerance(0.01) + setNimblePixelTolerance(0.01) } it("does not open") { @@ -58,13 +59,13 @@ class JJFloatingActionButtonSpec: QuickSpec { } it("looks correct by default") { - expect(superview).to(haveValidSnapshot(pixelTolerance: 0.01)) + expect(superview).to(haveValidSnapshot()) } it("looks correct highlighted") { actionButton.isHighlighted = true expect(actionButton.isHighlighted).to(beTrue()) - expect(superview).to(haveValidSnapshot(pixelTolerance: 0.01)) + expect(superview).to(haveValidSnapshot()) } it("looks correct highlighted with dark color") { @@ -72,7 +73,7 @@ class JJFloatingActionButtonSpec: QuickSpec { actionButton.highlightedButtonColor = nil actionButton.isHighlighted = true expect(actionButton.isHighlighted).to(beTrue()) - expect(superview).to(haveValidSnapshot(pixelTolerance: 0.01)) + expect(superview).to(haveValidSnapshot()) } it("looks correct highlighted with light color") { @@ -80,14 +81,14 @@ class JJFloatingActionButtonSpec: QuickSpec { actionButton.highlightedButtonColor = nil actionButton.isHighlighted = true expect(actionButton.isHighlighted).to(beTrue()) - expect(superview).to(haveValidSnapshot(pixelTolerance: 0.01)) + expect(superview).to(haveValidSnapshot()) } it("looks correct highlighted with custom color") { actionButton.highlightedButtonColor = .orange actionButton.isHighlighted = true expect(actionButton.isHighlighted).to(beTrue()) - expect(superview).to(haveValidSnapshot(pixelTolerance: 0.01)) + expect(superview).to(haveValidSnapshot()) } it("looks correct configured") { @@ -120,7 +121,7 @@ class JJFloatingActionButtonSpec: QuickSpec { actionButton.open(animated: false) - expect(superview).to(haveValidSnapshot(pixelTolerance: 0.01)) + expect(superview).to(haveValidSnapshot()) } it("looks correct configured after adding the items") { @@ -152,7 +153,7 @@ class JJFloatingActionButtonSpec: QuickSpec { actionButton.open(animated: false) - expect(superview).to(haveValidSnapshot(pixelTolerance: 0.01)) + expect(superview).to(haveValidSnapshot()) } it("looks correct with items configured with closure") { @@ -183,17 +184,17 @@ class JJFloatingActionButtonSpec: QuickSpec { actionButton.addItem(title: "456", image: #imageLiteral(resourceName: "Balloon")) actionButton.open(animated: false) - expect(superview).to(haveValidSnapshot(pixelTolerance: 0.01)) + expect(superview).to(haveValidSnapshot()) } it("looks correct with smaller image size") { actionButton.buttonImageSize = CGSize(width: 10, height: 10) - expect(superview).to(haveValidSnapshot(pixelTolerance: 0.01)) + expect(superview).to(haveValidSnapshot()) } it("looks correct with bigger image size") { actionButton.buttonImageSize = CGSize(width: 40, height: 40) - expect(superview).to(haveValidSnapshot(pixelTolerance: 0.01)) + expect(superview).to(haveValidSnapshot()) } context("when multiple items are added") { @@ -238,14 +239,14 @@ class JJFloatingActionButtonSpec: QuickSpec { } it("items look correct") { - expect(superview).to(haveValidSnapshot(pixelTolerance: 0.01)) + expect(superview).to(haveValidSnapshot()) } it("items look correct highlighted") { let item = actionButton.items[0] item.isHighlighted = true expect(item.isHighlighted).to(beTrue()) - expect(superview).to(haveValidSnapshot(pixelTolerance: 0.01)) + expect(superview).to(haveValidSnapshot()) } it("items look correct highlighted with custom highlighted color") { @@ -253,7 +254,7 @@ class JJFloatingActionButtonSpec: QuickSpec { item.circleView.highlightedColor = .purple item.isHighlighted = true expect(item.isHighlighted).to(beTrue()) - expect(superview).to(haveValidSnapshot(pixelTolerance: 0.01)) + expect(superview).to(haveValidSnapshot()) } it("can't be opened again") { @@ -370,7 +371,7 @@ class JJFloatingActionButtonSpec: QuickSpec { } it("looks correct") { - expect(superview).to(haveValidSnapshot(pixelTolerance: 0.01)) + expect(superview).to(haveValidSnapshot()) } it("can't be closed again") { @@ -529,7 +530,7 @@ class JJFloatingActionButtonSpec: QuickSpec { it("looks correct when opened") { actionButton.open(animated: false) - expect(superview).to(haveValidSnapshot(pixelTolerance: 0.01)) + expect(superview).to(haveValidSnapshot()) } } @@ -547,12 +548,12 @@ class JJFloatingActionButtonSpec: QuickSpec { } it("looks correct") { - expect(superview).to(haveValidSnapshot(pixelTolerance: 0.01)) + expect(superview).to(haveValidSnapshot()) } it("looks correct when opened") { actionButton.open(animated: false) - expect(superview).to(haveValidSnapshot(pixelTolerance: 0.01)) + expect(superview).to(haveValidSnapshot()) } } @@ -598,7 +599,7 @@ class JJFloatingActionButtonSpec: QuickSpec { } it("looks correct") { - expect(superview).to(haveValidSnapshot(pixelTolerance: 0.01)) + expect(superview).to(haveValidSnapshot()) } context("and button is tapped") { @@ -625,7 +626,7 @@ class JJFloatingActionButtonSpec: QuickSpec { } it("looks correct") { - expect(superview).to(haveValidSnapshot(pixelTolerance: 0.01)) + expect(superview).to(haveValidSnapshot()) } } @@ -640,7 +641,7 @@ class JJFloatingActionButtonSpec: QuickSpec { } it("looks correct") { - expect(superview).to(haveValidSnapshot(pixelTolerance: 0.01)) + expect(superview).to(haveValidSnapshot()) } } } @@ -676,7 +677,7 @@ class JJFloatingActionButtonSpec: QuickSpec { } it("looks correct") { - expect(actionButton).to(haveValidSnapshot(pixelTolerance: 0.01)) + expect(actionButton).to(haveValidSnapshot()) } } @@ -724,12 +725,12 @@ class JJFloatingActionButtonSpec: QuickSpec { } it("looks correct") { - expect(superview).to(haveValidSnapshot(pixelTolerance: 0.01)) + expect(superview).to(haveValidSnapshot()) } it("looks correct when diameter is set") { actionButton.buttonDiameter = 100 - expect(superview).to(haveValidSnapshot(pixelTolerance: 0.01)) + expect(superview).to(haveValidSnapshot()) } } } diff --git a/Example/Tests/ReferenceImages/AnimationConfigurationSpec/JJFloatingActionButton__when_using_circular_pop_up_style__it_looks_correct_when_opened_and_closed@2x.png b/Example/Tests/ReferenceImages/AnimationConfigurationSpec/JJFloatingActionButton__when_using_circular_pop_up_style__it_looks_correct_when_opened_and_closed@2x.png index 0e383d3..216ec10 100644 Binary files a/Example/Tests/ReferenceImages/AnimationConfigurationSpec/JJFloatingActionButton__when_using_circular_pop_up_style__it_looks_correct_when_opened_and_closed@2x.png and b/Example/Tests/ReferenceImages/AnimationConfigurationSpec/JJFloatingActionButton__when_using_circular_pop_up_style__it_looks_correct_when_opened_and_closed@2x.png differ diff --git a/Example/Tests/ReferenceImages/AnimationConfigurationSpec/JJFloatingActionButton__when_using_circular_pop_up_style__it_looks_correct_with_1_item@2x.png b/Example/Tests/ReferenceImages/AnimationConfigurationSpec/JJFloatingActionButton__when_using_circular_pop_up_style__it_looks_correct_with_1_item@2x.png index 1e54618..758a955 100644 Binary files a/Example/Tests/ReferenceImages/AnimationConfigurationSpec/JJFloatingActionButton__when_using_circular_pop_up_style__it_looks_correct_with_1_item@2x.png and b/Example/Tests/ReferenceImages/AnimationConfigurationSpec/JJFloatingActionButton__when_using_circular_pop_up_style__it_looks_correct_with_1_item@2x.png differ diff --git a/Example/Tests/ReferenceImages/AnimationConfigurationSpec/JJFloatingActionButton__when_using_circular_pop_up_style__it_looks_correct_with_2_items@2x.png b/Example/Tests/ReferenceImages/AnimationConfigurationSpec/JJFloatingActionButton__when_using_circular_pop_up_style__it_looks_correct_with_2_items@2x.png index 7f207db..178c014 100644 Binary files a/Example/Tests/ReferenceImages/AnimationConfigurationSpec/JJFloatingActionButton__when_using_circular_pop_up_style__it_looks_correct_with_2_items@2x.png and b/Example/Tests/ReferenceImages/AnimationConfigurationSpec/JJFloatingActionButton__when_using_circular_pop_up_style__it_looks_correct_with_2_items@2x.png differ diff --git a/Example/Tests/ReferenceImages/AnimationConfigurationSpec/JJFloatingActionButton__when_using_circular_pop_up_style__it_looks_correct_with_3_items@2x.png b/Example/Tests/ReferenceImages/AnimationConfigurationSpec/JJFloatingActionButton__when_using_circular_pop_up_style__it_looks_correct_with_3_items@2x.png index fdd2be0..5290560 100644 Binary files a/Example/Tests/ReferenceImages/AnimationConfigurationSpec/JJFloatingActionButton__when_using_circular_pop_up_style__it_looks_correct_with_3_items@2x.png and b/Example/Tests/ReferenceImages/AnimationConfigurationSpec/JJFloatingActionButton__when_using_circular_pop_up_style__it_looks_correct_with_3_items@2x.png differ diff --git a/Example/Tests/ReferenceImages/AnimationConfigurationSpec/JJFloatingActionButton__when_using_circular_pop_up_style__looks_correct_when_item_have_background_color@2x.png b/Example/Tests/ReferenceImages/AnimationConfigurationSpec/JJFloatingActionButton__when_using_circular_pop_up_style__looks_correct_when_item_have_background_color@2x.png index 9c20e2d..72acf8c 100644 Binary files a/Example/Tests/ReferenceImages/AnimationConfigurationSpec/JJFloatingActionButton__when_using_circular_pop_up_style__looks_correct_when_item_have_background_color@2x.png and b/Example/Tests/ReferenceImages/AnimationConfigurationSpec/JJFloatingActionButton__when_using_circular_pop_up_style__looks_correct_when_item_have_background_color@2x.png differ diff --git a/Example/Tests/ReferenceImages/AnimationConfigurationSpec/JJFloatingActionButton__when_using_circular_slide_in_style__it_looks_correct@2x.png b/Example/Tests/ReferenceImages/AnimationConfigurationSpec/JJFloatingActionButton__when_using_circular_slide_in_style__it_looks_correct@2x.png index 2af242a..0694c51 100644 Binary files a/Example/Tests/ReferenceImages/AnimationConfigurationSpec/JJFloatingActionButton__when_using_circular_slide_in_style__it_looks_correct@2x.png and b/Example/Tests/ReferenceImages/AnimationConfigurationSpec/JJFloatingActionButton__when_using_circular_slide_in_style__it_looks_correct@2x.png differ diff --git a/Example/Tests/ReferenceImages/AnimationConfigurationSpec/JJFloatingActionButton__when_using_custom_item_animation_configuration__it_looks_correct_with_circular_offset_items@2x.png b/Example/Tests/ReferenceImages/AnimationConfigurationSpec/JJFloatingActionButton__when_using_custom_item_animation_configuration__it_looks_correct_with_circular_offset_items@2x.png index 9b5ae97..bcbc877 100644 Binary files a/Example/Tests/ReferenceImages/AnimationConfigurationSpec/JJFloatingActionButton__when_using_custom_item_animation_configuration__it_looks_correct_with_circular_offset_items@2x.png and b/Example/Tests/ReferenceImages/AnimationConfigurationSpec/JJFloatingActionButton__when_using_custom_item_animation_configuration__it_looks_correct_with_circular_offset_items@2x.png differ diff --git a/Example/Tests/ReferenceImages/AnimationConfigurationSpec/JJFloatingActionButton__when_using_custom_item_animation_configuration__it_looks_correct_with_horizontal_offset@2x.png b/Example/Tests/ReferenceImages/AnimationConfigurationSpec/JJFloatingActionButton__when_using_custom_item_animation_configuration__it_looks_correct_with_horizontal_offset@2x.png index d768613..6ffcdc5 100644 Binary files a/Example/Tests/ReferenceImages/AnimationConfigurationSpec/JJFloatingActionButton__when_using_custom_item_animation_configuration__it_looks_correct_with_horizontal_offset@2x.png and b/Example/Tests/ReferenceImages/AnimationConfigurationSpec/JJFloatingActionButton__when_using_custom_item_animation_configuration__it_looks_correct_with_horizontal_offset@2x.png differ diff --git a/Example/Tests/ReferenceImages/AnimationConfigurationSpec/JJFloatingActionButton__when_using_custom_item_animation_configuration__it_looks_correct_with_items_offsetted@2x.png b/Example/Tests/ReferenceImages/AnimationConfigurationSpec/JJFloatingActionButton__when_using_custom_item_animation_configuration__it_looks_correct_with_items_offsetted@2x.png index 22d7818..4f4f0b2 100644 Binary files a/Example/Tests/ReferenceImages/AnimationConfigurationSpec/JJFloatingActionButton__when_using_custom_item_animation_configuration__it_looks_correct_with_items_offsetted@2x.png and b/Example/Tests/ReferenceImages/AnimationConfigurationSpec/JJFloatingActionButton__when_using_custom_item_animation_configuration__it_looks_correct_with_items_offsetted@2x.png differ diff --git a/Example/Tests/ReferenceImages/AnimationConfigurationSpec/JJFloatingActionButton__when_using_custom_item_animation_configuration__it_looks_correct_with_items_scaled@2x.png b/Example/Tests/ReferenceImages/AnimationConfigurationSpec/JJFloatingActionButton__when_using_custom_item_animation_configuration__it_looks_correct_with_items_scaled@2x.png index d0ad438..16fbd2e 100644 Binary files a/Example/Tests/ReferenceImages/AnimationConfigurationSpec/JJFloatingActionButton__when_using_custom_item_animation_configuration__it_looks_correct_with_items_scaled@2x.png and b/Example/Tests/ReferenceImages/AnimationConfigurationSpec/JJFloatingActionButton__when_using_custom_item_animation_configuration__it_looks_correct_with_items_scaled@2x.png differ diff --git a/Example/Tests/ReferenceImages/AnimationConfigurationSpec/JJFloatingActionButton__when_using_pop_up_style__it_looks_correct@2x.png b/Example/Tests/ReferenceImages/AnimationConfigurationSpec/JJFloatingActionButton__when_using_pop_up_style__it_looks_correct@2x.png index e862fff..165bb88 100644 Binary files a/Example/Tests/ReferenceImages/AnimationConfigurationSpec/JJFloatingActionButton__when_using_pop_up_style__it_looks_correct@2x.png and b/Example/Tests/ReferenceImages/AnimationConfigurationSpec/JJFloatingActionButton__when_using_pop_up_style__it_looks_correct@2x.png differ diff --git a/Example/Tests/ReferenceImages/AnimationConfigurationSpec/JJFloatingActionButton__when_using_pop_up_style_with_separate_first_item_spacing__it_looks_correct@2x.png b/Example/Tests/ReferenceImages/AnimationConfigurationSpec/JJFloatingActionButton__when_using_pop_up_style_with_separate_first_item_spacing__it_looks_correct@2x.png index 7adb2f2..e7bdb13 100644 Binary files a/Example/Tests/ReferenceImages/AnimationConfigurationSpec/JJFloatingActionButton__when_using_pop_up_style_with_separate_first_item_spacing__it_looks_correct@2x.png and b/Example/Tests/ReferenceImages/AnimationConfigurationSpec/JJFloatingActionButton__when_using_pop_up_style_with_separate_first_item_spacing__it_looks_correct@2x.png differ diff --git a/Example/Tests/ReferenceImages/AnimationConfigurationSpec/JJFloatingActionButton__when_using_slide_in_style__it_looks_correct@2x.png b/Example/Tests/ReferenceImages/AnimationConfigurationSpec/JJFloatingActionButton__when_using_slide_in_style__it_looks_correct@2x.png index e862fff..165bb88 100644 Binary files a/Example/Tests/ReferenceImages/AnimationConfigurationSpec/JJFloatingActionButton__when_using_slide_in_style__it_looks_correct@2x.png and b/Example/Tests/ReferenceImages/AnimationConfigurationSpec/JJFloatingActionButton__when_using_slide_in_style__it_looks_correct@2x.png differ diff --git a/Example/Tests/ReferenceImages/AnimationConfigurationSpec/JJFloatingActionButton_in_center__when_using_circular_pop_up_style_with_custom_angles__it_looks_correct@2x.png b/Example/Tests/ReferenceImages/AnimationConfigurationSpec/JJFloatingActionButton_in_center__when_using_circular_pop_up_style_with_custom_angles__it_looks_correct@2x.png new file mode 100644 index 0000000..3d0874a Binary files /dev/null and b/Example/Tests/ReferenceImages/AnimationConfigurationSpec/JJFloatingActionButton_in_center__when_using_circular_pop_up_style_with_custom_angles__it_looks_correct@2x.png differ diff --git a/Example/Tests/ReferenceImages/AnimationConfigurationSpec/JJFloatingActionButton_in_center__when_using_circular_pop_up_style_with_custom_angles__it_looks_correct@3x.png b/Example/Tests/ReferenceImages/AnimationConfigurationSpec/JJFloatingActionButton_in_center__when_using_circular_pop_up_style_with_custom_angles__it_looks_correct@3x.png new file mode 100644 index 0000000..3849825 Binary files /dev/null and b/Example/Tests/ReferenceImages/AnimationConfigurationSpec/JJFloatingActionButton_in_center__when_using_circular_pop_up_style_with_custom_angles__it_looks_correct@3x.png differ diff --git a/Example/Tests/ReferenceImages/AnimationConfigurationSpec/JJFloatingActionButton_on_the_left__when_using_circular_pop_up_style__it_looks_correct_with_1_item@2x.png b/Example/Tests/ReferenceImages/AnimationConfigurationSpec/JJFloatingActionButton_on_the_left__when_using_circular_pop_up_style__it_looks_correct_with_1_item@2x.png index 64e2cef..fa5b5a7 100644 Binary files a/Example/Tests/ReferenceImages/AnimationConfigurationSpec/JJFloatingActionButton_on_the_left__when_using_circular_pop_up_style__it_looks_correct_with_1_item@2x.png and b/Example/Tests/ReferenceImages/AnimationConfigurationSpec/JJFloatingActionButton_on_the_left__when_using_circular_pop_up_style__it_looks_correct_with_1_item@2x.png differ diff --git a/Example/Tests/ReferenceImages/AnimationConfigurationSpec/JJFloatingActionButton_on_the_left__when_using_circular_pop_up_style__it_looks_correct_with_2_items@2x.png b/Example/Tests/ReferenceImages/AnimationConfigurationSpec/JJFloatingActionButton_on_the_left__when_using_circular_pop_up_style__it_looks_correct_with_2_items@2x.png index f178d08..c737bfd 100644 Binary files a/Example/Tests/ReferenceImages/AnimationConfigurationSpec/JJFloatingActionButton_on_the_left__when_using_circular_pop_up_style__it_looks_correct_with_2_items@2x.png and b/Example/Tests/ReferenceImages/AnimationConfigurationSpec/JJFloatingActionButton_on_the_left__when_using_circular_pop_up_style__it_looks_correct_with_2_items@2x.png differ diff --git a/Example/Tests/ReferenceImages/AnimationConfigurationSpec/JJFloatingActionButton_on_the_left__when_using_circular_pop_up_style__it_looks_correct_with_3_items@2x.png b/Example/Tests/ReferenceImages/AnimationConfigurationSpec/JJFloatingActionButton_on_the_left__when_using_circular_pop_up_style__it_looks_correct_with_3_items@2x.png index cf07d25..b33d998 100644 Binary files a/Example/Tests/ReferenceImages/AnimationConfigurationSpec/JJFloatingActionButton_on_the_left__when_using_circular_pop_up_style__it_looks_correct_with_3_items@2x.png and b/Example/Tests/ReferenceImages/AnimationConfigurationSpec/JJFloatingActionButton_on_the_left__when_using_circular_pop_up_style__it_looks_correct_with_3_items@2x.png differ diff --git a/Example/Tests/ReferenceImages/AnimationConfigurationSpec/JJFloatingActionButton_on_the_left__when_using_custom_item_animation_configuration__it_looks_correct_with_circular_offset_items@2x.png b/Example/Tests/ReferenceImages/AnimationConfigurationSpec/JJFloatingActionButton_on_the_left__when_using_custom_item_animation_configuration__it_looks_correct_with_circular_offset_items@2x.png index 8d86bf3..484e233 100644 Binary files a/Example/Tests/ReferenceImages/AnimationConfigurationSpec/JJFloatingActionButton_on_the_left__when_using_custom_item_animation_configuration__it_looks_correct_with_circular_offset_items@2x.png and b/Example/Tests/ReferenceImages/AnimationConfigurationSpec/JJFloatingActionButton_on_the_left__when_using_custom_item_animation_configuration__it_looks_correct_with_circular_offset_items@2x.png differ diff --git a/Example/Tests/ReferenceImages/AnimationConfigurationSpec/JJFloatingActionButton_on_the_left__when_using_custom_item_animation_configuration__it_looks_correct_with_horizontal_offset@2x.png b/Example/Tests/ReferenceImages/AnimationConfigurationSpec/JJFloatingActionButton_on_the_left__when_using_custom_item_animation_configuration__it_looks_correct_with_horizontal_offset@2x.png index f500665..8e991b0 100644 Binary files a/Example/Tests/ReferenceImages/AnimationConfigurationSpec/JJFloatingActionButton_on_the_left__when_using_custom_item_animation_configuration__it_looks_correct_with_horizontal_offset@2x.png and b/Example/Tests/ReferenceImages/AnimationConfigurationSpec/JJFloatingActionButton_on_the_left__when_using_custom_item_animation_configuration__it_looks_correct_with_horizontal_offset@2x.png differ diff --git a/Example/Tests/ReferenceImages/AnimationConfigurationSpec/JJFloatingActionButton_on_the_left__when_using_custom_item_animation_configuration__it_looks_correct_with_items_offsetted@2x.png b/Example/Tests/ReferenceImages/AnimationConfigurationSpec/JJFloatingActionButton_on_the_left__when_using_custom_item_animation_configuration__it_looks_correct_with_items_offsetted@2x.png index abaac71..70b8a6a 100644 Binary files a/Example/Tests/ReferenceImages/AnimationConfigurationSpec/JJFloatingActionButton_on_the_left__when_using_custom_item_animation_configuration__it_looks_correct_with_items_offsetted@2x.png and b/Example/Tests/ReferenceImages/AnimationConfigurationSpec/JJFloatingActionButton_on_the_left__when_using_custom_item_animation_configuration__it_looks_correct_with_items_offsetted@2x.png differ diff --git a/Example/Tests/ReferenceImages/AnimationConfigurationSpec/JJFloatingActionButton_on_the_left__with_rtl_language__looks_correct@2x.png b/Example/Tests/ReferenceImages/AnimationConfigurationSpec/JJFloatingActionButton_on_the_left__with_rtl_language__looks_correct@2x.png index 1c5e7a7..2365687 100644 Binary files a/Example/Tests/ReferenceImages/AnimationConfigurationSpec/JJFloatingActionButton_on_the_left__with_rtl_language__looks_correct@2x.png and b/Example/Tests/ReferenceImages/AnimationConfigurationSpec/JJFloatingActionButton_on_the_left__with_rtl_language__looks_correct@2x.png differ diff --git a/Example/Tests/ReferenceImages/AnimationConfigurationSpec/JJFloatingActionButton_on_the_left__with_rtl_language__looks_correct_with_slide_in_configuration@2x.png b/Example/Tests/ReferenceImages/AnimationConfigurationSpec/JJFloatingActionButton_on_the_left__with_rtl_language__looks_correct_with_slide_in_configuration@2x.png index ccd3b60..62d8206 100644 Binary files a/Example/Tests/ReferenceImages/AnimationConfigurationSpec/JJFloatingActionButton_on_the_left__with_rtl_language__looks_correct_with_slide_in_configuration@2x.png and b/Example/Tests/ReferenceImages/AnimationConfigurationSpec/JJFloatingActionButton_on_the_left__with_rtl_language__looks_correct_with_slide_in_configuration@2x.png differ diff --git a/Example/Tests/ReferenceImages/AnimationConfigurationSpec/JJFloatingActionButton_on_the_left__with_rtl_language__looks_correct_with_slide_in_configuration@3x.png b/Example/Tests/ReferenceImages/AnimationConfigurationSpec/JJFloatingActionButton_on_the_left__with_rtl_language__looks_correct_with_slide_in_configuration@3x.png index 971ade1..1ee3a64 100644 Binary files a/Example/Tests/ReferenceImages/AnimationConfigurationSpec/JJFloatingActionButton_on_the_left__with_rtl_language__looks_correct_with_slide_in_configuration@3x.png and b/Example/Tests/ReferenceImages/AnimationConfigurationSpec/JJFloatingActionButton_on_the_left__with_rtl_language__looks_correct_with_slide_in_configuration@3x.png differ diff --git a/Example/Tests/ReferenceImages/JJActionItemSpec/JJActionItem__looks_correct@2x.png b/Example/Tests/ReferenceImages/JJActionItemSpec/JJActionItem__looks_correct@2x.png index 421e9b4..a9480bb 100644 Binary files a/Example/Tests/ReferenceImages/JJActionItemSpec/JJActionItem__looks_correct@2x.png and b/Example/Tests/ReferenceImages/JJActionItemSpec/JJActionItem__looks_correct@2x.png differ diff --git a/Example/Tests/ReferenceImages/JJActionItemSpec/JJActionItem__looks_correct_with_bigger_image_size@2x.png b/Example/Tests/ReferenceImages/JJActionItemSpec/JJActionItem__looks_correct_with_bigger_image_size@2x.png index a97a364..46d47fa 100644 Binary files a/Example/Tests/ReferenceImages/JJActionItemSpec/JJActionItem__looks_correct_with_bigger_image_size@2x.png and b/Example/Tests/ReferenceImages/JJActionItemSpec/JJActionItem__looks_correct_with_bigger_image_size@2x.png differ diff --git a/Example/Tests/ReferenceImages/JJActionItemSpec/JJActionItem__looks_correct_with_empty_title@2x.png b/Example/Tests/ReferenceImages/JJActionItemSpec/JJActionItem__looks_correct_with_empty_title@2x.png index 9168188..31ce7f3 100644 Binary files a/Example/Tests/ReferenceImages/JJActionItemSpec/JJActionItem__looks_correct_with_empty_title@2x.png and b/Example/Tests/ReferenceImages/JJActionItemSpec/JJActionItem__looks_correct_with_empty_title@2x.png differ diff --git a/Example/Tests/ReferenceImages/JJActionItemSpec/JJActionItem__looks_correct_with_horizontal_title_spacing_configured@2x.png b/Example/Tests/ReferenceImages/JJActionItemSpec/JJActionItem__looks_correct_with_horizontal_title_spacing_configured@2x.png index 5ed9109..07cbee1 100644 Binary files a/Example/Tests/ReferenceImages/JJActionItemSpec/JJActionItem__looks_correct_with_horizontal_title_spacing_configured@2x.png and b/Example/Tests/ReferenceImages/JJActionItemSpec/JJActionItem__looks_correct_with_horizontal_title_spacing_configured@2x.png differ diff --git a/Example/Tests/ReferenceImages/JJActionItemSpec/JJActionItem__looks_correct_with_smaller_image_size@2x.png b/Example/Tests/ReferenceImages/JJActionItemSpec/JJActionItem__looks_correct_with_smaller_image_size@2x.png index 7603dcf..1ba70e7 100644 Binary files a/Example/Tests/ReferenceImages/JJActionItemSpec/JJActionItem__looks_correct_with_smaller_image_size@2x.png and b/Example/Tests/ReferenceImages/JJActionItemSpec/JJActionItem__looks_correct_with_smaller_image_size@2x.png differ diff --git a/Example/Tests/ReferenceImages/JJActionItemSpec/JJActionItem__looks_correct_with_title_position_bottom@2x.png b/Example/Tests/ReferenceImages/JJActionItemSpec/JJActionItem__looks_correct_with_title_position_bottom@2x.png index 66df8c1..d614682 100644 Binary files a/Example/Tests/ReferenceImages/JJActionItemSpec/JJActionItem__looks_correct_with_title_position_bottom@2x.png and b/Example/Tests/ReferenceImages/JJActionItemSpec/JJActionItem__looks_correct_with_title_position_bottom@2x.png differ diff --git a/Example/Tests/ReferenceImages/JJActionItemSpec/JJActionItem__looks_correct_with_title_position_hidden@2x.png b/Example/Tests/ReferenceImages/JJActionItemSpec/JJActionItem__looks_correct_with_title_position_hidden@2x.png index db1f7b8..b49c7bb 100644 Binary files a/Example/Tests/ReferenceImages/JJActionItemSpec/JJActionItem__looks_correct_with_title_position_hidden@2x.png and b/Example/Tests/ReferenceImages/JJActionItemSpec/JJActionItem__looks_correct_with_title_position_hidden@2x.png differ diff --git a/Example/Tests/ReferenceImages/JJActionItemSpec/JJActionItem__looks_correct_with_title_position_leading@2x.png b/Example/Tests/ReferenceImages/JJActionItemSpec/JJActionItem__looks_correct_with_title_position_leading@2x.png index 421e9b4..a9480bb 100644 Binary files a/Example/Tests/ReferenceImages/JJActionItemSpec/JJActionItem__looks_correct_with_title_position_leading@2x.png and b/Example/Tests/ReferenceImages/JJActionItemSpec/JJActionItem__looks_correct_with_title_position_leading@2x.png differ diff --git a/Example/Tests/ReferenceImages/JJActionItemSpec/JJActionItem__looks_correct_with_title_position_left@2x.png b/Example/Tests/ReferenceImages/JJActionItemSpec/JJActionItem__looks_correct_with_title_position_left@2x.png index 421e9b4..a9480bb 100644 Binary files a/Example/Tests/ReferenceImages/JJActionItemSpec/JJActionItem__looks_correct_with_title_position_left@2x.png and b/Example/Tests/ReferenceImages/JJActionItemSpec/JJActionItem__looks_correct_with_title_position_left@2x.png differ diff --git a/Example/Tests/ReferenceImages/JJActionItemSpec/JJActionItem__looks_correct_with_title_position_right@2x.png b/Example/Tests/ReferenceImages/JJActionItemSpec/JJActionItem__looks_correct_with_title_position_right@2x.png index 628fb92..b700b28 100644 Binary files a/Example/Tests/ReferenceImages/JJActionItemSpec/JJActionItem__looks_correct_with_title_position_right@2x.png and b/Example/Tests/ReferenceImages/JJActionItemSpec/JJActionItem__looks_correct_with_title_position_right@2x.png differ diff --git a/Example/Tests/ReferenceImages/JJActionItemSpec/JJActionItem__looks_correct_with_title_position_top@2x.png b/Example/Tests/ReferenceImages/JJActionItemSpec/JJActionItem__looks_correct_with_title_position_top@2x.png index 6d5011a..c2bd6ef 100644 Binary files a/Example/Tests/ReferenceImages/JJActionItemSpec/JJActionItem__looks_correct_with_title_position_top@2x.png and b/Example/Tests/ReferenceImages/JJActionItemSpec/JJActionItem__looks_correct_with_title_position_top@2x.png differ diff --git a/Example/Tests/ReferenceImages/JJActionItemSpec/JJActionItem__looks_correct_with_title_position_trailing@2x.png b/Example/Tests/ReferenceImages/JJActionItemSpec/JJActionItem__looks_correct_with_title_position_trailing@2x.png index 628fb92..b700b28 100644 Binary files a/Example/Tests/ReferenceImages/JJActionItemSpec/JJActionItem__looks_correct_with_title_position_trailing@2x.png and b/Example/Tests/ReferenceImages/JJActionItemSpec/JJActionItem__looks_correct_with_title_position_trailing@2x.png differ diff --git a/Example/Tests/ReferenceImages/JJActionItemSpec/JJActionItem__looks_correct_with_vertical_title_spacing_configured@2x.png b/Example/Tests/ReferenceImages/JJActionItemSpec/JJActionItem__looks_correct_with_vertical_title_spacing_configured@2x.png index c943899..d1d4953 100644 Binary files a/Example/Tests/ReferenceImages/JJActionItemSpec/JJActionItem__looks_correct_with_vertical_title_spacing_configured@2x.png and b/Example/Tests/ReferenceImages/JJActionItemSpec/JJActionItem__looks_correct_with_vertical_title_spacing_configured@2x.png differ diff --git a/Example/Tests/ReferenceImages/JJActionItemSpec/JJActionItem_loaded_from_xib__looks_correct@2x.png b/Example/Tests/ReferenceImages/JJActionItemSpec/JJActionItem_loaded_from_xib__looks_correct@2x.png index 99b67fa..5fb70a3 100644 Binary files a/Example/Tests/ReferenceImages/JJActionItemSpec/JJActionItem_loaded_from_xib__looks_correct@2x.png and b/Example/Tests/ReferenceImages/JJActionItemSpec/JJActionItem_loaded_from_xib__looks_correct@2x.png differ diff --git a/Example/Tests/ReferenceImages/JJCircleViewSpec/JJCircleView__created_programatically__looks_correct@2x.png b/Example/Tests/ReferenceImages/JJCircleViewSpec/JJCircleView__created_programatically__looks_correct@2x.png index 5ff2bf8..85c8866 100644 Binary files a/Example/Tests/ReferenceImages/JJCircleViewSpec/JJCircleView__created_programatically__looks_correct@2x.png and b/Example/Tests/ReferenceImages/JJCircleViewSpec/JJCircleView__created_programatically__looks_correct@2x.png differ diff --git a/Example/Tests/ReferenceImages/JJCircleViewSpec/JJCircleView__loaded_from_xib__looks_correct@2x.png b/Example/Tests/ReferenceImages/JJCircleViewSpec/JJCircleView__loaded_from_xib__looks_correct@2x.png index 1ba5771..f8bfc67 100644 Binary files a/Example/Tests/ReferenceImages/JJCircleViewSpec/JJCircleView__loaded_from_xib__looks_correct@2x.png and b/Example/Tests/ReferenceImages/JJCircleViewSpec/JJCircleView__loaded_from_xib__looks_correct@2x.png differ diff --git a/Example/Tests/ReferenceImages/JJFloatingActionButtonSpec/JJFloatingActionButton__looks_correct_by_default@2x.png b/Example/Tests/ReferenceImages/JJFloatingActionButtonSpec/JJFloatingActionButton__looks_correct_by_default@2x.png index c909f6b..216ec10 100644 Binary files a/Example/Tests/ReferenceImages/JJFloatingActionButtonSpec/JJFloatingActionButton__looks_correct_by_default@2x.png and b/Example/Tests/ReferenceImages/JJFloatingActionButtonSpec/JJFloatingActionButton__looks_correct_by_default@2x.png differ diff --git a/Example/Tests/ReferenceImages/JJFloatingActionButtonSpec/JJFloatingActionButton__looks_correct_configured@2x.png b/Example/Tests/ReferenceImages/JJFloatingActionButtonSpec/JJFloatingActionButton__looks_correct_configured@2x.png index 5ffe257..40f66b5 100644 Binary files a/Example/Tests/ReferenceImages/JJFloatingActionButtonSpec/JJFloatingActionButton__looks_correct_configured@2x.png and b/Example/Tests/ReferenceImages/JJFloatingActionButtonSpec/JJFloatingActionButton__looks_correct_configured@2x.png differ diff --git a/Example/Tests/ReferenceImages/JJFloatingActionButtonSpec/JJFloatingActionButton__looks_correct_configured_after_adding_the_items@2x.png b/Example/Tests/ReferenceImages/JJFloatingActionButtonSpec/JJFloatingActionButton__looks_correct_configured_after_adding_the_items@2x.png index 02e075a..3db6d0b 100644 Binary files a/Example/Tests/ReferenceImages/JJFloatingActionButtonSpec/JJFloatingActionButton__looks_correct_configured_after_adding_the_items@2x.png and b/Example/Tests/ReferenceImages/JJFloatingActionButtonSpec/JJFloatingActionButton__looks_correct_configured_after_adding_the_items@2x.png differ diff --git a/Example/Tests/ReferenceImages/JJFloatingActionButtonSpec/JJFloatingActionButton__looks_correct_highlighted@2x.png b/Example/Tests/ReferenceImages/JJFloatingActionButtonSpec/JJFloatingActionButton__looks_correct_highlighted@2x.png index 1a06dc1..75faafa 100644 Binary files a/Example/Tests/ReferenceImages/JJFloatingActionButtonSpec/JJFloatingActionButton__looks_correct_highlighted@2x.png and b/Example/Tests/ReferenceImages/JJFloatingActionButtonSpec/JJFloatingActionButton__looks_correct_highlighted@2x.png differ diff --git a/Example/Tests/ReferenceImages/JJFloatingActionButtonSpec/JJFloatingActionButton__looks_correct_highlighted_with_custom_color@2x.png b/Example/Tests/ReferenceImages/JJFloatingActionButtonSpec/JJFloatingActionButton__looks_correct_highlighted_with_custom_color@2x.png index cbe1ae0..4eea106 100644 Binary files a/Example/Tests/ReferenceImages/JJFloatingActionButtonSpec/JJFloatingActionButton__looks_correct_highlighted_with_custom_color@2x.png and b/Example/Tests/ReferenceImages/JJFloatingActionButtonSpec/JJFloatingActionButton__looks_correct_highlighted_with_custom_color@2x.png differ diff --git a/Example/Tests/ReferenceImages/JJFloatingActionButtonSpec/JJFloatingActionButton__looks_correct_highlighted_with_dark_color@2x.png b/Example/Tests/ReferenceImages/JJFloatingActionButtonSpec/JJFloatingActionButton__looks_correct_highlighted_with_dark_color@2x.png index 93054a8..89d2ead 100644 Binary files a/Example/Tests/ReferenceImages/JJFloatingActionButtonSpec/JJFloatingActionButton__looks_correct_highlighted_with_dark_color@2x.png and b/Example/Tests/ReferenceImages/JJFloatingActionButtonSpec/JJFloatingActionButton__looks_correct_highlighted_with_dark_color@2x.png differ diff --git a/Example/Tests/ReferenceImages/JJFloatingActionButtonSpec/JJFloatingActionButton__looks_correct_highlighted_with_light_color@2x.png b/Example/Tests/ReferenceImages/JJFloatingActionButtonSpec/JJFloatingActionButton__looks_correct_highlighted_with_light_color@2x.png index 39fb5a5..f71c2be 100644 Binary files a/Example/Tests/ReferenceImages/JJFloatingActionButtonSpec/JJFloatingActionButton__looks_correct_highlighted_with_light_color@2x.png and b/Example/Tests/ReferenceImages/JJFloatingActionButtonSpec/JJFloatingActionButton__looks_correct_highlighted_with_light_color@2x.png differ diff --git a/Example/Tests/ReferenceImages/JJFloatingActionButtonSpec/JJFloatingActionButton__looks_correct_when_only_image_color_is_changed@2x.png b/Example/Tests/ReferenceImages/JJFloatingActionButtonSpec/JJFloatingActionButton__looks_correct_when_only_image_color_is_changed@2x.png index efa0498..4d84860 100644 Binary files a/Example/Tests/ReferenceImages/JJFloatingActionButtonSpec/JJFloatingActionButton__looks_correct_when_only_image_color_is_changed@2x.png and b/Example/Tests/ReferenceImages/JJFloatingActionButtonSpec/JJFloatingActionButton__looks_correct_when_only_image_color_is_changed@2x.png differ diff --git a/Example/Tests/ReferenceImages/JJFloatingActionButtonSpec/JJFloatingActionButton__looks_correct_with_bigger_image_size@2x.png b/Example/Tests/ReferenceImages/JJFloatingActionButtonSpec/JJFloatingActionButton__looks_correct_with_bigger_image_size@2x.png index a206204..0cde9e0 100644 Binary files a/Example/Tests/ReferenceImages/JJFloatingActionButtonSpec/JJFloatingActionButton__looks_correct_with_bigger_image_size@2x.png and b/Example/Tests/ReferenceImages/JJFloatingActionButtonSpec/JJFloatingActionButton__looks_correct_with_bigger_image_size@2x.png differ diff --git a/Example/Tests/ReferenceImages/JJFloatingActionButtonSpec/JJFloatingActionButton__looks_correct_with_items_configured_with_closure@2x.png b/Example/Tests/ReferenceImages/JJFloatingActionButtonSpec/JJFloatingActionButton__looks_correct_with_items_configured_with_closure@2x.png index 670a652..77aa29b 100644 Binary files a/Example/Tests/ReferenceImages/JJFloatingActionButtonSpec/JJFloatingActionButton__looks_correct_with_items_configured_with_closure@2x.png and b/Example/Tests/ReferenceImages/JJFloatingActionButtonSpec/JJFloatingActionButton__looks_correct_with_items_configured_with_closure@2x.png differ diff --git a/Example/Tests/ReferenceImages/JJFloatingActionButtonSpec/JJFloatingActionButton__looks_correct_with_smaller_image_size@2x.png b/Example/Tests/ReferenceImages/JJFloatingActionButtonSpec/JJFloatingActionButton__looks_correct_with_smaller_image_size@2x.png index 536a08b..490a59a 100644 Binary files a/Example/Tests/ReferenceImages/JJFloatingActionButtonSpec/JJFloatingActionButton__looks_correct_with_smaller_image_size@2x.png and b/Example/Tests/ReferenceImages/JJFloatingActionButtonSpec/JJFloatingActionButton__looks_correct_with_smaller_image_size@2x.png differ diff --git a/Example/Tests/ReferenceImages/JJFloatingActionButtonSpec/JJFloatingActionButton__when_1_item_is_added__and_is_opened__looks_correct@2x.png b/Example/Tests/ReferenceImages/JJFloatingActionButtonSpec/JJFloatingActionButton__when_1_item_is_added__and_is_opened__looks_correct@2x.png index 4270950..2cba9ba 100644 Binary files a/Example/Tests/ReferenceImages/JJFloatingActionButtonSpec/JJFloatingActionButton__when_1_item_is_added__and_is_opened__looks_correct@2x.png and b/Example/Tests/ReferenceImages/JJFloatingActionButtonSpec/JJFloatingActionButton__when_1_item_is_added__and_is_opened__looks_correct@2x.png differ diff --git a/Example/Tests/ReferenceImages/JJFloatingActionButtonSpec/JJFloatingActionButton__when_1_item_is_added__and_is_opened_with_handle_single_action_directly_disabled__looks_correct@2x.png b/Example/Tests/ReferenceImages/JJFloatingActionButtonSpec/JJFloatingActionButton__when_1_item_is_added__and_is_opened_with_handle_single_action_directly_disabled__looks_correct@2x.png index 0a7834c..d308b97 100644 Binary files a/Example/Tests/ReferenceImages/JJFloatingActionButtonSpec/JJFloatingActionButton__when_1_item_is_added__and_is_opened_with_handle_single_action_directly_disabled__looks_correct@2x.png and b/Example/Tests/ReferenceImages/JJFloatingActionButtonSpec/JJFloatingActionButton__when_1_item_is_added__and_is_opened_with_handle_single_action_directly_disabled__looks_correct@2x.png differ diff --git a/Example/Tests/ReferenceImages/JJFloatingActionButtonSpec/JJFloatingActionButton__when_1_item_is_added__looks_correct@2x.png b/Example/Tests/ReferenceImages/JJFloatingActionButtonSpec/JJFloatingActionButton__when_1_item_is_added__looks_correct@2x.png index 4270950..2cba9ba 100644 Binary files a/Example/Tests/ReferenceImages/JJFloatingActionButtonSpec/JJFloatingActionButton__when_1_item_is_added__looks_correct@2x.png and b/Example/Tests/ReferenceImages/JJFloatingActionButtonSpec/JJFloatingActionButton__when_1_item_is_added__looks_correct@2x.png differ diff --git a/Example/Tests/ReferenceImages/JJFloatingActionButtonSpec/JJFloatingActionButton__when_multiple_items_are_added__and_all_but_one_item_are_removed__looks_correct@2x.png b/Example/Tests/ReferenceImages/JJFloatingActionButtonSpec/JJFloatingActionButton__when_multiple_items_are_added__and_all_but_one_item_are_removed__looks_correct@2x.png index 957377e..e75f89b 100644 Binary files a/Example/Tests/ReferenceImages/JJFloatingActionButtonSpec/JJFloatingActionButton__when_multiple_items_are_added__and_all_but_one_item_are_removed__looks_correct@2x.png and b/Example/Tests/ReferenceImages/JJFloatingActionButtonSpec/JJFloatingActionButton__when_multiple_items_are_added__and_all_but_one_item_are_removed__looks_correct@2x.png differ diff --git a/Example/Tests/ReferenceImages/JJFloatingActionButtonSpec/JJFloatingActionButton__when_multiple_items_are_added__and_all_but_one_item_are_removed__looks_correct_when_opened@2x.png b/Example/Tests/ReferenceImages/JJFloatingActionButtonSpec/JJFloatingActionButton__when_multiple_items_are_added__and_all_but_one_item_are_removed__looks_correct_when_opened@2x.png index 957377e..e75f89b 100644 Binary files a/Example/Tests/ReferenceImages/JJFloatingActionButtonSpec/JJFloatingActionButton__when_multiple_items_are_added__and_all_but_one_item_are_removed__looks_correct_when_opened@2x.png and b/Example/Tests/ReferenceImages/JJFloatingActionButtonSpec/JJFloatingActionButton__when_multiple_items_are_added__and_all_but_one_item_are_removed__looks_correct_when_opened@2x.png differ diff --git a/Example/Tests/ReferenceImages/JJFloatingActionButtonSpec/JJFloatingActionButton__when_multiple_items_are_added__and_is_opened__items_look_correct@2x.png b/Example/Tests/ReferenceImages/JJFloatingActionButtonSpec/JJFloatingActionButton__when_multiple_items_are_added__and_is_opened__items_look_correct@2x.png index e1b5da0..4260b76 100644 Binary files a/Example/Tests/ReferenceImages/JJFloatingActionButtonSpec/JJFloatingActionButton__when_multiple_items_are_added__and_is_opened__items_look_correct@2x.png and b/Example/Tests/ReferenceImages/JJFloatingActionButtonSpec/JJFloatingActionButton__when_multiple_items_are_added__and_is_opened__items_look_correct@2x.png differ diff --git a/Example/Tests/ReferenceImages/JJFloatingActionButtonSpec/JJFloatingActionButton__when_multiple_items_are_added__and_is_opened__items_look_correct_highlighted@2x.png b/Example/Tests/ReferenceImages/JJFloatingActionButtonSpec/JJFloatingActionButton__when_multiple_items_are_added__and_is_opened__items_look_correct_highlighted@2x.png index 704097f..3dc1119 100644 Binary files a/Example/Tests/ReferenceImages/JJFloatingActionButtonSpec/JJFloatingActionButton__when_multiple_items_are_added__and_is_opened__items_look_correct_highlighted@2x.png and b/Example/Tests/ReferenceImages/JJFloatingActionButtonSpec/JJFloatingActionButton__when_multiple_items_are_added__and_is_opened__items_look_correct_highlighted@2x.png differ diff --git a/Example/Tests/ReferenceImages/JJFloatingActionButtonSpec/JJFloatingActionButton__when_multiple_items_are_added__and_is_opened__items_look_correct_highlighted_with_custom_highlighted_color@2x.png b/Example/Tests/ReferenceImages/JJFloatingActionButtonSpec/JJFloatingActionButton__when_multiple_items_are_added__and_is_opened__items_look_correct_highlighted_with_custom_highlighted_color@2x.png index 52cbfc1..cdfe8c0 100644 Binary files a/Example/Tests/ReferenceImages/JJFloatingActionButtonSpec/JJFloatingActionButton__when_multiple_items_are_added__and_is_opened__items_look_correct_highlighted_with_custom_highlighted_color@2x.png and b/Example/Tests/ReferenceImages/JJFloatingActionButtonSpec/JJFloatingActionButton__when_multiple_items_are_added__and_is_opened__items_look_correct_highlighted_with_custom_highlighted_color@2x.png differ diff --git a/Example/Tests/ReferenceImages/JJFloatingActionButtonSpec/JJFloatingActionButton__when_multiple_items_are_added__and_is_opened_and_closed__looks_correct@2x.png b/Example/Tests/ReferenceImages/JJFloatingActionButtonSpec/JJFloatingActionButton__when_multiple_items_are_added__and_is_opened_and_closed__looks_correct@2x.png index c909f6b..216ec10 100644 Binary files a/Example/Tests/ReferenceImages/JJFloatingActionButtonSpec/JJFloatingActionButton__when_multiple_items_are_added__and_is_opened_and_closed__looks_correct@2x.png and b/Example/Tests/ReferenceImages/JJFloatingActionButtonSpec/JJFloatingActionButton__when_multiple_items_are_added__and_is_opened_and_closed__looks_correct@2x.png differ diff --git a/Example/Tests/ReferenceImages/JJFloatingActionButtonSpec/JJFloatingActionButton__when_multiple_items_are_added__plus_one_hidden_item__looks_correct_when_opened@2x.png b/Example/Tests/ReferenceImages/JJFloatingActionButtonSpec/JJFloatingActionButton__when_multiple_items_are_added__plus_one_hidden_item__looks_correct_when_opened@2x.png index e1b5da0..4260b76 100644 Binary files a/Example/Tests/ReferenceImages/JJFloatingActionButtonSpec/JJFloatingActionButton__when_multiple_items_are_added__plus_one_hidden_item__looks_correct_when_opened@2x.png and b/Example/Tests/ReferenceImages/JJFloatingActionButtonSpec/JJFloatingActionButton__when_multiple_items_are_added__plus_one_hidden_item__looks_correct_when_opened@2x.png differ diff --git a/Example/Tests/ReferenceImages/JJFloatingActionButtonSpec/JJFloatingActionButton_loaded_from_xib__looks_correct@2x.png b/Example/Tests/ReferenceImages/JJFloatingActionButtonSpec/JJFloatingActionButton_loaded_from_xib__looks_correct@2x.png index 8345268..4e79429 100644 Binary files a/Example/Tests/ReferenceImages/JJFloatingActionButtonSpec/JJFloatingActionButton_loaded_from_xib__looks_correct@2x.png and b/Example/Tests/ReferenceImages/JJFloatingActionButtonSpec/JJFloatingActionButton_loaded_from_xib__looks_correct@2x.png differ diff --git a/Example/Tests/ReferenceImages/JJFloatingActionButtonSpec/JJFloatingActionButton_using_layout_constraints__looks_correct@2x.png b/Example/Tests/ReferenceImages/JJFloatingActionButtonSpec/JJFloatingActionButton_using_layout_constraints__looks_correct@2x.png index 2a3ffb8..4d3ba02 100644 Binary files a/Example/Tests/ReferenceImages/JJFloatingActionButtonSpec/JJFloatingActionButton_using_layout_constraints__looks_correct@2x.png and b/Example/Tests/ReferenceImages/JJFloatingActionButtonSpec/JJFloatingActionButton_using_layout_constraints__looks_correct@2x.png differ diff --git a/Example/Tests/ReferenceImages/JJFloatingActionButtonSpec/JJFloatingActionButton_using_layout_constraints__looks_correct_when_diameter_is_set@2x.png b/Example/Tests/ReferenceImages/JJFloatingActionButtonSpec/JJFloatingActionButton_using_layout_constraints__looks_correct_when_diameter_is_set@2x.png index df1e57a..a5fc542 100644 Binary files a/Example/Tests/ReferenceImages/JJFloatingActionButtonSpec/JJFloatingActionButton_using_layout_constraints__looks_correct_when_diameter_is_set@2x.png and b/Example/Tests/ReferenceImages/JJFloatingActionButtonSpec/JJFloatingActionButton_using_layout_constraints__looks_correct_when_diameter_is_set@2x.png differ diff --git a/Sources/AnimationConfiguration.swift b/Sources/AnimationConfiguration.swift index a1764a7..f1bd691 100644 --- a/Sources/AnimationConfiguration.swift +++ b/Sources/AnimationConfiguration.swift @@ -78,6 +78,18 @@ import UIKit // MARK: - JJButtonAnimationConfiguration +/// +/// A typealias representing a closure that calculates the angle for each item in a floating action button. +/// +/// - Parameters: +/// - index: The index of the item. +/// - numberOfItems: The total number of items. +/// - actionButton: The floating action button. +/// +/// - Returns: The angle in radians for the specified item. +/// +public typealias JJItemAngle = (_ index: Int, _ numberOfItems: Int, _ actionButton: JJFloatingActionButton) -> CGFloat + /// Button animation configuration /// @objc public class JJButtonAnimationConfiguration: NSObject { @@ -248,12 +260,15 @@ import UIKit /// - `closedState = .scale()` /// /// - Parameter radius: The distance between the center of an item and the center of the button itself. + /// - Parameter angleForItem: A closure that calculates the angle for each item in a floating action button. + /// Default is `JJItemAnimationConfiguration.angleForItem`. /// /// - Returns: An item animation configuration object. /// - static func circularPopUp(withRadius radius: CGFloat = 100) -> JJItemAnimationConfiguration { + static func circularPopUp(withRadius radius: CGFloat = 100, + angleForItem: @escaping JJItemAngle = JJItemAnimationConfiguration.angleForItem) -> JJItemAnimationConfiguration { let configuration = JJItemAnimationConfiguration() - configuration.itemLayout = .circular(withRadius: radius) + configuration.itemLayout = .circular(withRadius: radius, angleForItem: angleForItem) configuration.closedState = .scale() configuration.opening.interItemDelay = 0.05 configuration.closing.interItemDelay = 0.05 @@ -265,13 +280,16 @@ import UIKit /// - `closedState = .circularOffset()` /// /// - Parameter radius: The distance between the center of an item and the center of the button itself. + /// - Parameter angleForItem: A closure that calculates the angle for each item in a floating action button. + /// Default is `JJItemAnimationConfiguration.angleForItem`. /// /// - Returns: An item animation configuration object. /// - static func circularSlideIn(withRadius radius: CGFloat = 100) -> JJItemAnimationConfiguration { + static func circularSlideIn(withRadius radius: CGFloat = 100, + angleForItem: @escaping JJItemAngle = JJItemAnimationConfiguration.angleForItem) -> JJItemAnimationConfiguration { let configuration = JJItemAnimationConfiguration() - configuration.itemLayout = .circular(withRadius: radius) - configuration.closedState = .circularOffset(distance: radius * 0.75) + configuration.itemLayout = .circular(withRadius: radius, angleForItem: angleForItem) + configuration.closedState = .circularOffset(distance: radius * 0.75, angleForItem: angleForItem) return configuration } } @@ -322,22 +340,22 @@ import UIKit /// Returns an item layout object that places the items in a circle around the action button with given radius. /// /// - Parameter radius: The distance between the center of an item and the center of the button itself. + /// - Parameter angleForItem: A closure that calculates the angle for each item in a floating action button. + /// Default is `JJItemAnimationConfiguration.angleForItem`. /// /// - Returns: An item layout object. /// - @objc public static func circular(withRadius radius: CGFloat = 100) -> JJItemLayout { + @objc public static func circular(withRadius radius: CGFloat = 100, + angleForItem: @escaping JJItemAngle = JJItemAnimationConfiguration.angleForItem) -> JJItemLayout { return JJItemLayout { items, actionButton in let numberOfItems = items.count - var index: Int = 0 - for item in items { - let angle = JJItemAnimationConfiguration.angleForItem(at: index, numberOfItems: numberOfItems, actionButton: actionButton) + for (index, item) in items.enumerated() { + let angle = angleForItem(index, numberOfItems, actionButton) let horizontalDistance = radius * cos(angle) let verticalDistance = radius * sin(angle) item.circleView.centerXAnchor.constraint(equalTo: actionButton.centerXAnchor, constant: horizontalDistance).isActive = true item.circleView.centerYAnchor.constraint(equalTo: actionButton.centerYAnchor, constant: verticalDistance).isActive = true - - index += 1 } } } @@ -438,16 +456,18 @@ import UIKit /// - Parameter distance: The value in points by which the item is offsetted /// towards the action button. /// - Parameter scale: The factor by which the item is scaled + /// - Parameter angleForItem: A closure that calculates the angle for each item in a floating action button. + /// Default is `JJItemAnimationConfiguration.angleForItem`. /// /// - Remark: The item is offsetted towards the action button. /// /// - Returns: An item preparation object. /// - @objc public static func circularOffset(distance: CGFloat = 50, scale: CGFloat = 0.4) -> JJItemPreparation { + @objc public static func circularOffset(distance: CGFloat = 50, + scale: CGFloat = 0.4, + angleForItem: @escaping JJItemAngle = JJItemAnimationConfiguration.angleForItem) -> JJItemPreparation { return JJItemPreparation { item, index, numberOfItems, actionButton in - let itemAngle = JJItemAnimationConfiguration.angleForItem(at: index, - numberOfItems: numberOfItems, - actionButton: actionButton) + let itemAngle = angleForItem(index, numberOfItems, actionButton) let transitionAngle = itemAngle + CGFloat.pi let translationX = distance * cos(transitionAngle) let translationY = distance * sin(transitionAngle) @@ -459,8 +479,17 @@ import UIKit // MARK: - Helper -extension JJItemAnimationConfiguration { - static func angleForItem(at index: Int, numberOfItems: Int, actionButton: JJFloatingActionButton) -> CGFloat { +public extension JJItemAnimationConfiguration { + /// Calculates the angle for the item at the specified index in the floating action button. + /// + /// - Parameters: + /// - index: The index of the item. + /// - numberOfItems: The total number of items in the floating action button. + /// - actionButton: The floating action button. + /// + /// - Returns: The angle in radians for the item at the specified index. + /// + @objc static func angleForItem(at index: Int, numberOfItems: Int, actionButton: JJFloatingActionButton) -> CGFloat { precondition(numberOfItems > 0) precondition(index >= 0) precondition(index < numberOfItems) diff --git a/Sources/JJFloatingActionButton+Animation.swift b/Sources/JJFloatingActionButton+Animation.swift index b5842d7..05e62c9 100644 --- a/Sources/JJFloatingActionButton+Animation.swift +++ b/Sources/JJFloatingActionButton+Animation.swift @@ -288,8 +288,7 @@ private extension JJFloatingActionButton { let numberOfItems = openItems.count var delay: TimeInterval = 0.0 - var index = 0 - for item in openItems { + for (index, item) in openItems.enumerated() { configuration.closedState.prepare(item, index, numberOfItems, self) let animation: () -> Void = { configuration.openState.prepare(item, index, numberOfItems, self) @@ -303,7 +302,6 @@ private extension JJFloatingActionButton { animated: animated) delay += configuration.opening.interItemDelay - index += 1 } } @@ -313,8 +311,7 @@ private extension JJFloatingActionButton { let numberOfItems = openItems.count var delay: TimeInterval = 0.0 - var index = numberOfItems - 1 - for item in openItems.reversed() { + for (index, item) in openItems.enumerated().reversed() { let animation: () -> Void = { configuration.closedState.prepare(item, index, numberOfItems, self) } @@ -327,7 +324,6 @@ private extension JJFloatingActionButton { animated: animated) delay += configuration.closing.interItemDelay - index -= 1 } } }