自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

自定義iOS選擇器 附農(nóng)歷選擇器代碼

移動(dòng)開發(fā) iOS
本文為cocoachina的會(huì)員自定義的 iOS 自帶的滾輪選擇器,這里分享了開發(fā)的經(jīng)驗(yàn)和實(shí)現(xiàn)源碼,希望給大家一些幫助。

1.鑒于模擬器和真機(jī)的滾動(dòng)效果的差異,建議大家真機(jī)調(diào)試的時(shí)候注釋掉IDJScrollComponent.m里的如下內(nèi)容:

  1. self.decelerationRate=0

2.我的代碼中使用了iOS5.0的UIImage的縮放圖片的resizableImageWithCapInsets:方法,如果你使用的是iOS5.0以下的SDK,請(qǐng)?zhí)鎿Q為stretchableImageWithLeftCapWidth:topCapHeight:方法。

3.幾處BUG:

(1.)copy的我忘記釋放內(nèi)存了。

  1. NSString *pYear=[cal.year copy]; 
  2. NSString *pMonth=[cal.month copy]; 

這個(gè)pYear, pMonth沒釋放!

(2.)UITableViewCell的釋放有些問題。

cellForRowAtIndexPath方法里面, cell的初始化有以下三種情況,

  1. cell=[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; 
  2. cell = (UITableViewCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
  3. cell=[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil]; 

假設(shè)是調(diào)用這句 cell = (UITableViewCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 初始化

然后最后return [cell autorelease]; 就有問題了!

這樣改, 把另外2種初始化改成

  1. cell=[[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 
  2. cell=[[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil] autorelease]; 

然后最后return cell;就OK了。

(3.)算法的局限性。

IDJScrollComponent.m里的moveSubViews:方法由于算法欠妥,導(dǎo)致了一個(gè)局限性,就是滾輪圖片的高度必須是可以被顯示的行數(shù)整除的數(shù)字,譬如:我的例子日期顯示三行,那么滾輪的圖片高度就是177像素的,177恰好可以被3整除。

(4.)農(nóng)歷數(shù)據(jù)提供器IDJChineseCalendar.mm的- (id)initWithYearStart:(NSUInteger)start end:(NSUInteger)end:方法:

  1. //獲取當(dāng)年的公歷年份對(duì)應(yīng)的農(nóng)歷的年代和甲子年份 
  2. std::pair p=ChineseCalendarDB::GetEraAndYearOfLunar([self.year intValue]); 

需要移動(dòng)到

  1. //設(shè)置當(dāng)前時(shí)間的農(nóng)歷日期字段 
  2. self.year=[NSString stringWithFormat:@"%d", chineseDate.GetYear()]; 

的后面。

這個(gè)控件并不是對(duì)iOS自帶的UIPickerView貼圖,而是重新實(shí)現(xiàn),我一周多的成果,期間走了不少彎路。哈!

此控件開發(fā)的原因:

最近有個(gè)需求,需要做一個(gè)農(nóng)歷的日期滾輪選擇器,一開始想用iOS自帶的UIPickerView,但是設(shè)計(jì)人員要求的比較高,必須實(shí)現(xiàn)她要求的樣式,也就是上圖中大家看到的樣式。但是UIPickerView根本沒有提供可以定制樣式(也就是更換皮膚)的接口。首先我在論壇上找到了帖子,按照這位兄臺(tái)所述,確實(shí)可以在一定程度上修改UIPickerView的圖片,我之所以說一定程度上,有以下幾個(gè)原因:

(1.)他是用覆蓋原有的UIPickerView上的各個(gè)子視圖上圖片的方法做的,那么你提供新的圖片就必須與原圖片嚴(yán)絲合縫。這也說明,即便是圖片換了,樣式也是不能換的,譬如:分割線的粗細(xì)、上下左右的邊框的大小等,也就是不能完全DIY,不能滿足我的需求。

(2.)由于覆蓋UIPickerView上的各個(gè)子視圖上圖片的做法不是蘋果官方給出的,一旦以后某個(gè)版本的UIPickerView實(shí)現(xiàn)策略改變,例如:3號(hào)子視圖不再是滾輪的背景圖片,你的做法就掛了。

于是我就實(shí)現(xiàn)了上圖中的滾輪選擇器,它與UIPickerView的區(qū)別是:

(1.)皮膚圖片提供了方法可以做替換的。

(2.)可以選擇滾輪上的數(shù)據(jù)是否循環(huán)滾動(dòng)。

(3.)可以指定選擇條的位置。

為了代碼的復(fù)用,也就是所謂的OOP,我按照以下的方式實(shí)現(xiàn)(因?yàn)槲矣X得這個(gè)滾輪選擇器的實(shí)現(xiàn)方案其實(shí)算不上亮點(diǎn),因?yàn)橛泻芏嗟姆桨缚梢赃x擇的,但是程序的結(jié)構(gòu)、代碼的重用是很重要的):

(1.)pickerview目錄:這個(gè)目錄中的IDJPickerView.h是滾輪選擇器視圖,沒有任何和與數(shù)據(jù)相關(guān)的東西,也就是你可以在IDJPickerView上顯示任何數(shù)據(jù)。IDJPickerView通過委托獲取需要顯示的數(shù)據(jù)。這個(gè)目錄下的IDJScrollComponent.h實(shí)現(xiàn)了UIScrollView上的內(nèi)容可以反復(fù)循環(huán)滾動(dòng)的功能。

(2.)datepicker目錄:IDJDatePickerView.h實(shí)現(xiàn)了IDJPickerView里的協(xié)議,并把IDJPickerView做為自己的一個(gè)私有成員,實(shí)現(xiàn)了一個(gè)可以根據(jù)type字段顯示公歷、農(nóng)歷的日期選擇器,IDJDatePickerView.m里的農(nóng)歷算法用的是solar_chinese_calendar目錄中的C++算法,因此農(nóng)歷的相關(guān)數(shù)據(jù)類使用了C++混編的代碼。其實(shí)iOS自己支持農(nóng)歷的,但是存在BUG,具體的原因大家可以看我的IDJChineseCalendar.mm的源碼,里面的注釋比較詳細(xì)的。我在這里也使用了一層封裝,也就是IDJDatePickerView.m本身也不提供數(shù)據(jù),而是通過IDJCalendar.h、IDJChineseCalendar.h、IDJCalendarUtil.h來提供,這樣既實(shí)現(xiàn)了數(shù)據(jù)與視圖的分離(因?yàn)檗r(nóng)歷算法太復(fù)雜了,直接寫在IDJDatePickerView.m里會(huì)使得代碼看起來可讀性太差了),而且把C++的調(diào)用封裝在了數(shù)據(jù)層,使得IDJDatePickerView.m的視圖層代碼不會(huì)出現(xiàn)C++的API。

(3.)timepicker目錄:這個(gè)目錄純粹是一個(gè)Demo,展示了一個(gè)不循環(huán)滾動(dòng)、顯示行數(shù)與選中條位置不對(duì)稱的選擇器,沒有什么實(shí)際的含義。

一開始我是純粹寫農(nóng)歷的選擇器,代碼都是耦合在一起的,后來逐個(gè)拆開的,這樣代碼就可以復(fù)用了,不僅僅是農(nóng)歷選擇器,而是可以承載任何數(shù)據(jù)。

責(zé)任編輯:佚名 來源: cocoachina
相關(guān)推薦

2017-03-20 14:46:07

Android日期時(shí)間選擇器

2011-11-28 13:42:55

Sencha Touc組件選擇器

2012-12-27 14:08:39

Android開發(fā)顏色選擇器

2010-09-03 09:30:29

CSS選擇器

2022-05-10 07:49:40

CSS選擇器

2010-09-07 11:14:32

CSS屬性選擇器CSS

2013-03-11 10:30:56

CSSWeb

2009-07-16 11:02:33

Swing文件選擇器

2023-03-16 10:20:55

CSS選擇器

2010-07-20 10:11:32

jQuery選擇器Sizzle

2010-08-26 12:47:15

CSSclass

2010-09-06 08:52:00

CSS選擇器

2010-12-27 16:01:45

jQuery選擇器

2023-01-30 08:42:33

CSS選擇器性能

2016-10-25 14:49:49

javascriptmaterial-uidatepicker

2020-10-25 08:57:56

CSS前端瀏覽器

2011-07-22 17:52:46

iPhone 時(shí)間 控件

2012-06-12 09:43:11

jQuery

2011-10-24 10:30:20

CSS

2024-08-06 09:26:15

Zustand選擇器Action
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)