1. 程式人生 > >iOS自定義控制元件之下拉列表按鈕

iOS自定義控制元件之下拉列表按鈕

本文將介紹如何實現一個簡單的下拉列表按鈕,使讀者能夠更進一步掌握UIButton類和UITableView類的使用,瞭解非iOS系統自帶控制元件的初始化方法,學習列表下拉、收起的動畫效果,編寫可重用的DropDownButton類,還可以對此進行優化、擴充套件和整理,便於以後專案實戰中直接拿來進行使用。

----------------------------------------------------------------------------------------------------------我是分割線-------------------------------------------------------------------------------------------------------------- 完成效果圖

----------------------------------------------------------------------------------------------------------這裡是正文--------------------------------------------------------------------------------------------------------------

1. 建立類DropDownButton

  • 在Xcode中建立一個新的Cocoa Touch Class,取名DropDownButton,繼承UIButton,使用ARC
  • 開啟DropDownButton.h檔案,宣告類成員及相應方法,編寫程式碼如下:
@property (nonatomic, copy) NSString *title;
@property (nonatomic, copy) NSArray *list;

/**
 *  初始化DropDownButton
 *
 *  @param frame 結構
 *  @param title 標題
 *  @param list  下拉列表
 *
 *  @return DropDownButton例項
 */
- (instancetype)initWithFrame:(CGRect)frame Title:(NSString*)title List:(NSArray *)list;
  • 開啟DropDownButton.m檔案,在頂部新增以下程式碼:
static NSString *CellIdentifier = @"DropDownCell";

@interface GYCDropDownButton () <UITableViewDataSource, UITableViewDelegate> {
    UITableView *listView;
}

@end
至此,DropDownButton類成員、類方法和相應變數宣告完成,下面開始實現。

2. 實現下拉列表

繼續在DropDownButton.m檔案中編寫程式碼:
  • 設定表檢視listView的佈局、資料來源和代理
- (void)setupDefaultTable {
    //將listView放在當前按鈕下方位置,保持寬度相同,初始高度設定為0
    listView = [[UITableView alloc] initWithFrame:CGRectMake(self.frame.origin.x, self.frame.origin.y+self.frame.size.height, self.frame.size.width, 0) style:UITableViewStylePlain];
    
    listView.dataSource = self;
    listView.delegate = self;
}
  • 新增listView的下拉動畫、收起動畫方法
- (void)startDropDownAnimation {
    CGRect frame = listView.frame;
    //使listView高度在0.3秒內從0過渡到最大高度以顯示全部列表項
    frame.size.height = self.frame.size.height*self.list.count;
    [UIView animateWithDuration:0.3 animations:^{
        listView.frame = frame;
    } completion:^(BOOL finished) {
        
    }];
}

- (void)startPackUpAnimation {
    CGRect frame = listView.frame;
    //使listView高度在0.3秒內從最大高度過渡到0以隱藏全部列表項
    frame.size.height = 0;
    [UIView animateWithDuration:0.3 animations:^{
        listView.frame = frame;
    } completion:^(BOOL finished) {
        
    }];
}
  • 新增按鈕點選事件,每點選一次按鈕,tag值自加1,然後根據tag值執行下拉或收起列表動畫,最後重新載入一次listView的資料,防止串改列表項後不能及時更新到listView中
- (void)clickedToDropDown {
    self.tag++;
    self.tag%2 ? [self startDropDownAnimation] : [self startPackUpAnimation];
    
    [listView reloadData];
}


  • 實現listView的資料來源和代理
#pragma mark - table view data source
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    //根據成員list陣列中的元素數返回列表的行數,必須保證self.list不為nil,才會呼叫cellForRowAtIndexPath方法
    return self.list.count;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (nil == cell) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }
    //設定列表中的每一項文字、字型、顏色等
    cell.textLabel.text = self.list[indexPath.row];
    cell.textLabel.font = self.titleLabel.font;
    cell.textLabel.textColor = self.titleLabel.textColor;
    
    return cell;
}

#pragma mark - table view delegate
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    //選擇某項後,使按鈕標題內容變為當前選項
    [self setTitle:self.list[indexPath.row] forState:UIControlStateNormal];
    //執行列表收起動畫
    [self clickedToDropDown];
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    //設定表單元高度為按鈕高度
    return self.frame.size.height;
}


  • 設定DropDownButton的初始化
- (void)setup {
    [self setTitle:self.title forState:UIControlStateNormal];
    [self setupDefaultTable];
    [self setContentHorizontalAlignment:UIControlContentHorizontalAlignmentLeft];
    [self addTarget:self action:@selector(clickedToDropDown) forControlEvents:UIControlEventTouchUpInside];
}


