From 795fe7c7080462281cb08496550d1dc13df7df84 Mon Sep 17 00:00:00 2001 From: michallaskowski Date: Fri, 2 Oct 2015 15:49:20 +0200 Subject: [PATCH 1/6] Added .podspec file for CocoaPods --- SMSegmentView.podspec | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 SMSegmentView.podspec diff --git a/SMSegmentView.podspec b/SMSegmentView.podspec new file mode 100644 index 0000000..dcef9f3 --- /dev/null +++ b/SMSegmentView.podspec @@ -0,0 +1,28 @@ +Pod::Spec.new do |s| + + s.name = "SMSegmentView" + s.version = "0.0.1" + s.summary = "Custom segmented control for iOS 7 and above" + + s.description = <<-DESC + Written in Swift. + Support both images and text. + Support vertically organise segments + More customisible than UISegmentedControl and easier to expand with new style. + DESC + + s.homepage = "https://github.com/allenbryan11/SMSegmentView" + s.license = { :type => "MIT", :file => "LICENSE.md" } + s.author = "allenbryan11" + s.platform = :ios, "7.0" + + s.ios.deployment_target = "7.0" + + s.source = { :git => "https://github.com/allenbryan11/SMSegmentView.git", :branch => "master" } + + + s.source_files = "SMSegmentViewController/SMSegmentView/*.swift" + s.requires_arc = true + s.frameworks = 'UIKit' + +end From ffafc021cc3f7da52208f240e9903c8c573d23e4 Mon Sep 17 00:00:00 2001 From: michallaskowski Date: Fri, 2 Oct 2015 15:50:20 +0200 Subject: [PATCH 2/6] Rewrite - for a more generic version of SegmentView, added SMAlphaSegmentView. Took the most basic functionality and put them in SMBasicSegmentView and SMBasicSegment. Added SMAlphaSegmentView as an example how to use the more generic version. Added @IBInspectable declarations and marked classes and relevant functions public. --- .../project.pbxproj | 12 ++ .../SMSegmentView/SMAlphaImageSegment.swift | 98 +++++++++ .../SMSegmentView/SMBasicSegment.swift | 41 ++++ .../SMSegmentView/SMBasicSegmentView.swift | 180 +++++++++++++++++ .../SMSegmentView/SMSegment.swift | 90 ++++----- .../SMSegmentView/SMSegmentView.swift | 188 +++--------------- SMSegmentViewController/ViewController.swift | 48 ++++- 7 files changed, 435 insertions(+), 222 deletions(-) create mode 100644 SMSegmentViewController/SMSegmentView/SMAlphaImageSegment.swift create mode 100644 SMSegmentViewController/SMSegmentView/SMBasicSegment.swift create mode 100644 SMSegmentViewController/SMSegmentView/SMBasicSegmentView.swift diff --git a/SMSegmentViewController.xcodeproj/project.pbxproj b/SMSegmentViewController.xcodeproj/project.pbxproj index 55909da..9f0cc55 100644 --- a/SMSegmentViewController.xcodeproj/project.pbxproj +++ b/SMSegmentViewController.xcodeproj/project.pbxproj @@ -27,6 +27,9 @@ 6957D72E1A5A997A007AC81B /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 6957D72D1A5A997A007AC81B /* Images.xcassets */; }; 6957D7311A5A997A007AC81B /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 6957D72F1A5A997A007AC81B /* LaunchScreen.xib */; }; 6957D73D1A5A997A007AC81B /* SMSegmentViewControllerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6957D73C1A5A997A007AC81B /* SMSegmentViewControllerTests.swift */; }; + C19086811BBCBCF900DCF698 /* SMBasicSegmentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C19086801BBCBCF900DCF698 /* SMBasicSegmentView.swift */; settings = {ASSET_TAGS = (); }; }; + C19086831BBCBD1300DCF698 /* SMBasicSegment.swift in Sources */ = {isa = PBXBuildFile; fileRef = C19086821BBCBD1300DCF698 /* SMBasicSegment.swift */; settings = {ASSET_TAGS = (); }; }; + C19086851BBCC92A00DCF698 /* SMAlphaImageSegment.swift in Sources */ = {isa = PBXBuildFile; fileRef = C19086841BBCC92A00DCF698 /* SMAlphaImageSegment.swift */; settings = {ASSET_TAGS = (); }; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -64,6 +67,9 @@ 6957D7361A5A997A007AC81B /* SMSegmentViewControllerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = SMSegmentViewControllerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 6957D73B1A5A997A007AC81B /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 6957D73C1A5A997A007AC81B /* SMSegmentViewControllerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SMSegmentViewControllerTests.swift; sourceTree = ""; }; + C19086801BBCBCF900DCF698 /* SMBasicSegmentView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SMBasicSegmentView.swift; sourceTree = ""; }; + C19086821BBCBD1300DCF698 /* SMBasicSegment.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SMBasicSegment.swift; sourceTree = ""; }; + C19086841BBCC92A00DCF698 /* SMAlphaImageSegment.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SMAlphaImageSegment.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -89,6 +95,9 @@ children = ( 2346DF371A619FC200DEFA20 /* SMSegmentView.swift */, 2346DF361A619FC200DEFA20 /* SMSegment.swift */, + C19086801BBCBCF900DCF698 /* SMBasicSegmentView.swift */, + C19086821BBCBD1300DCF698 /* SMBasicSegment.swift */, + C19086841BBCC92A00DCF698 /* SMAlphaImageSegment.swift */, ); path = SMSegmentView; sourceTree = ""; @@ -288,6 +297,9 @@ 2346DF391A619FC200DEFA20 /* SMSegmentView.swift in Sources */, 2346DF381A619FC200DEFA20 /* SMSegment.swift in Sources */, 6957D7271A5A997A007AC81B /* AppDelegate.swift in Sources */, + C19086831BBCBD1300DCF698 /* SMBasicSegment.swift in Sources */, + C19086811BBCBCF900DCF698 /* SMBasicSegmentView.swift in Sources */, + C19086851BBCC92A00DCF698 /* SMAlphaImageSegment.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/SMSegmentViewController/SMSegmentView/SMAlphaImageSegment.swift b/SMSegmentViewController/SMSegmentView/SMAlphaImageSegment.swift new file mode 100644 index 0000000..3f7e60f --- /dev/null +++ b/SMSegmentViewController/SMSegmentView/SMAlphaImageSegment.swift @@ -0,0 +1,98 @@ +// +// SMAlphaImageSegment.swift +// SMSegmentViewController +// +// Created by mlaskowski on 01/10/15. +// Copyright © 2015 si.ma. All rights reserved. +// + +import Foundation +import UIKit +public class SMAlphaImageSegment: SMBasicSegment { + + // UI Elements + override public var frame: CGRect { + didSet { + self.resetContentFrame() + } + } + + public var margin: CGFloat = 5.0 { + didSet { + self.resetContentFrame() + } + } + + var vertical = false + + public var animationDuration: NSTimeInterval = 0.5 + public var selectedAlpha: CGFloat = 1.0 + public var unselectedAlpha: CGFloat = 0.3 + public var pressedAlpha: CGFloat = 0.65 + + + internal(set) var imageView: UIImageView = UIImageView() + required public init?(coder aDecoder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + public init(margin: CGFloat, selectedAlpha: CGFloat, unselectedAlpha: CGFloat, pressedAlpha: CGFloat, image: UIImage?) { + + self.margin = margin + self.selectedAlpha = selectedAlpha + self.unselectedAlpha = unselectedAlpha + self.pressedAlpha = pressedAlpha + self.imageView.image = image + self.imageView.alpha = unselectedAlpha + + super.init(frame: CGRectZero) + self.setupUIElements() + } + + override public func orientationChangedTo(mode: SegmentOrganiseMode) { + self.vertical = mode == .SegmentOrganiseVertical + //resetContentFrame(vertical) + } + + func setupUIElements() { + + self.imageView.contentMode = UIViewContentMode.ScaleAspectFit + self.addSubview(self.imageView) + } + + + // MARK: Update Frame + func resetContentFrame() { + let margin = self.vertical ? (self.margin * 1.5) : self.margin; + let imageViewFrame = CGRectMake(margin, margin, self.frame.size.width - margin*2, self.frame.size.height - margin*2) + + self.imageView.frame = imageViewFrame + + } + + // MARK: Selections + override func setSelected(selected: Bool, inView view: SMBasicSegmentView) { + super.setSelected(selected, inView: view) + if selected { + self.startAnimationToAlpha(self.selectedAlpha) + } + else { + self.startAnimationToAlpha(self.unselectedAlpha) + } + } + + func startAnimationToAlpha(alpha: CGFloat){ + UIView.animateWithDuration(self.animationDuration, delay: 0, usingSpringWithDamping: 0.8, initialSpringVelocity: 0.1, options: [.CurveEaseInOut, .BeginFromCurrentState], animations: { () -> Void in + self.imageView.alpha = alpha + }, completion: nil) + } + + // MARK: Handle touch + override public func touchesBegan(touches: Set, withEvent event: UIEvent?) { + super.touchesBegan(touches, withEvent: event) + + if self.isSelected == false { + self.startAnimationToAlpha(self.pressedAlpha) + } + } +} \ No newline at end of file diff --git a/SMSegmentViewController/SMSegmentView/SMBasicSegment.swift b/SMSegmentViewController/SMSegmentView/SMBasicSegment.swift new file mode 100644 index 0000000..0c6786c --- /dev/null +++ b/SMSegmentViewController/SMSegmentView/SMBasicSegment.swift @@ -0,0 +1,41 @@ +// +// SMBasicSegment.swift +// SMSegmentViewController +// +// Created by mlaskowski on 01/10/15. +// Copyright © 2015 si.ma. All rights reserved. +// + +import Foundation +import UIKit + +public class SMBasicSegment : UIView { + internal(set) var index: Int = 0 + internal(set) weak var segmentView: SMBasicSegmentView? + + private(set) var isSelected: Bool = false + + required public init?(coder aDecoder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + override public init(frame: CGRect) { + super.init(frame: frame) + } + + // MARK: Selections + func setSelected(selected: Bool, inView view: SMBasicSegmentView) { + self.isSelected = selected + } + + func orientationChangedTo(mode: SegmentOrganiseMode){ + + } + + override public func touchesEnded(touches: Set, withEvent event: UIEvent?) { + super.touchesEnded(touches, withEvent: event) + if self.isSelected == false{ + self.segmentView?.selectSegmentAtIndex(self.index) + } + } +} \ No newline at end of file diff --git a/SMSegmentViewController/SMSegmentView/SMBasicSegmentView.swift b/SMSegmentViewController/SMSegmentView/SMBasicSegmentView.swift new file mode 100644 index 0000000..b872222 --- /dev/null +++ b/SMSegmentViewController/SMSegmentView/SMBasicSegmentView.swift @@ -0,0 +1,180 @@ +// +// SMBasicSegmentView.swift +// SMSegmentViewController +// +// Created by mlaskowski on 01/10/15. +// Copyright © 2015 si.ma. All rights reserved. +// + +import Foundation +import UIKit + +public enum SegmentOrganiseMode: Int { + case SegmentOrganiseHorizontal = 0 + case SegmentOrganiseVertical +} + + +public protocol SMSegmentViewDelegate: class { + func segmentView(segmentView: SMBasicSegmentView, didSelectSegmentAtIndex index: Int) +} + +public class SMBasicSegmentView: UIView { + var segments: [SMBasicSegment] = [] { + didSet { + var i=0; + for segment in segments { + segment.index = i + i++ + segment.segmentView = self + self.addSubview(segment) + } + self.updateFrameForSegments() + + } + } + weak var delegate: SMSegmentViewDelegate? + + private(set) var indexOfSelectedSegment: Int = NSNotFound + var numberOfSegments: Int {get { + return segments.count + }} + + @IBInspectable var vertical: Bool = false{ + didSet { + let mode = vertical ? SegmentOrganiseMode.SegmentOrganiseVertical : SegmentOrganiseMode.SegmentOrganiseHorizontal + self.orientationChangedTo(mode) + } + } + + // Segment Separator + @IBInspectable var separatorColour: UIColor = UIColor.lightGrayColor() { + didSet { + self.setNeedsDisplay() + } + } + @IBInspectable var separatorWidth: CGFloat = 1.0 { + didSet { + self.updateFrameForSegments() + } + } + + override public var frame: CGRect { + didSet { + self.updateFrameForSegments() + } + } + + public func orientationChangedTo(mode: SegmentOrganiseMode){ + for segment in self.segments { + segment.orientationChangedTo(mode) + } + setNeedsDisplay() + } + + func updateFrameForSegments() { + if self.segments.count == 0 { + return + } + + let count = self.segments.count + if count > 1 { + if self.vertical == false { + let segmentWidth = (self.frame.size.width - self.separatorWidth*CGFloat(count-1)) / CGFloat(count) + var originX: CGFloat = 0.0 + for segment in self.segments { + segment.frame = CGRect(x: originX, y: 0.0, width: segmentWidth, height: self.frame.size.height) + originX += segmentWidth + self.separatorWidth + } + } + else { + let segmentHeight = (self.frame.size.height - self.separatorWidth*CGFloat(count-1)) / CGFloat(count) + var originY: CGFloat = 0.0 + for segment in self.segments { + segment.frame = CGRect(x: 0.0, y: originY, width: self.frame.size.width, height: segmentHeight) + originY += segmentHeight + self.separatorWidth + } + } + } + else { + self.segments[0].frame = CGRect(x: 0.0, y: 0.0, width: self.frame.size.width, height: self.frame.size.height) + } + + self.setNeedsDisplay() + } + + + func drawSeparatorWithContext(context: CGContextRef) { + CGContextSaveGState(context) + + if self.segments.count > 1 { + let path = CGPathCreateMutable() + + if self.vertical == false { + var originX: CGFloat = self.segments[0].frame.size.width + self.separatorWidth/2.0 + for index in 1..= 0 && index < self.segments.count, "Index at \(index) is out of bounds") + + if self.indexOfSelectedSegment != NSNotFound { + let previousSelectedSegment = self.segments[self.indexOfSelectedSegment] + previousSelectedSegment.setSelected(false, inView: self) + } + self.indexOfSelectedSegment = index + let segment = self.segments[index] + segment.setSelected(true, inView: self) + self.delegate?.segmentView(self, didSelectSegmentAtIndex: index) + } + + public func deselectSegment() { + if self.indexOfSelectedSegment != NSNotFound { + let segment = self.segments[self.indexOfSelectedSegment] + segment.setSelected(false, inView: self) + self.indexOfSelectedSegment = NSNotFound + } + } + + public func addSegment(segment: SMBasicSegment){ + segment.index = self.segments.count + self.segments.append(segment) + + segment.segmentView = self + self.updateFrameForSegments() + self.addSubview(segment) + + } + +} \ No newline at end of file diff --git a/SMSegmentViewController/SMSegmentView/SMSegment.swift b/SMSegmentViewController/SMSegmentView/SMSegment.swift index beeccea..cbda70d 100644 --- a/SMSegmentViewController/SMSegmentView/SMSegment.swift +++ b/SMSegmentViewController/SMSegmentView/SMSegment.swift @@ -7,34 +7,30 @@ import UIKit -protocol SMSegmentDelegate: class { - func selectSegment(segment: SMSegment) -} - -class SMSegment: UIView { - - weak var delegate: SMSegmentDelegate? +public class SMSegment: SMBasicSegment { - private(set) var isSelected: Bool = false - private var shouldResponse: Bool! - var index: Int = 0 - var verticalMargin: CGFloat = 5.0 { + // UI Elements + override public var frame: CGRect { didSet { self.resetContentFrame() } } - var separatorWidth: CGFloat - + public var verticalMargin: CGFloat = 5.0 { + didSet { + self.resetContentFrame() + } + } + // Segment Colour - var onSelectionColour: UIColor = UIColor.darkGrayColor() { + public var onSelectionColour: UIColor = UIColor.darkGrayColor() { didSet { if self.isSelected == true { self.backgroundColor = self.onSelectionColour } } } - var offSelectionColour: UIColor = UIColor.whiteColor() { + public var offSelectionColour: UIColor = UIColor.whiteColor() { didSet { if self.isSelected == false { self.backgroundColor = self.offSelectionColour @@ -53,7 +49,7 @@ class SMSegment: UIView { } // Segment Title Text & Colour & Font - var title: String? { + public var title: String? { didSet { self.label.text = self.title @@ -67,21 +63,21 @@ class SMSegment: UIView { self.resetContentFrame() } } - var onSelectionTextColour: UIColor = UIColor.whiteColor() { + public var onSelectionTextColour: UIColor = UIColor.whiteColor() { didSet { if self.isSelected == true { self.label.textColor = self.onSelectionTextColour } } } - var offSelectionTextColour: UIColor = UIColor.darkGrayColor() { + public var offSelectionTextColour: UIColor = UIColor.darkGrayColor() { didSet { if self.isSelected == false { self.label.textColor = self.offSelectionTextColour } } } - var titleFont: UIFont = UIFont.systemFontOfSize(17.0) { + public var titleFont: UIFont = UIFont.systemFontOfSize(17.0) { didSet { self.label.font = self.titleFont @@ -97,7 +93,7 @@ class SMSegment: UIView { } // Segment Image - var onSelectionImage: UIImage? { + public var onSelectionImage: UIImage? { didSet { if self.onSelectionImage != nil { self.resetContentFrame() @@ -107,7 +103,7 @@ class SMSegment: UIView { } } } - var offSelectionImage: UIImage? { + public var offSelectionImage: UIImage? { didSet { if self.offSelectionImage != nil { self.resetContentFrame() @@ -118,23 +114,17 @@ class SMSegment: UIView { } } - // UI Elements - override var frame: CGRect { - didSet { - self.resetContentFrame() - } - } + private var imageView: UIImageView = UIImageView() private var label: UILabel = UILabel() private var labelWidth: CGFloat = 0.0 - required init?(coder aDecoder: NSCoder) { + required public init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } - init(separatorWidth: CGFloat, verticalMargin: CGFloat, onSelectionColour: UIColor, offSelectionColour: UIColor, onSelectionTextColour: UIColor, offSelectionTextColour: UIColor, titleFont: UIFont) { + public init(verticalMargin: CGFloat, onSelectionColour: UIColor, offSelectionColour: UIColor, onSelectionTextColour: UIColor, offSelectionTextColour: UIColor, titleFont: UIFont) { - self.separatorWidth = separatorWidth self.verticalMargin = verticalMargin self.onSelectionColour = onSelectionColour self.offSelectionColour = offSelectionColour @@ -146,6 +136,8 @@ class SMSegment: UIView { self.setupUIElements() } + + func setupUIElements() { self.backgroundColor = self.offSelectionColour @@ -159,21 +151,6 @@ class SMSegment: UIView { self.addSubview(self.label) } - // MARK: Selections - func setSelected(selected: Bool) { - if selected == true { - self.isSelected = true - self.backgroundColor = self.onSelectionColour - self.label.textColor = self.onSelectionTextColour - self.imageView.image = self.onSelectionImage - } - else { - self.isSelected = false - self.backgroundColor = self.offSelectionColour - self.label.textColor = self.offSelectionTextColour - self.imageView.image = self.offSelectionImage - } - } // MARK: Update Frame private func resetContentFrame() { @@ -201,19 +178,28 @@ class SMSegment: UIView { self.label.frame = CGRectMake(imageViewFrame.origin.x + imageViewFrame.size.width + distanceBetween, self.verticalMargin, self.labelWidth, self.frame.size.height - self.verticalMargin * 2) } + // MARK: Selections + override public func setSelected(selected: Bool, inView view: SMBasicSegmentView) { + super.setSelected(selected, inView: view) + if selected { + self.backgroundColor = self.onSelectionColour + self.label.textColor = self.onSelectionTextColour + self.imageView.image = self.onSelectionImage + } + else { + self.backgroundColor = self.offSelectionColour + self.label.textColor = self.offSelectionTextColour + self.imageView.image = self.offSelectionImage + } + } + // MARK: Handle touch - override func touchesBegan(touches: Set, withEvent event: UIEvent?) { + override public func touchesBegan(touches: Set, withEvent event: UIEvent?) { super.touchesBegan(touches, withEvent: event) if self.isSelected == false { - self.shouldResponse = true self.backgroundColor = self.willOnSelectionColour } } - override func touchesEnded(touches: Set, withEvent event: UIEvent?) { - super.touchesEnded(touches, withEvent: event) - - self.delegate?.selectSegment(self) - } } \ No newline at end of file diff --git a/SMSegmentViewController/SMSegmentView/SMSegmentView.swift b/SMSegmentViewController/SMSegmentView/SMSegmentView.swift index 9143007..1347758 100644 --- a/SMSegmentViewController/SMSegmentView/SMSegmentView.swift +++ b/SMSegmentViewController/SMSegmentView/SMSegmentView.swift @@ -26,109 +26,73 @@ let keySegmentOffSelectionTextColour = "OffSelectionTextColour" let keySegmentTitleFont = "TitleFont" -enum SegmentOrganiseMode: Int { - case SegmentOrganiseHorizontal = 0 - case SegmentOrganiseVertical -} - -protocol SMSegmentViewDelegate: class { - func segmentView(segmentView: SMSegmentView, didSelectSegmentAtIndex index: Int) -} -class SMSegmentView: UIView, SMSegmentDelegate { - weak var delegate: SMSegmentViewDelegate? - - var indexOfSelectedSegment = NSNotFound - var numberOfSegments = 0 - - var organiseMode: SegmentOrganiseMode = SegmentOrganiseMode.SegmentOrganiseHorizontal { - didSet { - self.setNeedsDisplay() - } - } +@IBDesignable +public class SMSegmentView: SMBasicSegmentView { - var segmentVerticalMargin: CGFloat = 5.0 { + @IBInspectable public var segmentVerticalMargin: CGFloat = 5.0 { didSet { - for segment in self.segments { + for segment in self.segments as! [SMSegment] { segment.verticalMargin = self.segmentVerticalMargin } } } - // Segment Separator - var separatorColour: UIColor = UIColor.lightGrayColor() { - didSet { - self.setNeedsDisplay() - } - } - var separatorWidth: CGFloat = 1.0 { - didSet { - for segment in self.segments { - segment.separatorWidth = self.separatorWidth - } - self.updateFrameForSegments() - } - } - + // Segment Colour - var segmentOnSelectionColour: UIColor = UIColor.darkGrayColor() { + @IBInspectable public var segmentOnSelectionColour: UIColor = UIColor.darkGrayColor() { didSet { - for segment in self.segments { + for segment in self.segments as! [SMSegment] { segment.onSelectionColour = self.segmentOnSelectionColour } } } - var segmentOffSelectionColour: UIColor = UIColor.whiteColor() { + @IBInspectable public var segmentOffSelectionColour: UIColor = UIColor.whiteColor() { didSet { - for segment in self.segments { + for segment in self.segments as! [SMSegment] { segment.offSelectionColour = self.segmentOffSelectionColour } } } // Segment Title Text Colour & Font - var segmentOnSelectionTextColour: UIColor = UIColor.whiteColor() { + @IBInspectable public var segmentOnSelectionTextColour: UIColor = UIColor.whiteColor() { didSet { - for segment in self.segments { + for segment in self.segments as! [SMSegment] { segment.onSelectionTextColour = self.segmentOnSelectionTextColour } } } - var segmentOffSelectionTextColour: UIColor = UIColor.darkGrayColor() { + @IBInspectable public var segmentOffSelectionTextColour: UIColor = UIColor.darkGrayColor() { didSet { - for segment in self.segments { + for segment in self.segments as! [SMSegment] { segment.offSelectionTextColour = self.segmentOffSelectionTextColour } } } - var segmentTitleFont: UIFont = UIFont.systemFontOfSize(17.0) { + @IBInspectable public var segmentTitleFont: UIFont = UIFont.systemFontOfSize(17.0) { didSet { - for segment in self.segments { + for segment in self.segments as! [SMSegment] { segment.titleFont = self.segmentTitleFont } } } - - override var frame: CGRect { - didSet { - self.updateFrameForSegments() - } - } - - private var segments: Array = Array() - - required init?(coder aDecoder: NSCoder) { + + required public init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } - override init(frame: CGRect) { + override public init(frame: CGRect) { super.init(frame: frame) self.backgroundColor = UIColor.clearColor() self.layer.masksToBounds = true } - init(frame: CGRect, separatorColour: UIColor, separatorWidth: CGFloat, segmentProperties: Dictionary?) { + public init(frame: CGRect, separatorColour: UIColor, separatorWidth: CGFloat, segmentProperties: Dictionary?) { + + super.init(frame: frame) + self.separatorColour = separatorColour self.separatorWidth = separatorWidth @@ -171,121 +135,21 @@ class SMSegmentView: UIView, SMSegmentDelegate { self.segmentTitleFont = UIFont.systemFontOfSize(17.0) } - super.init(frame: frame) self.backgroundColor = UIColor.clearColor() self.layer.masksToBounds = true } - func addSegmentWithTitle(title: String?, onSelectionImage: UIImage?, offSelectionImage: UIImage?) { + public func addSegmentWithTitle(title: String?, onSelectionImage: UIImage?, offSelectionImage: UIImage?) -> SMSegment { - let segment = SMSegment(separatorWidth: self.separatorWidth, verticalMargin: self.segmentVerticalMargin, onSelectionColour: self.segmentOnSelectionColour, offSelectionColour: self.segmentOffSelectionColour, onSelectionTextColour: self.segmentOnSelectionTextColour, offSelectionTextColour: self.segmentOffSelectionTextColour, titleFont: self.segmentTitleFont) - segment.index = self.segments.count - self.segments.append(segment) - self.updateFrameForSegments() + let segment = SMSegment(verticalMargin: self.segmentVerticalMargin, onSelectionColour: self.segmentOnSelectionColour, offSelectionColour: self.segmentOffSelectionColour, onSelectionTextColour: self.segmentOnSelectionTextColour, offSelectionTextColour: self.segmentOffSelectionTextColour, titleFont: self.segmentTitleFont) - segment.delegate = self segment.title = title segment.onSelectionImage = onSelectionImage segment.offSelectionImage = offSelectionImage - self.addSubview(segment) + super.addSegment(segment) - self.numberOfSegments = self.segments.count + return segment } - func updateFrameForSegments() { - if self.segments.count == 0 { - return - } - - let count = self.segments.count - if count > 1 { - if self.organiseMode == SegmentOrganiseMode.SegmentOrganiseHorizontal { - let segmentWidth = (self.frame.size.width - self.separatorWidth*CGFloat(count-1)) / CGFloat(count) - var originX: CGFloat = 0.0 - for segment in self.segments { - segment.frame = CGRect(x: originX, y: 0.0, width: segmentWidth, height: self.frame.size.height) - originX += segmentWidth + self.separatorWidth - } - } - else { - let segmentHeight = (self.frame.size.height - self.separatorWidth*CGFloat(count-1)) / CGFloat(count) - var originY: CGFloat = 0.0 - for segment in self.segments { - segment.frame = CGRect(x: 0.0, y: originY, width: self.frame.size.width, height: segmentHeight) - originY += segmentHeight + self.separatorWidth - } - } - } - else { - self.segments[0].frame = CGRect(x: 0.0, y: 0.0, width: self.frame.size.width, height: self.frame.size.height) - } - - self.setNeedsDisplay() - } - - // MARK: SMSegment Delegate - func selectSegment(segment: SMSegment) { - if self.indexOfSelectedSegment != NSNotFound { - let previousSelectedSegment = self.segments[self.indexOfSelectedSegment] - previousSelectedSegment.setSelected(false) - } - self.indexOfSelectedSegment = segment.index - segment.setSelected(true) - self.delegate?.segmentView(self, didSelectSegmentAtIndex: segment.index) - } - - // MARK: Actions - func selectSegmentAtIndex(index: Int) { - assert(index >= 0 && index < self.segments.count, "Index at \(index) is out of bounds") - self.selectSegment(self.segments[index]) - } - - func deselectSegment() { - if self.indexOfSelectedSegment != NSNotFound { - let segment = self.segments[self.indexOfSelectedSegment] - segment.setSelected(false) - self.indexOfSelectedSegment = NSNotFound - } - } - - // MARK: Drawing Segment Separators - override func drawRect(rect: CGRect) { - let context = UIGraphicsGetCurrentContext()! - self.drawSeparatorWithContext(context) - } - - func drawSeparatorWithContext(context: CGContextRef) { - CGContextSaveGState(context) - - if self.segments.count > 1 { - let path = CGPathCreateMutable() - - if self.organiseMode == SegmentOrganiseMode.SegmentOrganiseHorizontal { - var originX: CGFloat = self.segments[0].frame.size.width + self.separatorWidth/2.0 - for index in 1.. Date: Tue, 6 Oct 2015 20:46:59 +0200 Subject: [PATCH 3/6] Fix - set more variables and methods as public --- .../SMSegmentView/SMBasicSegment.swift | 10 +++++----- .../SMSegmentView/SMBasicSegmentView.swift | 16 ++++++++-------- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/SMSegmentViewController/SMSegmentView/SMBasicSegment.swift b/SMSegmentViewController/SMSegmentView/SMBasicSegment.swift index 0c6786c..736e07e 100644 --- a/SMSegmentViewController/SMSegmentView/SMBasicSegment.swift +++ b/SMSegmentViewController/SMSegmentView/SMBasicSegment.swift @@ -10,10 +10,10 @@ import Foundation import UIKit public class SMBasicSegment : UIView { - internal(set) var index: Int = 0 - internal(set) weak var segmentView: SMBasicSegmentView? + public internal(set) var index: Int = 0 + public internal(set) weak var segmentView: SMBasicSegmentView? - private(set) var isSelected: Bool = false + public private(set) var isSelected: Bool = false required public init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") @@ -24,11 +24,11 @@ public class SMBasicSegment : UIView { } // MARK: Selections - func setSelected(selected: Bool, inView view: SMBasicSegmentView) { + internal func setSelected(selected: Bool, inView view: SMBasicSegmentView) { self.isSelected = selected } - func orientationChangedTo(mode: SegmentOrganiseMode){ + public func orientationChangedTo(mode: SegmentOrganiseMode){ } diff --git a/SMSegmentViewController/SMSegmentView/SMBasicSegmentView.swift b/SMSegmentViewController/SMSegmentView/SMBasicSegmentView.swift index b872222..ac223f9 100644 --- a/SMSegmentViewController/SMSegmentView/SMBasicSegmentView.swift +++ b/SMSegmentViewController/SMSegmentView/SMBasicSegmentView.swift @@ -20,7 +20,7 @@ public protocol SMSegmentViewDelegate: class { } public class SMBasicSegmentView: UIView { - var segments: [SMBasicSegment] = [] { + public var segments: [SMBasicSegment] = [] { didSet { var i=0; for segment in segments { @@ -33,14 +33,14 @@ public class SMBasicSegmentView: UIView { } } - weak var delegate: SMSegmentViewDelegate? + public weak var delegate: SMSegmentViewDelegate? - private(set) var indexOfSelectedSegment: Int = NSNotFound + public private(set) var indexOfSelectedSegment: Int = NSNotFound var numberOfSegments: Int {get { return segments.count }} - @IBInspectable var vertical: Bool = false{ + @IBInspectable public var vertical: Bool = false{ didSet { let mode = vertical ? SegmentOrganiseMode.SegmentOrganiseVertical : SegmentOrganiseMode.SegmentOrganiseHorizontal self.orientationChangedTo(mode) @@ -48,12 +48,12 @@ public class SMBasicSegmentView: UIView { } // Segment Separator - @IBInspectable var separatorColour: UIColor = UIColor.lightGrayColor() { + @IBInspectable public var separatorColour: UIColor = UIColor.lightGrayColor() { didSet { self.setNeedsDisplay() } } - @IBInspectable var separatorWidth: CGFloat = 1.0 { + @IBInspectable public var separatorWidth: CGFloat = 1.0 { didSet { self.updateFrameForSegments() } @@ -72,7 +72,7 @@ public class SMBasicSegmentView: UIView { setNeedsDisplay() } - func updateFrameForSegments() { + public func updateFrameForSegments() { if self.segments.count == 0 { return } @@ -104,7 +104,7 @@ public class SMBasicSegmentView: UIView { } - func drawSeparatorWithContext(context: CGContextRef) { + public func drawSeparatorWithContext(context: CGContextRef) { CGContextSaveGState(context) if self.segments.count > 1 { From d14720aa309328d28cb7c14f3eb3c75a4c2524bb Mon Sep 17 00:00:00 2001 From: michallaskowski Date: Thu, 22 Oct 2015 15:30:18 +0200 Subject: [PATCH 4/6] Add proper .gitignore --- .gitignore | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4b6f50b --- /dev/null +++ b/.gitignore @@ -0,0 +1,58 @@ +# Created by https://www.gitignore.io/api/xcode,osx + +### Carthage ### +Carthage/ + +### Xcode ### +# Xcode +# +# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore + +## Build generated +build/ +DerivedData + +## Various settings +*.pbxuser +!default.pbxuser +*.mode1v3 +!default.mode1v3 +*.mode2v3 +!default.mode2v3 +*.perspectivev3 +!default.perspectivev3 +xcuserdata + +## Other +*.xccheckout +*.moved-aside +*.xcuserstate + + +### OSX ### +.DS_Store +.AppleDouble +.LSOverride + +# Icon must end with two \r +Icon + + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk + From 7c487678cad338e00eed5b4cd0aed268f28fd9c4 Mon Sep 17 00:00:00 2001 From: michallaskowski Date: Thu, 22 Oct 2015 15:24:19 +0200 Subject: [PATCH 5/6] Add framework target, useful for Carthage --- SMSegmentView/Info.plist | 26 ++++ SMSegmentView/SMSegmentView.h | 19 +++ .../project.pbxproj | 132 ++++++++++++++++++ .../xcschemes/SMSegmentView.xcscheme | 80 +++++++++++ 4 files changed, 257 insertions(+) create mode 100644 SMSegmentView/Info.plist create mode 100644 SMSegmentView/SMSegmentView.h create mode 100644 SMSegmentViewController.xcodeproj/xcshareddata/xcschemes/SMSegmentView.xcscheme diff --git a/SMSegmentView/Info.plist b/SMSegmentView/Info.plist new file mode 100644 index 0000000..d3de8ee --- /dev/null +++ b/SMSegmentView/Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + $(CURRENT_PROJECT_VERSION) + NSPrincipalClass + + + diff --git a/SMSegmentView/SMSegmentView.h b/SMSegmentView/SMSegmentView.h new file mode 100644 index 0000000..879f585 --- /dev/null +++ b/SMSegmentView/SMSegmentView.h @@ -0,0 +1,19 @@ +// +// SMSegmentView.h +// SMSegmentView +// +// Created by mlaskowski on 22/10/15. +// Copyright © 2015 si.ma. All rights reserved. +// + +#import + +//! Project version number for SMSegmentView. +FOUNDATION_EXPORT double SMSegmentViewVersionNumber; + +//! Project version string for SMSegmentView. +FOUNDATION_EXPORT const unsigned char SMSegmentViewVersionString[]; + +// In this header, you should import all the public headers of your framework using statements like #import + + diff --git a/SMSegmentViewController.xcodeproj/project.pbxproj b/SMSegmentViewController.xcodeproj/project.pbxproj index 9f0cc55..c99d768 100644 --- a/SMSegmentViewController.xcodeproj/project.pbxproj +++ b/SMSegmentViewController.xcodeproj/project.pbxproj @@ -30,6 +30,12 @@ C19086811BBCBCF900DCF698 /* SMBasicSegmentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C19086801BBCBCF900DCF698 /* SMBasicSegmentView.swift */; settings = {ASSET_TAGS = (); }; }; C19086831BBCBD1300DCF698 /* SMBasicSegment.swift in Sources */ = {isa = PBXBuildFile; fileRef = C19086821BBCBD1300DCF698 /* SMBasicSegment.swift */; settings = {ASSET_TAGS = (); }; }; C19086851BBCC92A00DCF698 /* SMAlphaImageSegment.swift in Sources */ = {isa = PBXBuildFile; fileRef = C19086841BBCC92A00DCF698 /* SMAlphaImageSegment.swift */; settings = {ASSET_TAGS = (); }; }; + C19594531BD91785008D80C0 /* SMSegmentView.h in Headers */ = {isa = PBXBuildFile; fileRef = C19594521BD91785008D80C0 /* SMSegmentView.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C19594581BD917ED008D80C0 /* SMSegmentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2346DF371A619FC200DEFA20 /* SMSegmentView.swift */; }; + C19594591BD917ED008D80C0 /* SMSegment.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2346DF361A619FC200DEFA20 /* SMSegment.swift */; }; + C195945A1BD917ED008D80C0 /* SMBasicSegmentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C19086801BBCBCF900DCF698 /* SMBasicSegmentView.swift */; }; + C195945B1BD917ED008D80C0 /* SMBasicSegment.swift in Sources */ = {isa = PBXBuildFile; fileRef = C19086821BBCBD1300DCF698 /* SMBasicSegment.swift */; }; + C195945C1BD917ED008D80C0 /* SMAlphaImageSegment.swift in Sources */ = {isa = PBXBuildFile; fileRef = C19086841BBCC92A00DCF698 /* SMAlphaImageSegment.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -70,6 +76,9 @@ C19086801BBCBCF900DCF698 /* SMBasicSegmentView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SMBasicSegmentView.swift; sourceTree = ""; }; C19086821BBCBD1300DCF698 /* SMBasicSegment.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SMBasicSegment.swift; sourceTree = ""; }; C19086841BBCC92A00DCF698 /* SMAlphaImageSegment.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SMAlphaImageSegment.swift; sourceTree = ""; }; + C19594501BD91785008D80C0 /* SMSegmentView.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SMSegmentView.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + C19594521BD91785008D80C0 /* SMSegmentView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SMSegmentView.h; sourceTree = ""; }; + C19594541BD91785008D80C0 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -87,6 +96,13 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + C195944C1BD91785008D80C0 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ @@ -107,6 +123,7 @@ children = ( 6957D7231A5A997A007AC81B /* SMSegmentViewController */, 6957D7391A5A997A007AC81B /* SMSegmentViewControllerTests */, + C19594511BD91785008D80C0 /* SMSegmentView */, 6957D7221A5A997A007AC81B /* Products */, ); sourceTree = ""; @@ -116,6 +133,7 @@ children = ( 6957D7211A5A997A007AC81B /* SMSegmentViewController.app */, 6957D7361A5A997A007AC81B /* SMSegmentViewControllerTests.xctest */, + C19594501BD91785008D80C0 /* SMSegmentView.framework */, ); name = Products; sourceTree = ""; @@ -179,8 +197,28 @@ path = Images; sourceTree = ""; }; + C19594511BD91785008D80C0 /* SMSegmentView */ = { + isa = PBXGroup; + children = ( + C19594521BD91785008D80C0 /* SMSegmentView.h */, + C19594541BD91785008D80C0 /* Info.plist */, + ); + path = SMSegmentView; + sourceTree = ""; + }; /* End PBXGroup section */ +/* Begin PBXHeadersBuildPhase section */ + C195944D1BD91785008D80C0 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + C19594531BD91785008D80C0 /* SMSegmentView.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + /* Begin PBXNativeTarget section */ 6957D7201A5A997A007AC81B /* SMSegmentViewController */ = { isa = PBXNativeTarget; @@ -217,6 +255,24 @@ productReference = 6957D7361A5A997A007AC81B /* SMSegmentViewControllerTests.xctest */; productType = "com.apple.product-type.bundle.unit-test"; }; + C195944F1BD91785008D80C0 /* SMSegmentView */ = { + isa = PBXNativeTarget; + buildConfigurationList = C19594571BD91785008D80C0 /* Build configuration list for PBXNativeTarget "SMSegmentView" */; + buildPhases = ( + C195944B1BD91785008D80C0 /* Sources */, + C195944C1BD91785008D80C0 /* Frameworks */, + C195944D1BD91785008D80C0 /* Headers */, + C195944E1BD91785008D80C0 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = SMSegmentView; + productName = SMSegmentView; + productReference = C19594501BD91785008D80C0 /* SMSegmentView.framework */; + productType = "com.apple.product-type.framework"; + }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ @@ -235,6 +291,9 @@ CreatedOnToolsVersion = 6.1; TestTargetID = 6957D7201A5A997A007AC81B; }; + C195944F1BD91785008D80C0 = { + CreatedOnToolsVersion = 7.0.1; + }; }; }; buildConfigurationList = 6957D71C1A5A997A007AC81B /* Build configuration list for PBXProject "SMSegmentViewController" */; @@ -252,6 +311,7 @@ targets = ( 6957D7201A5A997A007AC81B /* SMSegmentViewController */, 6957D7351A5A997A007AC81B /* SMSegmentViewControllerTests */, + C195944F1BD91785008D80C0 /* SMSegmentView */, ); }; /* End PBXProject section */ @@ -286,6 +346,13 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + C195944E1BD91785008D80C0 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ @@ -311,6 +378,18 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + C195944B1BD91785008D80C0 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + C19594581BD917ED008D80C0 /* SMSegmentView.swift in Sources */, + C19594591BD917ED008D80C0 /* SMSegment.swift in Sources */, + C195945A1BD917ED008D80C0 /* SMBasicSegmentView.swift in Sources */, + C195945B1BD917ED008D80C0 /* SMBasicSegment.swift in Sources */, + C195945C1BD917ED008D80C0 /* SMAlphaImageSegment.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ @@ -475,6 +554,51 @@ }; name = Release; }; + C19594551BD91785008D80C0 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = dwarf; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + GCC_NO_COMMON_BLOCKS = YES; + INFOPLIST_FILE = SMSegmentView/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = sima.SMSegmentView; + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + C19594561BD91785008D80C0 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + GCC_NO_COMMON_BLOCKS = YES; + INFOPLIST_FILE = SMSegmentView/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = sima.SMSegmentView; + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ @@ -505,6 +629,14 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; + C19594571BD91785008D80C0 /* Build configuration list for PBXNativeTarget "SMSegmentView" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + C19594551BD91785008D80C0 /* Debug */, + C19594561BD91785008D80C0 /* Release */, + ); + defaultConfigurationIsVisible = 0; + }; /* End XCConfigurationList section */ }; rootObject = 6957D7191A5A997A007AC81B /* Project object */; diff --git a/SMSegmentViewController.xcodeproj/xcshareddata/xcschemes/SMSegmentView.xcscheme b/SMSegmentViewController.xcodeproj/xcshareddata/xcschemes/SMSegmentView.xcscheme new file mode 100644 index 0000000..0591eb2 --- /dev/null +++ b/SMSegmentViewController.xcodeproj/xcshareddata/xcschemes/SMSegmentView.xcscheme @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 93540feebd19642dff740987c590c04863d9dfba Mon Sep 17 00:00:00 2001 From: michallaskowski Date: Tue, 6 Oct 2015 20:51:49 +0200 Subject: [PATCH 6/6] =?UTF-8?q?Fix=20-=20update=20segments=E2=80=99=20fram?= =?UTF-8?q?es=20when=20layoutSubviews.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When using autoLayout setFrame was not always called, and the views where not refreshed. The frame was only set once with width of 560, which was incorrect. --- .../SMSegmentView/SMBasicSegmentView.swift | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/SMSegmentViewController/SMSegmentView/SMBasicSegmentView.swift b/SMSegmentViewController/SMSegmentView/SMBasicSegmentView.swift index ac223f9..67c90cd 100644 --- a/SMSegmentViewController/SMSegmentView/SMBasicSegmentView.swift +++ b/SMSegmentViewController/SMSegmentView/SMBasicSegmentView.swift @@ -59,10 +59,9 @@ public class SMBasicSegmentView: UIView { } } - override public var frame: CGRect { - didSet { - self.updateFrameForSegments() - } + public override func layoutSubviews() { + super.layoutSubviews() + self.updateFrameForSegments() } public func orientationChangedTo(mode: SegmentOrganiseMode){