UIButton *btnTemp = [UIButtonbuttonWithType:UIButtonTypeCustom];
深度定制一個按鈕
UIButton *btn1 = [UIButton buttonWithType:UIButtonTypeCustom]; btn1.frame = CGRectMake(0, 0, 200, 140); btn1.center = CGPointMake(180, 215); btn1.autoresizingMask = UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin; [btn1 setTitle:@"" forState:UIControlStateNormal]; [btn1 addTarget:self action:@selector(btnTest) forControlEvents:UIControlEventTouchUpInside]; [self.view addSubview:btn1];
注意:通過 [UIButton buttonWithType:UIButtonTypeCustom] 創建的按鈕不能手動release,交給系統好了。不能寫 [button release];
疑問 & 發現
兩種不同的創建方式,其中一種button 可以顯示titile,但是另外一種不能顯示。如下所示;
// UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect]; //使用這種創建方式,button 不能顯示 titile // button.frame = CGRectMake(10+(Screen_width*schemeCount)+30+100, 20+(j*30), 130, 40);
//使用alloc的方式創建,button 可以顯示title UIButton *button = [[UIButton alloc]initWithFrame:CGRectMake(10+(Screen_width*schemeCount)+30+100, 20+(j*30), 130, 40)]; [button setTitle:@"1" forState:UIControlStateNormal]; [button setTitleColor:[UIColor blackColor] forState:UIControlStateNormal]; [button setBackgroundColor:[UIColor whiteColor]]; [self.uisv_bottomView addSubview:button]; [button release];
找到狗血的原因了!使用如下方法創建button時,不能使用[button release]; 否則,button 不能顯示標題
UIButton *button = buttonWithType:UIButtonTypeRoundedRect];
button.frame = CGRectMake(10+(Screen_width*schemeCount)+30+100, 20+(j*30), 130, 40);
疑問:經過實踐發現,當把一個button 依附到一個 imageview時,button按鈕沒有按下去的效果,而且,不能夠設置背景圖片。只能設置顏色。下面代碼,在[imageView addSubView:button]; 不起作用。為什么? 難道button 只能add到view上?而不是imageView上?(是不是也因為狗血的 release 啊)
[button setBackgroundImage:[UIImage imageNamed:@"button_anpai.png"] forState:UIControlStateNormal];
btn.frame = CGRectMake(x, y, width, height);
[btn setTitle: @"search" forState: UIControlStateNormal];
//設置按鈕上的自體的大小
//[btn setFont: [UIFont systemFontSize: 14.0]]; //這種可以用來設置字體的大小,但是可能會在將來的SDK版本中去除改方法
//應該使用
btn.titleLabel.font = [UIFont systemFontOfSize: 14.0];
[btn seBackgroundColor: [UIColor blueColor]];
//最后將按鈕加入到指定視圖superView
[superView addSubview: btn]; //為什么要指定到superview?
==========================================================
tvnamelabel=[[UIButton alloc]initWithFrame:CGRectMake(5,5,200,40)];
這樣初始化的button,文字默認顏色是白色的,所有如果背景也是白色的話,是看不到文字的,
btn.contentHorizontalAlignment=UIControlContentHorizontalAlignmentLeft ;//設置文字位置,現設為居左,默認的是居中
但是問題又出來,此時文字會緊貼到做邊框,我們可以設置
btn.contentEdgeInsets = UIEdgeInsetsMake(0,10, 0, 0);
使文字距離做邊框保持10個像素的距離。
=======================================================
設置UIButton上字體的顏色設置UIButton上字體的顏色,不是用:
[btn.titleLabel setTextColor:[UIColorblackColor]];
btn.titleLabel.textColor=[UIColor redColor];
而是用:
[btn setTitleColor:[UIColor blackColor]forState:UIControlStateNormal];
長按按鈕響應事件
{ //長按刪除按鈕 UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc]initWithTarget:self action:@selector(deleteLongPressed)]; // longPress.minimumPressDuration = 0.5; //最短按壓時間,一般地,此句不寫也可以 [uib_delete addGestureRecognizer:longPress]; } //長按刪除按鈕,刪除所有輸入的號碼 -(void)deleteLongPressed { uil_phoneNumber.text = @""; nsms_phoneNumber = [[NSMutableString alloc]initWithFormat:@""]; }
UIButton 兩種設置背景圖片方式的區別
第一種:setBackGroudImage :圖片被拉伸
第二種:setImage : 圖片保持原大小
參考:http://my.oschina.net/joanfen/blog/160843 講圖片進行拉伸設置為button的背景。
非alloc 的button 都不要release ,否則button 顯示不出來。雖然button的 retaincount 還是1 。如下
//button 劇集 button = [UIButton buttonWithType:UIButtonTypeCustom]; button.frame = CGRectMake(0, k_headImageView_height, SCREEN_WIDTH/2-1, 84/2-1); [button setBackgroundImage:[ImageUtilities createImageWithColor:[UIColor whiteColor]] forState:UIControlStateNormal]; [button setBackgroundImage:[ImageUtilities createImageWithColor:[ColorUtils colorWithHexString:k_buttonSelect_backGroudColor]] forState:UIControlStateSelected]; [button setTitle:@"劇集" forState:UIControlStateNormal]; [button.titleLabel setFont:[UIFont systemFontOfSize:k_introduceInfo_fontSize]]; [button setTitleColor:[ColorUtils colorWithHexString:k_introduceInfo_textColor] forState:UIControlStateNormal]; [button setTitleColor:[ColorUtils colorWithHexString:k_buttonSelect_textColor] forState:UIControlStateSelected]; [button addTarget:self action:@selector(btnEpisodeClicked:) forControlEvents:UIControlEventTouchUpInside]; episodeButton = button; [self.view addSubview:episodeButton]; //[button release]; // 若此處添加 release, button 將顯示不出來。
如何設置能讓UIButton點一下,保持按下去的狀態,再點一下彈起來?
方法:做一個判斷修改selected屬性如: [_tmpBtn setSelected:YES]; OR [_tmpBtn setSelected:NO];
UIButton 的的對象 button 有三種 狀態,分貝是normal selected highlighted ,他們之間有什么區別?
UIControlStateNormal 指按鈕的正常狀態,這個沒有異議吧。
UIControlStateHighlighted 指按鈕被按下去時的狀態!
UIControlStateSelected 指按鈕被選中時的狀態!
“按下去”和“選中”有什么區別?“按下去時狀態”指被手指按壓時的狀態。“選中時狀態”指手指按壓已經完畢,並離開。按鈕呈現的狀態。所以,設置一個按鈕被按下去時的圖片變化時,要用UIControlStateHighlighted而不是UIControlStateSelected。
參考:關於UIButton的highlighted狀態的總結
UIButton的一個小陷阱——注意:titleLabel是readonly的!
在使用UIButton的時候,有時需要在運行時動態改變按鈕的文字、樣式。但iOS SDK的文檔說得不是很清楚,使用錯誤的API經常會產生詭異的結果,如點擊UIButton后,text變回默認值。
這問題我遇到過三回了,每回都要重新google一下才解決。以前覺得這些不起眼的小問題,不值得單獨寫一篇文章,但往往這些問題現常見。以后會持續把遇到的一些小問題作為Tips的形式分享出來,希望也可以幫助到其它的開發者。
錯誤的方式
1 2 |
/* Wrong way */ yourButton.titleLabel.text = @"SampleText"; |
這里titleLabel是readonly的,但我們可以改變titleLabel的property。問題出在UIButton是有Default, Highlighted, Selected, Disabled
幾種狀態的。這種方式會改變當前狀態的text,但一旦狀態改變(如tap一下),則會變成默認的設置。
正確的方式
1 2 |
/* Right way */ [yourButton setTitle:@"SampleText" forState:UIControlStateNormal]; |
如果其它狀態沒有特別設置的話,設置UIControlStateNormal
這個狀態,會自動設置其它狀態。
參考: http://www.iwangke.me/2012/09/05/caveat-for-uibutton/
讓UIButton在按下時沒有高亮效果
方法一:
button1.adjustsImageWhenHighlighted = NO; //取消按鈕高亮狀態(有些時候,我們並不想要系統給的那個狀態)
參考:http://www.cocoachina.com/bbs/simple/?t106229.html
方法二:為UIButton所有狀態設置一張透明的圖片。詳情請看:讓UIButton在按下時沒有高亮效果
設置按鈕被點中的高亮光暈效果
[cancelButton setShowsTouchWhenHighlighted:YES];
按鈕擴大觸摸響應區域
原來代碼如下:menuBtn.frame = CGRectMake(4, 8, 44, 28); 擴大觸摸區域代碼如下: [menuBtn setImage:[PYUtiles imageFromFile:@"MenuBtn.png"] forState:UIControlStateNormal]; [menuBtn setFrame:CGRectMake(0, 0, 48, 44)]; [menuBtn setContentMode:UIViewContentModeCenter]; 原理,擴大button的frame rect,並且將圖片設置成居中即可 注意,這邊要是setImage,setBackgroundImage不行,會擴大圖片到整個響應區域
參考:http://www.myexception.cn/mobile/550219.html
設置UIButton 的字體陰影
[[rightButton titleLabel] setShadowColor:[UIColor blackColor]]; [[rightButton titleLabel] setShadowOffset:CGSizeMake(-0.5, -0.5)];
調整Button內部內容的邊距(Padding)
[self.userNameButton setContentEdgeInsets:UIEdgeInsetsMake(0, 3, 0, 0)];
參考:http://blog.csdn.net/ysy441088327/article/details/7660183
保持UIButton高亮狀態 (點擊進入)
參考:關於UIButton的highlighted狀態的總結 (在按鈕up的時候button的highlighted狀態會被clear,)
關於UIButton選中和高亮狀態下的圖片切換 (點擊進入)
總結:當button的狀態為selected的時候,高亮時對應的狀態應該是selected|highlighted,這與normal下高亮的狀態highlighted不同。
代碼如下:
[myButton setImage:imageSelectedHover forState:(UIControlStateSelected | UIControlStateHighlighted)];
UIButtonTypeCustom 和 UIButtonTypeRoundedRect 的區別
UIButtonTypeCustom :是一個背景透明的按鈕。 如果想做按鈕中圖片切換(不同狀態),必須使用兩張圖片進行設置。
UIButtonTypeRoundedRect :是一個圓角矩形按鈕。方便之處:系統會自動為這種按鈕設置高亮狀態(半透明狀態)。即,通過一張圖片,就可以做出按鈕交互的效果。 不方便的地方:如果你想自定義不同狀態下,按鈕顯示的背景,這種類型的按鈕就支持的不好。
建議:快速開發,每個按鈕只有一張圖片,建議使用UIButtonTypeRoundedRect。按鈕高度自定義,建議使用UIButtonTypeCustom。
titleEdgeInsets imageEdgeInsets 的使用
[myButton setTitleEdgeInsets:UIEdgeInsetsMake(0, 0, 0, 0)]; 4個參數是上邊界,左邊界,下邊界,右邊界。
使用UIButton和UIImageView時的坑
-》使用將UIButton設置為透明,然后使用UIImage 或者UIImageView作為UIButton的父view,可能會使UImage覆蓋的那片UIButton區域失去事件響應。解決方案:設置UIimage或者UIImageView的人機交互屬性為YES. ***.userInteractionEnabled = YES;
2、同理,如果將一個imageview作為uibutton的子view賦給uibutton,那么uibutton被覆蓋的區域將失去事件響應能力。解決方案:讓uibutton在上層,imageview在下層即可。注意,此處設置人機交互屬性為YES也是沒用的哦。
uibutton增加長按事件之后怎么識別自己uibutton.tag
UIButton *btn =(UIButton*)gesture.view;NSLog(@"%d",btn.tag);