深度定制 UIButton 按鈕


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];

 

 設置UIButton的文字顯示位置、字體的大小、字體的顏色

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);

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM