SegmentView.m 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. //
  2. // SegmentView.m
  3. // live
  4. //
  5. // Created by hysd on 15/8/19.
  6. // Copyright (c) 2015年 kenneth. All rights reserved.
  7. //
  8. #import "SegmentView.h"
  9. @interface SegmentView()
  10. {
  11. int _itemCount;
  12. }
  13. @property(nonatomic, strong) UIView *indicatorView;
  14. @end
  15. @implementation SegmentView
  16. - (id)initWithFrame:(CGRect)frame andItems:(NSArray*)items andSize:(NSInteger)size border:(BOOL)border isrankingRist:(BOOL)isrankingRist
  17. {
  18. self = [super initWithFrame:frame];
  19. if(self)
  20. {
  21. _itemCount = (int)items.count;
  22. self.segmentControl = [[UISegmentedControl alloc] initWithFrame:CGRectMake(0, 0, frame.size.width, frame.size.height)];
  23. for(int index = 0; index < items.count; index++)
  24. {
  25. [self.segmentControl insertSegmentWithTitle:items[index] atIndex:index animated:NO];
  26. }
  27. self.segmentControl.selectedSegmentIndex = 1;
  28. self.segmentControl.tintColor = kWhiteColor;
  29. self.segmentControl.backgroundColor = kClearColor;
  30. [self.segmentControl addTarget:self action:@selector(segmentChanged:) forControlEvents:UIControlEventValueChanged];
  31. _indicatorView = [[UIView alloc] initWithFrame:CGRectMake(frame.size.width/(4*items.count), frame.size.height-6, kRealValue(20), 3)];
  32. _indicatorView.backgroundColor = kWhiteColor;
  33. _indicatorView.layer.cornerRadius = 3 / 2;
  34. _indicatorView.layer.masksToBounds = YES;
  35. _indicatorView.hidden = YES;
  36. if (isrankingRist)
  37. {
  38. NSDictionary* selectedTextAttributes = @{NSFontAttributeName:[UIFont systemFontOfSize:size + 2], NSForegroundColorAttributeName: kWhiteColor};
  39. [self.segmentControl setTitleTextAttributes:selectedTextAttributes forState:UIControlStateSelected];//设置文字属性
  40. NSDictionary* unselectedTextAttributes = @{NSFontAttributeName:[UIFont systemFontOfSize:size], NSForegroundColorAttributeName: kWhiteColor};
  41. [self.segmentControl setTitleTextAttributes:unselectedTextAttributes forState:UIControlStateNormal];
  42. _indicatorView.hidden = NO;
  43. }
  44. else
  45. {
  46. NSDictionary* selectedTextAttributes = @{NSFontAttributeName:[UIFont boldSystemFontOfSize:size], NSForegroundColorAttributeName: kWhiteColor};
  47. [self.segmentControl setTitleTextAttributes:selectedTextAttributes forState:UIControlStateSelected];//设置文字属性
  48. NSDictionary* unselectedTextAttributes = @{NSFontAttributeName:[UIFont systemFontOfSize:12], NSForegroundColorAttributeName: kWhiteColor};
  49. [self.segmentControl setTitleTextAttributes:unselectedTextAttributes forState:UIControlStateNormal];
  50. }
  51. UIColor *Stock_Red = kClearColor;
  52. if (@available(iOS 13.0, *)) {
  53. _segmentControl.selectedSegmentTintColor = Stock_Red;
  54. } else {
  55. _segmentControl.tintColor = Stock_Red;
  56. }
  57. // 以下代码可以代替上面:
  58. [_segmentControl setBackgroundImage:[UIImage imageWithColor:[UIColor clearColor]] forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
  59. [_segmentControl setBackgroundImage:[UIImage imageWithColor:kClearColor] forState:UIControlStateSelected barMetrics:UIBarMetricsDefault];
  60. // if (!isrankingRist) {
  61. // [_segmentControl setImage:[UIImage imageNamed:@"du_voice_background"] forSegmentAtIndex:1];
  62. //// setBackgroundImage:[UIImage imageNamed:@"du_voice_background"] forState:UIControlStateSelected barMetrics:UIBarMetricsDefault];
  63. // }
  64. //去掉中间的分割线
  65. [_segmentControl setDividerImage:[UIImage imageWithColor:[UIColor clearColor]] forLeftSegmentState:UIControlStateNormal rightSegmentState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
  66. [self addSubview:self.segmentControl];
  67. if(border)
  68. {
  69. UIView* sep = [[UIView alloc] initWithFrame:CGRectMake(0, self.segmentControl.frame.size.height-1, self.segmentControl.frame.size.width, 1)];
  70. sep.backgroundColor = kWhiteColor;
  71. [self.segmentControl addSubview:sep];
  72. }
  73. [self.segmentControl addSubview:_indicatorView];
  74. }
  75. return self;
  76. }
  77. - (void)setIsBlack:(bool)isBlack{
  78. NSDictionary* selectedTextAttributes = @{ NSForegroundColorAttributeName: [UIColor colorWithHexString:@"887BFF"]};
  79. [self.segmentControl setTitleTextAttributes:selectedTextAttributes forState:UIControlStateSelected];//设置文字属性
  80. NSDictionary* unselectedTextAttributes = @{ NSForegroundColorAttributeName: kBlackColor};
  81. [self.segmentControl setTitleTextAttributes:unselectedTextAttributes forState:UIControlStateNormal];
  82. }
  83. - (void)segmentChanged:(UISegmentedControl *)sender
  84. {
  85. // self.underLine.frame.origin.x = CGFloat(index) * self.view.frame.size.width/5 + self.view.frame.size.width/10 - 8.5
  86. // }
  87. NSLog(@"%@",sender);
  88. NSLog(@"superviewFrame%@",sender.superview);
  89. NSLog(@"%@",self);
  90. [UIView animateWithDuration:0.2f animations:^{
  91. NSInteger newX = self.segmentControl.selectedSegmentIndex
  92. *sender.width / 2 + _indicatorView.frame.size.width/2 + 16;
  93. _indicatorView.left = newX;
  94. // _indicatorView.centerX = self.segmentControl.selectedSegmentIndex * sender.width + 15 + sender.width * self.segmentControl.selectedSegmentIndex;
  95. }];
  96. if(self.delegate)
  97. {
  98. [self.delegate segmentView:self selectIndex:self.segmentControl.selectedSegmentIndex];
  99. }
  100. }
  101. - (void)setSelectIndex:(NSInteger)index
  102. {
  103. self.segmentControl.selectedSegmentIndex = index;
  104. // NSInteger newX = _segmentControl.selectedSegmentIndex * _indicatorView.frame.size.width;
  105. // NSInteger newX = self.segmentControl.selectedSegmentIndex *_indicatorView.frame.size.width*2+_indicatorView.frame.size.width/2;
  106. NSInteger newX = self.segmentControl.selectedSegmentIndex * self.segmentControl.width / 2 + _indicatorView.frame.size.width/2 + 16;
  107. [UIView animateWithDuration:0.2f animations:^{
  108. _indicatorView.left = newX;
  109. }];
  110. }
  111. - (NSInteger)getSelectIndex
  112. {
  113. return self.segmentControl.selectedSegmentIndex;
  114. }
  115. - (void)changeIndex
  116. {
  117. self.segmentControl.selectedSegmentIndex = 1;
  118. [self segmentChanged:self.segmentControl];
  119. }
  120. @end