From 3987e05ebc9b2bd87f0820628181db312b48a924 Mon Sep 17 00:00:00 2001 From: Dmitriy Demchenko Date: Mon, 4 Jul 2016 15:07:12 +0300 Subject: [PATCH] Minor fix --- Example/README.md | 183 ++++++++++++++++++++ Example/Segmentio.xcodeproj/project.pbxproj | 8 +- Segmentio/Source/Segmentio.swift | 2 +- 3 files changed, 188 insertions(+), 5 deletions(-) create mode 100644 Example/README.md diff --git a/Example/README.md b/Example/README.md new file mode 100644 index 0000000..04a322d --- /dev/null +++ b/Example/README.md @@ -0,0 +1,183 @@ +##Segmentio +[![License](http://img.shields.io/badge/license-MIT-green.svg?style=flat)](https://github.com/Yalantis/Segmentio/blob/master/LICENSE) +[![Swift 2.2.x](https://img.shields.io/badge/Swift-2.2.x-orange.svg)] + +Animated top/bottom segmented control written in Swift. + +[![Yalantis](https://raw.githubusercontent.com/Yalantis/PullToMakeSoup/master/PullToMakeSoupDemo/Resouces/badge_dark.png)](https://Yalantis.com/?utm_source=github) + +##Requirements + +iOS 8.x, Swift 2.2 + +##Installation + +####[CocoaPods](http://cocoapods.org) +```ruby +use_frameworks! + +# Swift 2.2 +pod 'Segmentio', '~> 0.1.0' +``` + +*(CocoaPods v1.0.1 or later required. See [this blog post](http://blog.cocoapods.org/Pod-Authors-Guide-to-CocoaPods-Frameworks/) for details.)* + +##Usage +####Import `Segmentio` module +```swift +import Segmentio +``` + +####Init +You can initialize a `Segmentio` instance from code: +```swift +var segmentioView: Segmentio! + +let segmentioViewRect = CGRect(x: 0, y: 0, width: UIScreen.mainScreen().bounds.width, height: 125) +segmentioView = Segmentio(frame: segmentioViewRect) +view.addSubview(segmentioView) +``` +or + +add a `UIView` instance in your .storyboard or .xib, set `Segmentio` class and connect `IBOutlet`: +```swift +@IBOutlet weak var segmentioView: Segmentio! +``` + +####Setup `Segmentio` +```swift +segmentioView.setupContent( + content: [SegmentioItem], + style: SegmentioStyle, + options: SegmentioOptions? +) +``` + +To start with default options you can just pass `nil` to the `options` parameter. + +```swift +segmentioView.setupContent( + content: [SegmentioItem], + style: SegmentioStyle, + options: nil +) +``` + + +####Configuring items +In order to set items you need to create an array of `SegmentioItem` instances: +```swift +var content = [SegmentioItem]() + +let tornadoItem = SegmentioItem( + title: "Tornado", + image: UIImage(named: "tornado") +) +content.append(tornadoItem) +``` + +####Handling selection +You can specify selected item manually: +```swift +segmentioView.selectedSegmentIndex = 0 +``` + +####Handling callback +```swift +segmentioView.valueDidChange = { segmentio, segmentIndex in + print("Selected item: ", segmentIndex) +} +``` + +####Customization +`Segmentio` can be customized by passing an instance of `SegmentioOptions` struct: +```swift +SegmentioOptions( + backgroundColor: UIColor.whiteColor(), + maxVisibleItems: 3, + scrollEnabled: true, + indicatorOptions: SegmentioIndicatorOptions, + horizontalSeparatorOptions: SegmentioHorizontalSeparatorOptions, + verticalSeparatorOptions: SegmentioVerticalSeparatorOptions, + imageContentMode: UIViewContentMode.Center, + labelTextAlignment: NSTextAlignment.Center, + segmentStates: SegmentioStates // tuple of SegmentioState (defaultState, selectState, highlightedState) +) +``` + +Selection indicator can be customized by passing an instance of `SegmentioIndicatorOptions`: +```swift +SegmentioIndicatorOptions( + type: .Bottom, + ratio: 1, + height: 5, + color: UIColor.orangeColor() +) +``` + +Horizontal borders can be customized by passing an instance of `SegmentioHorizontalSeparatorOptions`: +```swift +SegmentioHorizontalSeparatorOptions( + type: SegmentioHorizontalSeparatorType.TopAndBottom, // Top, Bottom, TopAndBottom + height: 1, + color: UIColor.grayColor() +) +``` + +Separators between segments can be customized by passing an instance of `SegmentioVerticalSeparatorOptions`: +```swift +SegmentioVerticalSeparatorOptions( + ratio: 0.6 // from 0.1 to 1 + color: UIColor.grayColor() +) +``` + +In order to set `SegmentioStates` you need to create a tuple of `SegmentioState` instances: +```swift +SegmentioStates( + defaultState: segmentioState( + backgroundColor: UIColor.clearColor(), + titleFont: UIFont.systemFontOfSize(UIFont.smallSystemFontSize()), + titleTextColor: UIColor.blackColor() + ), + selectState: segmentioState( + backgroundColor: UIColor.orangeColor(), + titleFont: UIFont.systemFontOfSize(UIFont.smallSystemFontSize()), + titleTextColor: UIColor.whiteColor() + ), + highlinedState: segmentioState( + backgroundColor: UIColor.lightGrayColor().colorWithAlphaComponent(0.6), + titleFont: UIFont.boldSystemFontOfSize(UIFont.smallSystemFontSize()), + titleTextColor: UIColor.blackColor() + ) +) +``` + +####Let us know! +We’d be really happy if you sent us links to your projects where you use our component. Just send an email to github@yalantis.com And do let us know if you have any questions or suggestion regarding the animation. + +P.S. We’re going to publish more awesomeness wrapped in code and a tutorial on how to make UI for iOS (Android) better than better. Stay tuned! + +##License + +The MIT License (MIT) + +Copyright © 2016 Yalantis + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. \ No newline at end of file diff --git a/Example/Segmentio.xcodeproj/project.pbxproj b/Example/Segmentio.xcodeproj/project.pbxproj index c673d7f..cd07a2b 100644 --- a/Example/Segmentio.xcodeproj/project.pbxproj +++ b/Example/Segmentio.xcodeproj/project.pbxproj @@ -7,7 +7,7 @@ objects = { /* Begin PBXBuildFile section */ - 320E4C191D2A820800A93C10 /* README.md in Sources */ = {isa = PBXBuildFile; fileRef = 320E4C181D2A820800A93C10 /* README.md */; }; + 320E4C1B1D2A880500A93C10 /* README.md in Sources */ = {isa = PBXBuildFile; fileRef = 320E4C1A1D2A880500A93C10 /* README.md */; }; 324015CC1D22C0ED0096E353 /* Hints.swift in Sources */ = {isa = PBXBuildFile; fileRef = 324015CB1D22C0ED0096E353 /* Hints.swift */; }; 324015CE1D22D40A0096E353 /* UIFont+ExampleFonts.swift in Sources */ = {isa = PBXBuildFile; fileRef = 324015CD1D22D40A0096E353 /* UIFont+ExampleFonts.swift */; }; 324015D01D22FCD50096E353 /* String+Convenience.swift in Sources */ = {isa = PBXBuildFile; fileRef = 324015CF1D22FCD50096E353 /* String+Convenience.swift */; }; @@ -33,7 +33,7 @@ 1667ACAF5594F75E244C8E1B /* Pods-Segmentio_Example.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Segmentio_Example.release.xcconfig"; path = "Pods/Target Support Files/Pods-Segmentio_Example/Pods-Segmentio_Example.release.xcconfig"; sourceTree = ""; }; 183F56A87F22C4DF4AB3CDCB /* Pods_Segmentio_Tests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Segmentio_Tests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 2F629976269F20B0601D695D /* LICENSE */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; name = LICENSE; path = ../LICENSE; sourceTree = ""; }; - 320E4C181D2A820800A93C10 /* README.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; + 320E4C1A1D2A880500A93C10 /* README.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; 324015CB1D22C0ED0096E353 /* Hints.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Hints.swift; sourceTree = ""; }; 324015CD1D22D40A0096E353 /* UIFont+ExampleFonts.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIFont+ExampleFonts.swift"; sourceTree = ""; }; 324015CF1D22FCD50096E353 /* String+Convenience.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "String+Convenience.swift"; sourceTree = ""; }; @@ -194,9 +194,9 @@ 607FACF51AFB993E008FA782 /* Podspec Metadata */ = { isa = PBXGroup; children = ( + 320E4C1A1D2A880500A93C10 /* README.md */, 7EBD99A4E34C02531B010FB7 /* Segmentio.podspec */, 2F629976269F20B0601D695D /* LICENSE */, - 320E4C181D2A820800A93C10 /* README.md */, ); name = "Podspec Metadata"; sourceTree = ""; @@ -344,7 +344,7 @@ 327AF5D01D1ABEC100534355 /* UIColor+RGB.swift in Sources */, 324015CE1D22D40A0096E353 /* UIFont+ExampleFonts.swift in Sources */, 327AF5E91D1ABEC100534355 /* ExampleViewController.swift in Sources */, - 320E4C191D2A820800A93C10 /* README.md in Sources */, + 320E4C1B1D2A880500A93C10 /* README.md in Sources */, 324015D01D22FCD50096E353 /* String+Convenience.swift in Sources */, 327AF6041D1AC0FE00534355 /* ColorPalette.swift in Sources */, ); diff --git a/Segmentio/Source/Segmentio.swift b/Segmentio/Source/Segmentio.swift index 1606098..3300c35 100644 --- a/Segmentio/Source/Segmentio.swift +++ b/Segmentio/Source/Segmentio.swift @@ -402,7 +402,7 @@ public class Segmentio: UIView { // MARK: Move shape layer - private func moveShapeLayer(shapeLayer: CAShapeLayer, startPoint startPoint: CGPoint, endPoint: CGPoint, animated: Bool = false) { + private func moveShapeLayer(shapeLayer: CAShapeLayer, startPoint: CGPoint, endPoint: CGPoint, animated: Bool = false) { var endPointWithVerticalSeparator = endPoint let isLastItem = selectedSegmentioIndex + 1 == segmentioItems.count endPointWithVerticalSeparator.x = endPoint.x - (isLastItem ? 0 : 1)