123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263 |
- //
- // HMSegmentedControl.h
- // HMSegmentedControl
- //
- // Created by Hesham Abd-Elmegid on 23/12/12.
- // Copyright (c) 2012-2015 Hesham Abd-Elmegid. All rights reserved.
- //
-
- #import <UIKit/UIKit.h>
-
- @class HMSegmentedControl;
-
- typedef void (^IndexChangeBlock)(NSInteger index);
- typedef NSAttributedString *(^HMTitleFormatterBlock)(HMSegmentedControl *segmentedControl, NSString *title, NSUInteger index, BOOL selected);
-
- typedef NS_ENUM(NSInteger, HMSegmentedControlSelectionStyle) {
- HMSegmentedControlSelectionStyleTextWidthStripe, // Indicator width will only be as big as the text width
- HMSegmentedControlSelectionStyleFullWidthStripe, // Indicator width will fill the whole segment
- HMSegmentedControlSelectionStyleBox, // A rectangle that covers the whole segment
- HMSegmentedControlSelectionStyleArrow // An arrow in the middle of the segment pointing up or down depending on `HMSegmentedControlSelectionIndicatorLocation`
- };
-
- typedef NS_ENUM(NSInteger, HMSegmentedControlSelectionIndicatorLocation) {
- HMSegmentedControlSelectionIndicatorLocationUp,
- HMSegmentedControlSelectionIndicatorLocationDown,
- HMSegmentedControlSelectionIndicatorLocationNone // No selection indicator
- };
-
- typedef NS_ENUM(NSInteger, HMSegmentedControlSegmentWidthStyle) {
- HMSegmentedControlSegmentWidthStyleFixed, // Segment width is fixed
- HMSegmentedControlSegmentWidthStyleDynamic, // Segment width will only be as big as the text width (including inset)
- };
-
- typedef NS_OPTIONS(NSInteger, HMSegmentedControlBorderType) {
- HMSegmentedControlBorderTypeNone = 0,
- HMSegmentedControlBorderTypeTop = (1 << 0),
- HMSegmentedControlBorderTypeLeft = (1 << 1),
- HMSegmentedControlBorderTypeBottom = (1 << 2),
- HMSegmentedControlBorderTypeRight = (1 << 3)
- };
-
- enum {
- HMSegmentedControlNoSegment = -1 // Segment index for no selected segment
- };
-
- typedef NS_ENUM(NSInteger, HMSegmentedControlType) {
- HMSegmentedControlTypeText,
- HMSegmentedControlTypeImages,
- HMSegmentedControlTypeTextImages
- };
-
- typedef NS_ENUM(NSInteger, HMSegmentedControlImagePosition) {
- HMSegmentedControlImagePositionBehindText,
- HMSegmentedControlImagePositionLeftOfText,
- HMSegmentedControlImagePositionRightOfText,
- HMSegmentedControlImagePositionAboveText,
- HMSegmentedControlImagePositionBelowText
- };
-
- @interface HMSegmentedControl : UIControl
-
- @property (nonatomic, strong) NSArray<NSString *> *sectionTitles;
- @property (nonatomic, strong) NSArray<UIImage *> *sectionImages;
- @property (nonatomic, strong) NSArray<UIImage *> *sectionSelectedImages;
-
- /**
- Provide a block to be executed when selected index is changed.
-
- Alternativly, you could use `addTarget:action:forControlEvents:`
- */
- @property (nonatomic, copy) IndexChangeBlock indexChangeBlock;
-
- /**
- Used to apply custom text styling to titles when set.
-
- When this block is set, no additional styling is applied to the `NSAttributedString` object returned from this block.
- */
- @property (nonatomic, copy) HMTitleFormatterBlock titleFormatter;
-
- /**
- Text attributes to apply to item title text.
- */
- @property (nonatomic, strong) NSDictionary *titleTextAttributes UI_APPEARANCE_SELECTOR;
-
- /*
- Text attributes to apply to selected item title text.
-
- Attributes not set in this dictionary are inherited from `titleTextAttributes`.
- */
- @property (nonatomic, strong) NSDictionary *selectedTitleTextAttributes UI_APPEARANCE_SELECTOR;
-
- /**
- Segmented control background color.
-
- Default is `[UIColor whiteColor]`
- */
- @property (nonatomic, strong) UIColor *backgroundColor UI_APPEARANCE_SELECTOR;
-
- /**
- Color for the selection indicator stripe
-
- Default is `R:52, G:181, B:229`
- */
- @property (nonatomic, strong) UIColor *selectionIndicatorColor UI_APPEARANCE_SELECTOR;
-
- /**
- Color for the selection indicator box
-
- Default is selectionIndicatorColor
- */
- @property (nonatomic, strong) UIColor *selectionIndicatorBoxColor UI_APPEARANCE_SELECTOR;
-
- /**
- Color for the vertical divider between segments.
-
- Default is `[UIColor blackColor]`
- */
- @property (nonatomic, strong) UIColor *verticalDividerColor UI_APPEARANCE_SELECTOR;
-
- /**
- Opacity for the seletion indicator box.
-
- Default is `0.2f`
- */
- @property (nonatomic) CGFloat selectionIndicatorBoxOpacity;
-
- /**
- Width the vertical divider between segments that is added when `verticalDividerEnabled` is set to YES.
-
- Default is `1.0f`
- */
- @property (nonatomic, assign) CGFloat verticalDividerWidth;
-
- /**
- Specifies the style of the control
-
- Default is `HMSegmentedControlTypeText`
- */
- @property (nonatomic, assign) HMSegmentedControlType type;
-
- /**
- Specifies the style of the selection indicator.
-
- Default is `HMSegmentedControlSelectionStyleTextWidthStripe`
- */
- @property (nonatomic, assign) HMSegmentedControlSelectionStyle selectionStyle;
-
- /**
- Specifies the style of the segment's width.
-
- Default is `HMSegmentedControlSegmentWidthStyleFixed`
- */
- @property (nonatomic, assign) HMSegmentedControlSegmentWidthStyle segmentWidthStyle;
-
- /**
- Specifies the location of the selection indicator.
-
- Default is `HMSegmentedControlSelectionIndicatorLocationUp`
- */
- @property (nonatomic, assign) HMSegmentedControlSelectionIndicatorLocation selectionIndicatorLocation;
-
- /*
- Specifies the border type.
-
- Default is `HMSegmentedControlBorderTypeNone`
- */
- @property (nonatomic, assign) HMSegmentedControlBorderType borderType;
-
- /**
- Specifies the image position relative to the text. Only applicable for HMSegmentedControlTypeTextImages
-
- Default is `HMSegmentedControlImagePositionBehindText`
- */
- @property (nonatomic) HMSegmentedControlImagePosition imagePosition;
-
- /**
- Specifies the distance between the text and the image. Only applicable for HMSegmentedControlTypeTextImages
-
- Default is `0,0`
- */
- @property (nonatomic) CGFloat textImageSpacing;
-
- /**
- Specifies the border color.
-
- Default is `[UIColor blackColor]`
- */
- @property (nonatomic, strong) UIColor *borderColor;
-
- /**
- Specifies the border width.
-
- Default is `1.0f`
- */
- @property (nonatomic, assign) CGFloat borderWidth;
-
- /**
- Default is YES. Set to NO to deny scrolling by dragging the scrollView by the user.
- */
- @property(nonatomic, getter = isUserDraggable) BOOL userDraggable;
-
- /**
- Default is YES. Set to NO to deny any touch events by the user.
- */
- @property(nonatomic, getter = isTouchEnabled) BOOL touchEnabled;
-
- /**
- Default is NO. Set to YES to show a vertical divider between the segments.
- */
- @property(nonatomic, getter = isVerticalDividerEnabled) BOOL verticalDividerEnabled;
-
- @property (nonatomic, getter=shouldStretchSegmentsToScreenSize) BOOL stretchSegmentsToScreenSize;
-
- /**
- Index of the currently selected segment.
- */
- @property (nonatomic, assign) NSInteger selectedSegmentIndex;
-
- /**
- Height of the selection indicator. Only effective when `HMSegmentedControlSelectionStyle` is either `HMSegmentedControlSelectionStyleTextWidthStripe` or `HMSegmentedControlSelectionStyleFullWidthStripe`.
-
- Default is 5.0
- */
- @property (nonatomic, readwrite) CGFloat selectionIndicatorHeight;
-
- /**
- Edge insets for the selection indicator.
- NOTE: This does not affect the bounding box of HMSegmentedControlSelectionStyleBox
-
- When HMSegmentedControlSelectionIndicatorLocationUp is selected, bottom edge insets are not used
-
- When HMSegmentedControlSelectionIndicatorLocationDown is selected, top edge insets are not used
-
- Defaults are top: 0.0f
- left: 0.0f
- bottom: 0.0f
- right: 0.0f
- */
- @property (nonatomic, readwrite) UIEdgeInsets selectionIndicatorEdgeInsets;
-
- /**
- Inset left and right edges of segments.
-
- Default is UIEdgeInsetsMake(0, 5, 0, 5)
- */
- @property (nonatomic, readwrite) UIEdgeInsets segmentEdgeInset;
-
- @property (nonatomic, readwrite) UIEdgeInsets enlargeEdgeInset;
-
- /**
- Default is YES. Set to NO to disable animation during user selection.
- */
- @property (nonatomic) BOOL shouldAnimateUserSelection;
-
- - (id)initWithSectionTitles:(NSArray<NSString *> *)sectiontitles;
- - (id)initWithSectionImages:(NSArray<UIImage *> *)sectionImages sectionSelectedImages:(NSArray<UIImage *> *)sectionSelectedImages;
- - (instancetype)initWithSectionImages:(NSArray<UIImage *> *)sectionImages sectionSelectedImages:(NSArray<UIImage *> *)sectionSelectedImages titlesForSections:(NSArray<NSString *> *)sectiontitles;
- - (void)setSelectedSegmentIndex:(NSUInteger)index animated:(BOOL)animated;
- - (void)setIndexChangeBlock:(IndexChangeBlock)indexChangeBlock;
- - (void)setTitleFormatter:(HMTitleFormatterBlock)titleFormatter;
-
- @end
|