自定義UIButton

来源:http://www.cnblogs.com/alan12138/archive/2016/07/13/5666268.html
-Advertisement-
Play Games

偶爾逛簡書能看見很多值得記下來的東西,有的接觸過有的沒接觸過,接觸過的也可能過段時間就忘記了,再上手的時候可能手足無措,所以決定有些覺得值得記下來的東西還是記錄一下。博客是個好地方,因為很多人都能搜索到,所以迫使自己要認真點寫,不然就很丟人了,所以在這裡記錄一些東西可能是對自己而言以後再次翻看最清晰 ...


偶爾逛簡書能看見很多值得記下來的東西,有的接觸過有的沒接觸過,接觸過的也可能過段時間就忘記了,再上手的時候可能手足無措,所以決定有些覺得值得記下來的東西還是記錄一下。博客是個好地方,因為很多人都能搜索到,所以迫使自己要認真點寫,不然就很丟人了,所以在這裡記錄一些東西可能是對自己而言以後再次翻看最清晰的記錄了,推薦大家都可以寫一下,就當做筆記了,這樣比收藏別人的文章更好,因為別人的思路轉換為自己的東西還是需要一個過程的,自己把自己的領悟寫下來就是這個過程。

寫了這麼多廢話,下麵開始主題了:

第一種方式:子類重新佈局

很簡單就直接上代碼了:

繼承UIButton,我常用的類首碼是AT,所以自定義按鈕就是ATButton了,我們在ATButton重寫layoutSubviews方法

一般常見的樣式就是圖片在上文字標題在下,或者圖片在右標題文字在左,圖片在右文字在左就不用說了吧,預設樣式,圖片在下文字在上至今沒見過,不過也不難實現,但是這裡就不寫了,只寫前兩種,會了前兩種最後一種也就不難懂了。

圖片在上文字標題在下

ATButton.m

 1 //更改上下方向圖片和文字的位置
 2 - (void)layoutSubviews{
 3     [super layoutSubviews];
 4     
 5     CGRect imageRect = self.imageView.frame;
 6     imageRect.origin.x = self.frame.size.width * 0.5 - imageRect.size.width * 0.5;
 7     imageRect.origin.y = self.frame.size.height * 0.5 - imageRect.size.height;
 8     
 9     CGRect titleRect = self.titleLabel.frame;
10     titleRect.origin.x = self.frame.size.width * 0.5 - titleRect.size.width * 0.5;
11     titleRect.origin.y = self.frame.size.height * 0.5 ;
12     
13     self.imageView.frame = imageRect;
14     self.titleLabel.frame = titleRect;
15 }

控制器:

1 ATButton *btn = [[ATButton alloc] init];
2 [btn setBackgroundColor:[UIColor greenColor]];
3 [btn setFrame:CGRectMake(100, 100, 100, 100)];
4 [btn setTitle:@"按鈕" forState:UIControlStateNormal];
5 [btn setTitleColor:[UIColor redColor] forState:UIControlStateNormal];
6 [btn setImage:[UIImage imageNamed:@"mainCellCaiClick"] forState:UIControlStateNormal];
7 [btn addTarget:self action:@selector(btnClick:) forControlEvents:UIControlEventTouchUpInside];
8 [self.view addSubview:btn];

 效果圖:

圖片在右文字標題在左

ATButton.m

 1 //更改左右方向圖片和文字的位置
 2 - (void)layoutSubviews
 3 {
 4     [super layoutSubviews];
 5     
 6     CGRect imageRect = self.imageView.frame;
 7     imageRect.origin.x = self.frame.size.width * 0.5 ;
 8     imageRect.origin.y = self.frame.size.height * 0.5  - imageRect.size.height * 0.5;
 9     
10     CGRect titleRect = self.titleLabel.frame;
11     titleRect.origin.x = self.frame.size.width * 0.5 - titleRect.size.width;
12     titleRect.origin.y = self.frame.size.height * 0.5 - titleRect.size.height * 0.5;
13     
14     self.imageView.frame = imageRect;
15     self.titleLabel.frame = titleRect;
16     
17 }

控制器:

1  ATButton *btn = [[ATButton alloc] init];
2  [btn setBackgroundColor:[UIColor greenColor]];
3  [btn setFrame:CGRectMake(100, 100, 100, 100)];
4  [btn setTitle:@"按鈕" forState:UIControlStateNormal];
5  [btn setTitleColor:[UIColor redColor] forState:UIControlStateNormal];
6  [btn setImage:[UIImage imageNamed:@"mainCellCaiClick"] forState:UIControlStateNormal];
7  [btn addTarget:self action:@selector(btnClick:) forControlEvents:UIControlEventTouchUpInside];
8  [self.view addSubview:btn];

效果圖:(我都是讓它們居中顯示的,如果你想改的話調一下位置也很容易)

第二種方式:EdgeInsets(不需要創建子類直接在控制器兩行代碼更改位置)

