自定義按鈕 圖片標題位置隨意放置

自定義按鈕UIControl

寫在前面

#圖標和文字在一起是開發難免的問題,系統的按鈕默認是圖片居左的文字居右的,
且圖片和文字的距離不好調整,圖片的位置更是讓人頭疼,
故在閑暇之余封裝了一個控件。
復制代碼

所用到知識的

# 1、蘋果系統自帶的自動布局,減少第三方的依賴
# 2、kvo監聽UIControl的狀態
# 3、富文本的使用,如何更新約束,如何獲取一段文字的寬高復制代碼

先看看效果

擁有功能

1、任意調整圖片和文字的間距。
2、圖片的位置可以放置在上下左右不同位置。
3、支持富文本,自定義布局,高亮和選中狀態。
復制代碼

如何使用

/**自定義按鈕初始化方法@param image 默認的圖片@param title 標題@param titleFond 標題大小@param imageMargin 標題與圖標的距離@param imageAlignmentTYpe 圖片的顯示類型@return 自定義按鈕的實例*/
- (instancetype)initWithImage:(UIImage  *) imagetitle:(NSString *) titletitleFond:(UIFont *)   titleFondimageMargin:(CGFloat)    imageMarginimageAlignmentTYpe:(MyButtonImageAlignmentTYpe )imageAlignmentTYpe;_myButton = [[MyButton alloc]initWithImage:[UIImage imageNamed:@"cache_pause"]title:@"來點我啊"titleFond:[UIFont systemFontOfSize:14]imageMargin:10imageAlignmentTYpe:MyButtonImageAlignmentLeft];[self.view addSubview:_myButton];self.myButton.frame = CGRectMake(20, 100, 120, 40);self.myButton.backgroundColor = UIColor.grayColor;[self.myButton setImage:[UIImage imageNamed:@"cache_delete"] withState:UIControlStateSelected];[self.myButton setImage:[UIImage imageNamed:@"cache_pause"] withState:UIControlStateHighlighted];[self.myButton setTitle:@"選中了" withState:UIControlStateSelected];[self.myButton setTitle:@"正在按下..." withState:UIControlStateHighlighted];[self.myButton setTitleColor:UIColor.blueColor withState:UIControlStateSelected];[self.myButton setTitleColor:UIColor.yellowColor withState:UIControlStateHighlighted];這樣就可以了,和普通的按鈕用法一樣。復制代碼

關鍵代碼

1、自定義布局(只列出了一種)
//圖片居左
- (void)setImageLeftLayoutConstraint {CGFloat imageWidth  = self.normalImage.size.width;CGFloat titleWidth = [self sizeWithText:self.titleLabel.text font:self.titleLabel.font].width;CGFloat imageCenterXMargin = (imageWidth /2.0 - (imageWidth + titleWidth + self.imageMargin) / 2.0);//創建Image約束NSLayoutConstraint *imageCenterYLc = [NSLayoutConstraint constraintWithItem:self.imageView attribute:NSLayoutAttributeCenterY relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeCenterY multiplier:1.0 constant:0];NSLayoutConstraint *imageCenterXLc = [NSLayoutConstraint constraintWithItem:self.imageView attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeCenterX multiplier:1.0 constant:imageCenterXMargin];[self addConstraints:@[imageCenterYLc,imageCenterXLc]];//創建title約束NSLayoutConstraint *titleCenterYLc = [NSLayoutConstraint constraintWithItem:self.titleLabel attribute:NSLayoutAttributeCenterY relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeCenterY multiplier:1.0 constant:0];NSLayoutConstraint *titleLeftLc = [NSLayoutConstraint constraintWithItem:self.titleLabel attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:self.imageView attribute:NSLayoutAttributeRight multiplier:1.0 constant:self.imageMargin];[self addConstraints:@[titleCenterYLc,titleLeftLc]];
}//獲取文字的寬高
- (CGSize)sizeWithText:(NSString *)text font:(UIFont *)font {NSDictionary *attrs = @{NSFontAttributeName : font};return [text boundingRectWithSize:CGSizeMake(MAXFLOAT, MAXFLOAT) options:NSStringDrawingUsesLineFragmentOrigin attributes:attrs context:nil].size;
}//kvo監聽
- (void)addObserver {[self addObserver:selfforKeyPath:@"enabled"options: NSKeyValueObservingOptionNewcontext:nil];[self addObserver:selfforKeyPath:@"selected"options: NSKeyValueObservingOptionNewcontext:nil];[self addObserver:selfforKeyPath:@"highlighted"options: NSKeyValueObservingOptionNewcontext:nil];[self.titleLabel addObserver:selfforKeyPath:@"text"options:NSKeyValueObservingOptionNewcontext:nil];
}//kvo 監聽處理(只列出了部分)
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context {if ([keyPath isEqualToString:@"selected"]) {if(self.selected) {self.imageView.image           = self.selectedImage ? self.selectedImage : self.normalImage;self.backgroundColor           = self.selectedBackgroundColor  ? self.selectedBackgroundColor : self.normalBackgroundColor;if (!self.selectedTitleAttribute && !self.normalTitleAttribute) {self.titleLabel.text       = self.selectedTitle ? self.selectedTitle : self.normalTitle;self.titleLabel.textColor  = self.selectedTitleColor ? self.selectedTitleColor : self.normalTitleColor;return;}self.titleLabel.attributedText = self.selectedTitleAttribute ? self.selectedTitleAttribute : self.normalTitleAttribute;} else {self.imageView.image           = self.normalImage;self.backgroundColor           = self.normalBackgroundColor;if (!self.normalTitleAttribute) {self.titleLabel.text       = self.normalTitle;self.titleLabel.textColor  = self.normalTitleColor;return;}self.titleLabel.attributedText = self.normalTitleAttribute;}} //監聽到字體變化,更新自動布局if ([keyPath isEqualToString:@"text"]) {[self removeConstraints:self.constraints];[self.superview layoutIfNeeded];[self updateConstraints:self.imageAlignmentTYpe];[self.superview layoutIfNeeded];}
復制代碼

以上只是部分代碼,詳細代碼請查看

歡迎查看MyApp

自定義按鈕 https://github.com/dudongge/MyApp

如果對您有幫助,請不吝star一下

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/537287.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/537287.shtml
英文地址,請注明出處:http://en.pswp.cn/news/537287.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

做優化的數據庫工程師請參考!CynosDB的計算層設計優化揭秘

本文由云社區發表本文作者&#xff1a;孫旭&#xff0c;騰訊數據庫開發工程師&#xff0c;9年數據庫內核開發經驗&#xff1b;熟悉數據庫查詢處理&#xff0c;并發控制&#xff0c;日志以及存儲系統&#xff1b;熟悉PostgreSQL&#xff08;Greenplum&#xff0c;PGXC等&#xf…

netty發送數據_看完這篇還不清楚Netty的內存管理,那我就哭了

說明在學習Netty的時候&#xff0c;ByteBuf隨處可見&#xff0c;但是如何高效分配ByteBuf還是很復雜的&#xff0c;Netty的池化內存分配這塊還是比較難的&#xff0c;很多人學習過&#xff0c;看過但是還是云里霧里的&#xff0c;本篇文章就是主要來講解&#xff1a;Netty分配池…

數字化改革體系架構“152”兩次迭代升級為“1612”

數字化改革體系架構已經完成兩次迭代&#xff0c;152-1512-1612。 2021年&#xff0c;浙江在全國率先啟動一項關系全局、影響深遠、制勝未來的重大集成改革——數字化改革&#xff0c;并確定為全面深化改革的總抓手。 2021年2月18日&#xff0c;數字化改革大會“152”工作體系…

微軟希望每個人有自己的人工智能朋友

微軟正在和其他公司那樣投資和研發人工智能技術&#xff0c;同時微軟也希望人工智能技術能夠深入我們的日常生活。 為此微軟正在申請新的專利技術希望每個人在社交網絡上都有自己的人工智能朋友可以隨時隨地的溝通交流。 實際上該專利屬于已經實踐的內容再來申請專利技術的&…

python 40位的數減個位數_Python數據分析入門教程(五):數據運算

作者 | CDA數據分析師進行到這一步就可以算是開始正式的烹飪了&#xff0c;在這部分之前的數據操作部分我們列舉了一些不同維度的分析指標&#xff0c;這一章我們主要看看這些指標都是怎么計算出來的。一、算術運算算術運算就是基本的加減乘除&#xff0c;在Excel或者Python中數…

數字化改革“152”體系詳解

架構圖 “1” 即一體化智能化公共數據平臺&#xff08;平臺大腦&#xff09;&#xff0c;按照“統一規劃、統一支撐、統一架構、統一平臺、統一標準、統一建設、統一管理、統一運維"的要求&#xff0c;建設省市縣三級公共數據平臺&#xff0c;疊加三級“大腦功能&#xf…

數字化改革“141”體系

縣級以上是“152”大框架&#xff0c;縣以下是“141”體系。 141體系是&#xff1a;縣級社會治理中心、鄉鎮&#xff08;街道&#xff09;基層治理“四個平臺”、村社網格。 “1” 第一個“1”指縣級社會治理中心。 “4” 第二個“4”指鄉鎮&#xff08;街道&#xff09;基…

spring boot——MockMvc的用法

1.pom配置 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId> </dependency> 2.所需對象及Controller public class User {private String id;private String username;private…

python一元加號_Python一元方程解算系統(需要Sympy庫支持)

解算案例本文為實現python一元方程解算的源碼案例(后續不定期更新)# -*- coding: UTF-8 -*-from sympy import *#設置一些可能拋出的異常def Warn(type):if type "missEquater":print "You missed the euqater!"elif type "excessiveEquater":…

接口做的好怎么形容_淘寶直播預告怎么做才合格?如何做好?

很多淘寶商家在直播前沒有做淘寶直播預告&#xff0c;或者不知道怎么去做直播預告&#xff0c;這對直播的效果會有很大的影響&#xff0c;那么直播前如何做好直播預告呢?怎樣的直播預告才是合格的&#xff0c;下面來了解一下。1.必須去淘寶直播中控臺發布。因為手機上發布目前…

“1+7+N”改革工作體系介紹

2021年&#xff0c;浙江省確定了“17N”的改革工作體系&#xff0c;要求以全面深化改革新成效再創體制機制新優勢。&#xff08;2022年已經升級為“1612N”&#xff0c;點擊閱讀&#xff09; “1” 數字化改革&#xff0c;這是浙江全面深化改革的總抓手。將聚焦打造全球數字變…

傻傻分不清的javascript運行機制

學習到javascript的運行機制時&#xff0c;有幾個概念經常出現在各種文章中且容易混淆。Execution Context(執行環境或執行上下文)&#xff0c;Context Stack (執行棧)&#xff0c;Variable Object(VO: 變量對象)&#xff0c;Active Object(AO: 活動對象)&#xff0c;LexicalEn…

浙江省數字化改革回顧(2022年5月)

事業的偉大在于目標的壯麗&#xff0c;也在于過程的壯麗&#xff1b;改革的成果在于享有的豐富&#xff0c;也在于經歷的豐富。2021年2月18日&#xff0c;春節假期后首個工作日&#xff0c;浙江省委召開全省數字化改革大會&#xff0c;在全國率先開啟數字化改革探索實踐。此后&…

python 某個數是不是在某個范圍內_教寫一個簡單的python小程序(04)

點擊藍字關注我們 會酸的柚子Python愛好者搞機少年七夕結束了~酸柚也是被強塞了滿嘴的狗糧在這樣充滿戀愛腐朽氣息的一天酸柚也是馬不停蹄的在趕稿子兄弟們&#xff0c;給我頂起來呀~我們來看看今日的題目可能很多小伙伴對完全平方數這個概念有點生疏了完全平方數數學上&#x…

Python:模塊module

python中一個模塊就是一個擴展名為.py的文件&#xff0c;也可能是預編譯的.pyc文件。 引入模塊用&#xff1a;import 模塊名 使用引用模塊中定義的標識符&#xff08;函數、變量、類&#xff09;用&#xff1a;模塊名.標識符名 引入模塊中的標識符用&#xff1a;from 模塊名 im…

浙江公布2022年數字化改革“最系列“成果 評選出最佳應用104項

10月29日&#xff0c;省委改革辦&#xff08;省數改辦&#xff09;公布了2022年數字化改革“最系列”成果。該評選由省委改革辦&#xff08;省數改辦&#xff09;會同省委政研室、省人大常委會法工委、省市場監管局和省大數據局共同開展&#xff0c;評選了最佳應用104項、最強大…

dot net core 使用 IPC 進程通信

原文:dot net core 使用 IPC 進程通信版權聲明&#xff1a;博客已遷移到 http://lindexi.gitee.io 歡迎訪問。如果當前博客圖片看不到&#xff0c;請到 http://lindexi.gitee.io 訪問博客。本文地址 https://blog.csdn.net/lindexi_gd/article/details/79946496 dot net core 使…

python可變類型和不可變深淺拷貝類型_python3筆記十四:python可變與不可變數據類型+深淺拷貝...

一&#xff1a;學習內容python3中六種數據類型python賦值python淺拷貝python深拷貝二&#xff1a;python3六種數據類型1.六種數據類型Number(數字)string(字符串)List(列表)Tuple(元祖)Set(集合)Dictionary(字典)2.六種數據類型分類不可變數據(3個)&#xff1a;Number、String、…

Android手機用wifi連接adb調試的方法

https://www.jianshu.com/p/dc6898380e38 0x0 前言 Android開發肯定要連接pc的adb進行調試&#xff0c;傳統的方法是用usb與pc進行連接&#xff0c;操作簡單即插即用&#xff0c;缺點是pc上必須得有對應手機的usb驅動程序&#xff0c;對于谷歌親兒子系列和三星摩托等外國品牌而…

控制臺應用程序換換為窗體應用_Epic為開發者設計了一套iPhone使用的運動捕捉應用程序...

玩懂手機網7月13日資訊&#xff0c;我們都知道對于游戲或者是動漫開發者來說&#xff0c;運動捕捉設備是一套非常昂貴的設備&#xff0c;需要非常專業的獨立開發人員&#xff0c;大量的時間才能完成&#xff0c;最近Epic為開發者設計了一套iPhone使用的運動捕捉應用程序。這套i…