溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

iOS控件封裝之如何實現排序按鈕

發布時間:2021-08-18 10:13:06 來源:億速云 閱讀:185 作者:小新 欄目:移動開發

這篇文章主要為大家展示了“iOS控件封裝之如何實現排序按鈕”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“iOS控件封裝之如何實現排序按鈕”這篇文章吧。

先看圖:

iOS控件封裝之如何實現排序按鈕

簡單描述一下:

按鈕一共有三種狀態:非選中、選中升序、選中降序。

iOS控件封裝之如何實現排序按鈕

按鈕的三種狀態

點擊按鈕時有兩種情況:

  1. 按鈕原本處于非選中狀態,點擊,切換到選中狀態,其狀態變為升序。

  2. 按鈕原本就處于選中狀態,再點擊一下,則切換其排序狀態(升變降、降變升)。

不同狀態對應不同的icon,如果沒有UI,可以去iconfont 找圖標,輸入關鍵詞如“上下箭頭”就可以找到你需要的icon。

基本思路

繼承UIButton,直接在button上放view,設置約束,根據按鈕的狀態設置對應的圖片。

PS:自定義按鈕最靈活的做法就是直接在button上放view(在不需要糾結內存和view層級的情況下),簡單粗暴、隨心所欲。

完整代碼

.h文件:

#import <UIKit/UIKit.h>

@interface CQSortButton : UIButton

/** 按鈕文本 */
@property (nonatomic, copy) NSString *title;
/** 是否是升序 */
@property (nonatomic, assign, readonly, getter=isAscending) BOOL ascending;

@end

.m文件:

#import "CQSortButton.h"

@interface CQSortButton ()

/** 文本label */
@property (nonatomic, strong) UILabel *cq_titleLabel;
/** 箭頭imageView */
@property (nonatomic, strong) UIImageView *cq_arrowImageView;

@end

@implementation CQSortButton

#pragma mark - 構造方法

- (instancetype)initWithFrame:(CGRect)frame {
 if (self = [super initWithFrame:frame]) {
  [self setupUI];
 }
 return self;
}

#pragma mark - UI搭建

- (void)setupUI {
 self.layer.borderColor = [UIColor blackColor].CGColor;
 self.layer.borderWidth = 1;

 // 文本和圖片的父view
 UIView *contentView = [[UIView alloc] init];
 [self addSubview:contentView];
 contentView.userInteractionEnabled = NO;
 [contentView mas_makeConstraints:^(MASConstraintMaker *make) {
  make.top.bottom.centerX.mas_equalTo(self);
  make.left.mas_greaterThanOrEqualTo(self).mas_offset(3);
  make.right.mas_lessThanOrEqualTo(self).mas_offset(-3);
 }];

 // 文本
 self.cq_titleLabel = [[UILabel alloc] init];
 [contentView addSubview:self.cq_titleLabel];
 self.cq_titleLabel.font = [UIFont boldSystemFontOfSize:13];
 self.cq_titleLabel.adjustsFontSizeToFitWidth = YES;
 [self.cq_titleLabel mas_makeConstraints:^(MASConstraintMaker *make) {
  make.top.bottom.left.mas_offset(0);
 }];

 // 圖片
 self.cq_arrowImageView = [[UIImageView alloc] init];
 [contentView addSubview:self.cq_arrowImageView];
 self.cq_arrowImageView.image = [UIImage imageNamed:@"up_down"];
 [self.cq_arrowImageView mas_makeConstraints:^(MASConstraintMaker *make) {
  make.size.mas_equalTo(CGSizeMake(20, 20));
  make.centerY.mas_equalTo(contentView);
  make.left.mas_equalTo(self.cq_titleLabel.mas_right);
  make.right.mas_equalTo(contentView);
 }];
}

#pragma mark - 賦值選中狀態

- (void)setSelected:(BOOL)selected {
 //// 注意:
 //// selected 表示你要賦值的狀態
 //// super.selected 表示當前處于的狀態

 if (selected) { // 即將設置成選中狀態
  if (super.selected) { // 如果原本就處于選中狀態
   // 那么就切換篩選狀態
   _ascending = !_ascending;
   if (_ascending) {
    // 升序
    self.cq_arrowImageView.image = [UIImage imageNamed:@"red_arrow_up"];
   } else {
    // 降序
    self.cq_arrowImageView.image = [UIImage imageNamed:@"red_arrow_down"];
   }
  } else { // 如果之前不是選中狀態
   // 那么設置成選中的默認排序狀態:升序
   _ascending = YES;
   self.cq_arrowImageView.image = [UIImage imageNamed:@"red_arrow_up"];
  }
 } else { // 即將設置成非選中狀態
  // 設置成非選中狀態的圖片
  self.cq_arrowImageView.image = [UIImage imageNamed:@"up_down"];
 }

 // 最后再賦值
 [super setSelected:selected];
}

#pragma mark - 賦值文本

- (void)setTitle:(NSString *)title {
 _title = title;
 self.cq_titleLabel.text = title;
}

@end

使用:

- (void)viewDidLoad {
 [super viewDidLoad];
 // Do any additional setup after loading the view.

 NSArray *titleArray = @[@"同比", @"銷售額", @"?", @"文字有點多啊"];

 NSMutableArray *buttonArray = [NSMutableArray array];
 for (int i = 0; i < 4; i++) {
  CQSortButton *button = [[CQSortButton alloc] init];
  [self.view addSubview:button];
  button.title = titleArray[i];
  button.tag = CQSortButtonBeginTag + i;
  [button addTarget:self action:@selector(sortButtonClicked:) forControlEvents:UIControlEventTouchUpInside];
  [buttonArray addObject:button];
 }

 // 按鈕等寬依次排列
 [buttonArray mas_distributeViewsAlongAxis:MASAxisTypeHorizontal withFixedSpacing:0 leadSpacing:0 tailSpacing:0];
 [buttonArray mas_makeConstraints:^(MASConstraintMaker *make) {
  make.top.mas_equalTo(100);
  make.height.mas_equalTo(40);
 }];
}

- (void)sortButtonClicked:(CQSortButton *)sender {
 for (int i = 0; i < 4; i++) {
  CQSortButton *button = [self.view viewWithTag:(CQSortButtonBeginTag + i)];
  button.selected = (button.tag == sender.tag);
 }
 NSLog(@"第%ld個按鈕點擊,狀態:%@", (long)(sender.tag-CQSortButtonBeginTag), sender.isAscending ? @"升序" : @"降序");
}

知識點及細節

1.如何讓兩個view整體居中并且不超出父view?

創建父view是關鍵。

先創建一個父view,這個父view居中于button,左右不設置固定約束,再將兩個view放在父view上,左邊的view與父view左對齊,右邊的view與父view右對齊,左邊的view與右邊的view水平方向約束確定,撐開父view:

// 文本和圖片的父view
UIView *contentView = [[UIView alloc] init];
[self addSubview:contentView];

[contentView addSubview:self.cq_titleLabel];
[contentView addSubview:self.cq_arrowImageView];

[self.cq_titleLabel mas_makeConstraints:^(MASConstraintMaker *make) {
 make.top.bottom.left.mas_offset(0);
}];
[self.cq_arrowImageView mas_makeConstraints:^(MASConstraintMaker *make) {
 make.size.mas_equalTo(CGSizeMake(20, 20));
 make.centerY.mas_equalTo(contentView);
 make.left.mas_equalTo(self.cq_titleLabel.mas_right);
 make.right.mas_equalTo(contentView);
}];

不超出父view(此處指button)用mas_greaterThanOrEqualTo和mas_lessThanOrEqualTo即可:

[contentView mas_makeConstraints:^(MASConstraintMaker *make) {
 make.top.bottom.centerX.mas_equalTo(self);
 make.left.mas_greaterThanOrEqualTo(self).mas_offset(3);
 make.right.mas_lessThanOrEqualTo(self).mas_offset(-3);
}];

2.readonly的使用

/** 是否是升序 */
@property (nonatomic, assign, readonly, getter=isAscending) BOOL ascending;

為什么這里要用readonly?

因為這個屬性的改變只能是通過內部(自身的.m)改變,而不能通過外部改變,或者說這個屬性只是用來反映按鈕的一個狀態,就像UIScrollView的decelerating屬性一樣,只是反映scrollView正在減速,不能通過調用scrollView.decelerating = YES讓它主動減速。

// returns YES if user isn't dragging (touch up) but scroll view is still moving
@property(nonatomic,readonly,getter=isDecelerating) BOOL decelerating;

總結一下就是readonly適用于只用來反映對象的狀態、特征或特性的屬性。

你可以找幾個蘋果官方文檔里的readonly屬性好好感受一下。

3.如何使用masonry等寬等間距排列控件?

iOS控件封裝之如何實現排序按鈕

用masory提供的mas_distributeViewsAlongAxis方法:

// 按鈕等寬依次排列[buttonArray mas_distributeViewsAlongAxis:MASAxisTypeHorizontal withFixedSpacing:0 leadSpacing:0 tailSpacing:0];
[buttonArray mas_makeConstraints:^(MASConstraintMaker *make) {
 make.top.mas_equalTo(100);
 make.height.mas_equalTo(40);
}];

關于這個方法的更多使用可以參考這篇文章:

iOS Masonry 等間隔或等寬高排列多個控件,很實用的技能,建議熟練掌握。
需要注意的是調用mas_distributeViewsAlongAxis這個方法的數組其元素個數必須bigger than one,否則沒有效果,masonry源碼截?。?/p>

- (void)mas_distributeViewsAlongAxis:(MASAxisType)axisType withFixedSpacing:(CGFloat)fixedSpacing leadSpacing:(CGFloat)leadSpacing tailSpacing:(CGFloat)tailSpacing { if (self.count < 2) {  NSAssert(self.count>1,@"views to distribute need to bigger than one");  return;
 }
 ......
}

所以實際開發中如果你是獲取后臺的數組來展示的話,務必先判斷數組的count。

以上是“iOS控件封裝之如何實現排序按鈕”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

ios
AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女