圖片在右文字標題在左

 1 UIButton *btn = [[UIButton alloc] init];
 2 [btn setBackgroundColor:[UIColor greenColor]];
 3 [btn setFrame:CGRectMake(100, 100, 100, 100)];
 4 [btn setTitle:@"按鈕" forState:UIControlStateNormal];
 5 [btn setTitleColor:[UIColor redColor] forState:UIControlStateNormal];
 6 [btn setImage:[UIImage imageNamed:@"mainCellCaiClick"] forState:UIControlStateNormal];
 7 [btn addTarget:self action:@selector(btnClick:) forControlEvents:UIControlEventTouchUpInside];
 8 btn.imageEdgeInsets = UIEdgeInsetsMake(0, btn.frame.size.width * 0.5, 0, 0);
 9 btn.titleEdgeInsets = UIEdgeInsetsMake(0, -btn.frame.size.width + (btn.frame.size.width * 0.5 - btn.titleLabel.frame.size.width), 0, 0);
10 [self.view addSubview:btn];

 效果圖:

圖片在上文字標題在下

 1 UIButton *btn = [[UIButton alloc] init];
 2 [btn setBackgroundColor:[UIColor greenColor]];
 3 [btn setFrame:CGRectMake(100, 100, 100, 100)];
 4 [btn setTitle:@"按鈕" forState:UIControlStateNormal];
 5 [btn setTitleColor:[UIColor redColor] forState:UIControlStateNormal];
 6 [btn setImage:[UIImage imageNamed:@"mainCellCaiClick"] forState:UIControlStateNormal];
 7 [btn addTarget:self action:@selector(btnClick:) forControlEvents:UIControlEventTouchUpInside];
 8 btn.imageEdgeInsets = UIEdgeInsetsMake(-(btn.imageView.frame.size.height),btn.frame.size.width * 0.5 - btn.imageView.frame.size.width * 0.5, 0, 0);
 9 btn.titleEdgeInsets = UIEdgeInsetsMake(0, -btn.titleLabel.frame.size.width * 0.5, -(btn.titleLabel.frame.size.height), 0);
10 [self.view addSubview:btn];

 效果圖:

 

OK,就是這麼多了,最後說一下UIEdgeInsetsMake():它的參數順序有點奇怪,是上左下右,怎麼用呢?這麼記比較簡單:比如說你想讓按鈕中的圖片向左移10,你就在第二個參數寫10,前面加負號就OK了,其他位置都一樣,這樣用比較容易理解一些,也比較容易記。

 github:https://github.com/alan12138/Custom-Control


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • js中拼接html,總是感覺不夠優雅,本著要優雅不要污,決定嘗試js模板引擎。 JavaScript 模板引擎 JavaScript 模板引擎作為數據與界面分離工作中最重要一環,越來越受開發者關註。 常見模板引擎 baiduTemplate(百度)\artTemplate(騰訊)\juicer(淘寶 ...
  • 概述 上一篇我們介紹瞭如何使用vue resource處理HTTP請求,結合服務端的REST API,就能夠很容易地構建一個增刪查改應用。這個應用始終遺留了一個問題,Web App在訪問REST API時,沒有經過任何認證,這使得服務端的REST API是不安全的,只要有人知道api地址,就可以調用... ...
  • 她基於原生JavaScript精心雕琢,相容了包括IE6在內的所有主流瀏覽器。她具備優雅的內部代碼,良好的性能體驗,和完善的皮膚體系,並且完全開源,你可以任意獲取開發版源代碼,一掃某些傳統日期控制項的封閉與狹隘。layDate本著資源共用的開發者精神和對網頁日曆交互無窮的追求,延續了layui一貫的簡 ...
  • × 目錄 [1]原因 [2]undefined [3]null 前面的話 一般的程式語言,表示空的只有null,但javascript的設計者Brendan Eich卻設計了一個undefined,這無疑增加了程式複雜度,但這樣做也是有一定原因的。本文將詳細介紹javascript中的undefin ...
  • 先看看效果 其實是會碰到問題滴 sencha touch里,tabBar只有設在上面或者下麵的時候,才能正常顯示。 如果設置到左側的話,預設就會產生這樣的結果: 要解決這個問題,我的第一反應就是用css。但是那無疑增加了複雜度。(我確實也那麼搞過,麻煩得要命) 其實只要對sencha touch的布 ...
  • frameworkErrorNotFound 錯誤提示有個框架文件沒找著,首先判斷該框架是屬於要使用未添加,還是不使用已添加未找到。此次是第二種。 此目錄下找著,刪除即可 ...
  • 讓你的 EditText 全部清除: 網址:https://github.com/MrFuFuFu/ClearEditText ...
  • 原文:ListView滑動刪除 ,仿騰訊QQ(鴻洋_) 文章實現的功能是:在ListView的Item上從右向左滑時,出現刪除按鈕,點擊刪除按鈕把Item刪除。 看過文章後,感覺沒有必要把dispatchTouchEvent()和onTouchEvent()兩個方法都重寫,只要重寫onTouchEv ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...