通過initWithFrame方法例項化DropDownButton物件,先必須實現事先宣告的初始化方法,由於initWithFrame時,DropDownButton物件的父檢視肯定為nil,所以還需要重寫didMoveToSuperview,當下拉列表按鈕被新增進某一檢視上後將listView一同新增到該檢視上去。
- (instancetype)initWithFrame:(CGRect)frame Title:(NSString*)title List:(NSArray *)list {
    self = [super initWithFrame:frame];
    if (self) {
        self.title = [NSString stringWithString:title];
        self.list = [NSArray arrayWithArray:list];
        
        [self setup];
    }
    
    return self;
}

- (void)didMoveToSuperview {
    [self.superview addSubview:listView];
}


通過Interface Builder直接在xib中新增DropDownButton物件,需要重寫awakeFromNib方法,將listView新增到同一父檢視上去,這裡由於xib檔案緣故,self.surperview不為nil。
- (void)awakeFromNib {
    self.title = self.titleLabel.text;
    [self setup];
    [self.superview addSubview:listView];
}


3. 除錯執行

在你的view controller中匯入DropDownButton.h檔案
  • 使用程式碼
    DropDownButton *button = [[DropDownButton alloc] initWithFrame:CGRectMake(40, 268, 240, 30) Title:@"請選擇性別" List:@[@"男", @"女"]];
    [self.view addSubview:button];


  • 使用Interface Builder
拖拽Xcode物件庫中的Button控制元件進入xib的相應view中,在Attributes面板進行相關設定後修改Identity面板中的Class值UIButton為DropDownButton
再新增到一個輸出口
@property (retain, nonatomic) IBOutlet DropDownButton *button;

最後在viewDidLoad方法中編寫程式碼,設定好其屬性list
    button.list = @[@"男", @"女"];

執行即可 ----------------------------------------------------------------------------------------------------------我是分割線-------------------------------------------------------------------------------------------------------------- 注:要得到列表選擇某項的內容,需要呼叫UIButton物件方法titleForState:UIControlStateNormal得到,而不是通過DropDownButton物件的屬性成員title得到,這裡的title是按鈕最初始的標題內容,讀者可以對此進行修改,也可以根據自己喜好來擴充套件此類,如新增一些表單元的樣式風格、更華麗的動畫效果、更快捷的資料獲取等。

相關推薦

iOS定義控制元件之下列表按鈕

本文將介紹如何實現一個簡單的下拉列表按鈕,使讀者能夠更進一步掌握UIButton類和UITableView類的使用,瞭解非iOS系統自帶控制元件的初始化方法,學習列表下拉、收起的動畫效果,編寫可重用的DropDownButton類,還可以對此進行優化、擴充套件和整理,便於以

iOS定義控制元件-UISearchBar

   在開發過程中,UISearchBar屬不多見的控制元件,在我們一般使用的是系統原生樣式:    但是UI設計師可能想要的是這種:    可能你覺得很簡單:覺得設定背景顏色,邊框圖示什麼的;

(四十八)c#Winform定義控制元件-下按鈕

前提 入行已經7,8年了,一直想做一套漂亮點的自定義控制元件,於是就有了本系列文章。 GitHub:https://github.com/kwwwvagaa/NetWinformControl 碼雲:https://gitee.com/kwwwvagaa/net_winform_custom_contr

(四十九)c#Winform定義控制元件-下框(表格)

前提 入行已經7,8年了,一直想做一套漂亮點的自定義控制元件,於是就有了本系列文章。 GitHub:https://github.com/kwwwvagaa/NetWinformControl 碼雲:https://gitee.com/kwwwvagaa/net_winform_custom_contr

Qt編寫定義控制元件11-裝置防區按鈕控制元件

前言 在很多專案應用中,需要根據資料動態生成物件顯示在地圖上,比如地圖標註,同時還需要可拖動物件到指定位置顯示,能有多種狀態指示,

Qt編寫定義控制元件38-高亮按鈕

一、前言 高亮按鈕控制元件,既可以作為類似於交通指示燈使用,也可以作為裝置狀態指示燈使用,控制元件內建多套顏色風格,還可以自己設定

定義控制元件之:treelistCombox 下列表

先來一張效果圖 下面是treelistcombox原始碼 using System; using System.Collections.Generic; using System.ComponentModel; using System.Diagnostics; us

新手定義控制元件,建立屬於自己的下重新整理(一)---Android,ListView實現IOS的彈性效果

前言 相信很多童鞋對於控制元件的下拉重新整理都比較熟悉吧,常用的PullToRefresh開源庫和Google自帶的SwipeRefreshLayout大家肯定也很熟悉吧,但作為一個Android開發新手,對於自定義控制元件和自定義View來實現一些效果肯定還

