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
再新增到一個輸出口
@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