2020// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
2121// IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
2222
23- #import " TOSegmentedControlItem .h"
23+ #import " TOSegmentedControlSegment .h"
2424#import " TOSegmentedControl.h"
2525#import < UIKit/UIKit.h>
2626
@@ -35,20 +35,23 @@ @interface TOSegmentedControl ()
3535// -------------------------------------------------
3636// Private Interface
3737
38- @interface TOSegmentedControlItem ()
38+ @interface TOSegmentedControlSegment ()
3939
4040// Weak reference to our parent segmented control
4141@property (nonatomic , weak ) TOSegmentedControl *segmentedControl;
4242
4343// Read-write access to the item view
4444@property (nonatomic , strong , readwrite ) UIView *itemView;
4545
46+ // When made reversible, the container for arrow image view to show
47+ @property (nonatomic , strong , readwrite ) UIView *arrowView;
48+
4649// When made reversible, the arrow image view to show
4750@property (nonatomic , strong ) UIImageView *arrowImageView;
4851
4952@end
5053
51- @implementation TOSegmentedControlItem
54+ @implementation TOSegmentedControlSegment
5255
5356#pragma mark - Object Lifecyle -
5457
@@ -132,20 +135,20 @@ - (void)dealloc
132135
133136#pragma mark - Comnvenience Initializers -
134137
135- + (NSArray *)itemsWithObjects : (NSArray *)objects forSegmentedControl : (nonnull TOSegmentedControl *)segmentedControl
138+ + (NSArray *)segmentsWithObjects : (NSArray *)objects forSegmentedControl : (nonnull TOSegmentedControl *)segmentedControl
136139{
137140 NSMutableArray *array = [NSMutableArray array ];
138141
139142 // Create an object for each item in the array.
140143 // Skip anything that isn't an image or a label
141144 for (id object in objects) {
142- TOSegmentedControlItem *item = nil ;
145+ TOSegmentedControlSegment *item = nil ;
143146 if ([object isKindOfClass: NSString .class]) {
144- item = [[TOSegmentedControlItem alloc ] initWithTitle: object
147+ item = [[TOSegmentedControlSegment alloc ] initWithTitle: object
145148 forSegmentedControl: segmentedControl];
146149 }
147150 else if ([object isKindOfClass: UIImage.class]) {
148- item = [[TOSegmentedControlItem alloc ] initWithImage: object
151+ item = [[TOSegmentedControlSegment alloc ] initWithImage: object
149152 forSegmentedControl: segmentedControl];
150153 }
151154
@@ -170,36 +173,30 @@ - (void)commonInit
170173
171174- (void )refreshReversibleView
172175{
173- // Whether it's in memory or not, set the tint color
174- self.arrowImageView .tintColor = self.segmentedControl .itemColor ;
175-
176176 // If we're no longer (Or never were) reversible,
177177 // hide and exit out
178178 if (!self.isReversible ) {
179- self.arrowImageView .hidden = YES ;
179+ self.arrowView .hidden = YES ;
180180 return ;
181181 }
182182
183183 // Create the arrow view if we haven't done so yet
184- if (self.arrowImageView == nil ) {
184+ if (self.arrowView == nil && self. arrowImageView == nil ) {
185185 UIImage *arrow = self.segmentedControl .arrowImage ;
186+ self.arrowView = [[UIView alloc ] initWithFrame: (CGRect){CGPointZero, arrow.size }];
187+ self.arrowView .alpha = 0 .0f ;
188+ [self .segmentedControl.trackView addSubview: self .arrowView];
189+
186190 self.arrowImageView = [[UIImageView alloc ] initWithImage: arrow];
191+ self.arrowImageView .autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
192+ [self .arrowView addSubview: self .arrowImageView];
187193 }
188-
189- // Add the arrow to the item view
190- self.itemView .clipsToBounds = NO ;
191- [self .itemView addSubview: self .arrowImageView];
192-
193- // Line up the item view vertically centered next to the item view
194- self.arrowImageView .autoresizingMask = UIViewAutoresizingFlexibleTopMargin |
195- UIViewAutoresizingFlexibleBottomMargin |
196- UIViewAutoresizingFlexibleLeftMargin;
197-
198- CGRect itemFrame = self.itemView .frame ;
199- CGRect frame = self.arrowImageView .frame ;
200- frame.origin .x = CGRectGetMaxX (itemFrame) + 2 .0f ;
201- frame.origin .y = (CGRectGetHeight (itemFrame) - CGRectGetHeight (frame)) * 0 .5f ;
202- self.arrowImageView .frame = frame;
194+
195+ // Perform these updates, but never animate them
196+ [UIView performWithoutAnimation: ^{
197+ // Set the tint color
198+ self.arrowImageView .tintColor = self.segmentedControl .itemColor ;
199+ }];
203200}
204201
205202#pragma mark - View Management -
@@ -321,4 +318,14 @@ - (UIImageView *)imageView
321318 return nil ;
322319}
323320
321+ - (void )setArrowImageReversed : (BOOL )reversed
322+ {
323+ if (reversed) {
324+ self.arrowImageView .transform = CGAffineTransformRotate (CGAffineTransformIdentity, M_PI);
325+ return ;
326+ }
327+
328+ self.arrowImageView .transform = CGAffineTransformIdentity;
329+ }
330+
324331@end
0 commit comments