Android定義控制元件實戰——實現仿IOS重新整理上載入 PullToRefreshLayout

         下拉重新整理控制元件,網上有很多版本,有自定義Layout佈局的,也有封裝控制元件的,各種實現方式的都有。但是很少有人告訴你具體如何實現的,今天我們就來一步步實現自己封裝的 PullToRefreshLayout 完美的解決下拉重新整理,上拉載入問題。  

iOS開發學習-定義控制元件賦值問題--在model的set方法中給控制元件賦值

在自定義控制元件的過程中,剛開始的時候碰到問題是如何給各控制元件動態賦值,最初的想法是把各控制元件屬性放在.h檔案中定義.然後在控制器內獲取資料一一賦值(可行),但是這樣就增加了控制器中的程式碼,比如給定一個場景: collectionViewCell中,有10個控制元件,需要顯示10個數據,這

Android控制元件----關於上重新整理上載入的定義控制元件

首先需要明白的是,平常用的ListView做不到類似於小說章節閱讀的瀏覽效果,去實現重新整理載入的功能。雖然GitHub上有一些開源庫可以使用,但是這種東西自己如果有時間能夠親歷一遍瞭解的更加透徹,畢竟在很多Android的APP中都有這方面的功能。話不多說,下

【轉】WPF定義控制元件與樣式(12)-縮圖ThumbnailImage /gif動畫圖/圖片列表

一.前言   申明:WPF自定義控制元件與樣式是一個系列文章,前後是有些關聯的,但大多是按照由簡到繁的順序逐步釋出的等,若有不明白的地方可以參考本系列前面的文章,文末附有部分文章連結。   本文主要針對WPF專案開發中圖片的各種使用問題,經過總結,把一些經驗分享一下。內容包括: WPF常

Android定義控制元件之仿汽車之家下重新整理

關於下拉重新整理的實現原理我在上篇文章Android自定義控制元件之仿美團下拉重新整理中已經詳細介紹過了,這篇文章主要介紹錶盤的動畫實現原理 汽車之家的下拉重新整理分為三個狀態: 第一個狀態為下拉重新整理狀態(pull to refresh),在這個狀

定義控制元件之組合式控制元件選擇框

自定義控制元件之組合式控制元件 下拉選擇框 文章目錄 自定義控制元件之組合式控制元件 下拉選擇框 零 組合控制元件下載 一 自定義控制元件思路 二 MainActivity核心程式碼 三 activity_main.xml

定義控制元件:側刪除

SwipeLayout 側拉刪除 掌握ViewDragHelper 的用法 掌握平滑動畫的原理及狀態更新事件回撥 應用場景:QQ 聊天記錄,郵件管理,需要對條目進行功能擴充套件的場景,效果圖: ViewDragHelper 初始化 建立自定義

WPF定義控制元件列表滑動特效 PowerListBox

原文: WPF自定義控制元件之列表滑動特效 PowerListBox 列表控制元件是應用程式中常見的控制元件之一,對其做一些絢麗的視覺特效,可以讓軟體增色不少。 本人網上看過一個視訊,是windows phone 7系統上的一個App的列表滾動效果,效果非常炫 現在在WPF上用ListBox重現此效

Android ListView 下重新整理,上載入更多,帶動畫 定義控制元件

之前每次 專案中用到ListView 的 下拉重新整理 以及上拉分頁載入 都是 用的 網上 下載 的 類庫, 使用起來 諸多不便 ,於是 趁著有空 ,自己封裝了ListView 讓其 實現 下拉重新整理,以及分頁載入功能。 以下是 效果圖: 當 滑動到 ListView 頂

ios-swift-為圖片控制元件(定義控制元件)新增點選事件

@IBOutlet var img_guanggao: UIImageView! override func viewDidLoad() { super.viewDidLoad(

Android定義控制元件---聯絡人列表A-Z排序

這幾天在做IM模組,設計圖要求做一個類似下圖所示的自定義控制元件。 我百度了一下,發現類似的Ddmo有很多,但是還不能完全滿足設計圖的需求。 參考了幾個比較有價值的demo琢磨了一天總算做出來了,現在發出來和大家分享。 分析一下這個需求的難點。 1、右邊側滑欄(Sid

【Android定義控制元件】仿IOS風格的搜尋框

IOS很多控制元件的設計都是很值得借鑑的存在,作為移動開發的初學者,我們可以把這種模仿等同於學畫、練字時為鑄就基礎的臨摹行為。達者為師,努力學習別人的優點吧。 這裡是仿IOS搜尋框風格的自定義控制元件,引用了http://blog.csdn.net/d