iOS-Button 圖片與文字位置

来源:https://www.cnblogs.com/wangkejia/archive/2020/05/23/12943851.html
-Advertisement-
Play Games

最近忙的很久沒寫點啥了,哪怕寫一寫沒什麼價值的東西,也能體現出我還活著,不要板shi了,寫過的東西寫了一遍又一遍,呆zhi; 設置button的圖片與文字位置,用系統自帶的控制其實也可以; .h typedef NS_ENUM(NSUInteger, KLXKLayoutButtonStyle) { ...


最近忙的很久沒寫點啥了,哪怕寫一寫沒什麼價值的東西,也能體現出我還活著,不要板shi了,寫過的東西寫了一遍又一遍,呆zhi;

設置button的圖片與文字位置,用系統自帶的控制其實也可以;

.h

typedef NS_ENUM(NSUInteger, KLXKLayoutButtonStyle) {
    ///圖左字右
    KLXKLayoutButtonStyleLeftImageRightTitle,
    ///圖右字左
    KLXKLayoutButtonStyleLeftTitleRightImage,
    ///圖上字下
    KLXKLayoutButtonStyleUpImageDownTitle,
    ///圖下字上
    KLXKLayoutButtonStyleUpTitleDownImage
};

@interface KLXKLayoutButton : UIButton
/// 佈局方式
@property (nonatomic, assign) KLXKLayoutButtonStyle layoutStyle;
/// 圖片和文字的間距,預設值 5
@property (nonatomic, assign) CGFloat imageTitleSpacing;
/// 圖片 size 指定
@property (nonatomic, assign) CGSize imageSize;

+ (KLXKLayoutButton *)buttonWithLayoutButtonStyle:(KLXKLayoutButtonStyle)style
                                            title:(NSString *)title
                                            image:(UIImage *)image;

.m

#import "KLXKLayoutButton.h"

@implementation KLXKLayoutButton
+ (KLXKLayoutButton *)buttonWithLayoutButtonStyle:(KLXKLayoutButtonStyle)style
                                            title:(NSString *)title
                                            image:(UIImage *)image{
    KLXKLayoutButton *button = [KLXKLayoutButton buttonWithType:UIButtonTypeCustom];
    button.adjustsImageWhenHighlighted = NO;
    [button setImage:image forState:UIControlStateNormal];
    [button setTitle:title forState:UIControlStateNormal];
    [button setTitleColor:[UIColor kl_colorBlack2] forState:UIControlStateNormal];
    button.backgroundColor = [UIColor whiteColor];
    button.layoutStyle = style;
    return button;
}


/// 初始化可用
/// @param frame KLXKLayoutButton
- (instancetype)initWithFrame:(CGRect)frame {
    if (self = [super initWithFrame:frame]) {
        self.imageTitleSpacing = 5;
        self.imageSize = CGSizeZero;
    }
    return self;
}

/// 初始化可用
- (instancetype)init{
    self = [super init];
    if (self) {
        self.imageTitleSpacing = 5;
        self.imageSize = CGSizeZero;
    }
    return self;
}
- (void)layoutSubviews {
    [super layoutSubviews];
    
    if (CGSizeEqualToSize(CGSizeZero, self.imageSize)) {
        [self.imageView sizeToFit];
    }
    else {
        self.imageView.frame = CGRectMake(self.imageView.frame.origin.x,
                                          self.imageView.frame.origin.y,
                                          self.imageSize.width,
                                          self.imageSize.height);
    }
    [self.titleLabel sizeToFit];
    
    switch (self.layoutStyle) {
        case KLXKLayoutButtonStyleLeftImageRightTitle:
            [self layoutHorizontalWithLeftView:self.imageView rightView:self.titleLabel];
            break;
        case KLXKLayoutButtonStyleLeftTitleRightImage:
            [self layoutHorizontalWithLeftView:self.titleLabel rightView:self.imageView];
            break;
        case KLXKLayoutButtonStyleUpImageDownTitle:
            [self layoutVerticalWithUpView:self.imageView downView:self.titleLabel];
            break;
        case KLXKLayoutButtonStyleUpTitleDownImage:
            [self layoutVerticalWithUpView:self.titleLabel downView:self.imageView];
            break;
        default:
            break;
    }
}

- (void)layoutHorizontalWithLeftView:(UIView *)leftView rightView:(UIView *)rightView {
    CGRect leftViewFrame = leftView.frame;
    CGRect rightViewFrame = rightView.frame;
    
    CGFloat totalWidth = CGRectGetWidth(leftViewFrame) + self.imageTitleSpacing + CGRectGetWidth(rightViewFrame);
    
    leftViewFrame.origin.x = (CGRectGetWidth(self.frame) - totalWidth) / 2.0;
    leftViewFrame.origin.y = (CGRectGetHeight(self.frame) - CGRectGetHeight(leftViewFrame)) / 2.0;
    leftView.frame = leftViewFrame;
    
    rightViewFrame.origin.x = CGRectGetMaxX(leftViewFrame) + self.imageTitleSpacing;
    rightViewFrame.origin.y = (CGRectGetHeight(self.frame) - CGRectGetHeight(rightViewFrame)) / 2.0;
    rightView.frame = rightViewFrame;
}

- (void)layoutVerticalWithUpView:(UIView *)upView downView:(UIView *)downView {
    CGRect upViewFrame = upView.frame;
    CGRect downViewFrame = downView.frame;
    
    CGFloat totalHeight = CGRectGetHeight(upViewFrame) + self.imageTitleSpacing + CGRectGetHeight(downViewFrame);
    
    upViewFrame.origin.y = (CGRectGetHeight(self.frame) - totalHeight) / 2.0;
    upViewFrame.origin.x = (CGRectGetWidth(self.frame) - CGRectGetWidth(upViewFrame)) / 2.0;
    upView.frame = upViewFrame;
    
    downViewFrame.origin.y = CGRectGetMaxY(upViewFrame) + self.imageTitleSpacing;
    downViewFrame.origin.x = (CGRectGetWidth(self.frame) - CGRectGetWidth(downViewFrame)) / 2.0;
    downView.frame = downViewFrame;
}

- (void)setImage:(UIImage *)image forState:(UIControlState)state {
    [super setImage:image forState:state];
    [self setNeedsLayout];
}

- (void)setTitle:(NSString *)title forState:(UIControlState)state {
    [super setTitle:title forState:state];
    [self setNeedsLayout];
}

- (void)setImageTitleSpacing:(CGFloat)imageTitleSpacing{
    _imageTitleSpacing = imageTitleSpacing;
    [self setNeedsLayout];
}
- (void)setImageSize:(CGSize)imageSize {
    _imageSize = imageSize;
    [self setNeedsLayout];
}

@end

 


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

-Advertisement-
Play Games
更多相關文章
  • 前言: 本文主要講述瞭如何使用Docker快速上手HBase,省去繁雜的安裝部署環境,直接上手,小白必備。適合HBase入門學習及簡單代碼測試。 1. Docker 安裝 參考地址: 支持常用的操作系統:Centos / ubuntu / Windows / macos 等。 2. 拉取鏡像 鏡像地 ...
  • 下麵的testa表沒有數據,dept表有數據。直接select,有數據就會有結果集。 plsql的exists用於判斷子查詢是否有結果集返回,“exists (子查詢)”子查詢只要結果集有數據,則exists判斷為true,否則為false,不管結果集數據是什麼,是1啊是2啊或者很多列,只要結果集不 ...
  • DDL:用來定義RDB模式、外模式和內模式,已實現對基本表、視圖以及索引文件的定義、修改和刪除 創建數據表->創建表結構->創建表數據 數據類型 創建表 create table 表名( 欄位名 數據類型 [長度] [列級完整性約束][表級完整性約束]--多個主鍵:primary key (欄位名, ...
  • 倒排索引的初衷 倒排索引,它也是索引。索引,初衷都是為了快速檢索到你要的數據。 我相信你一定知道mysql的索引,如果對某一個欄位加了索引,一般來說查詢該欄位速度是可以有顯著的提升。 每種資料庫都有自己要解決的問題(或者說擅長的領域),對應的就有自己的數據結構,而不同的使用場景和數據結構,需要用不同 ...
  • @[TOC](總計和小計、逐行累計求和)### 一、總計和小計使用函數#### 1、rollupgroup by 我們都知道,是一個分組函數,用於針對某一列做分組操作。但是當它搭配其他的函數一起使用的時候,就像一對男女孩,撞出不一樣的火花。==rollup(欄位1,欄位2,.....) rollup ...
  • 從邏輯上看:描述信息的數據存在資料庫中並由DBMS統一管理 從物理上看:描述信息的數據事宜文件的方式存儲在物理磁碟上 資料庫文件分為: 1.數據文件:存放資料庫數據和數據倉庫對象的文件 主要數據文件(.mdf)+次要數據文件(.ndf) 主要數據文件只能有一個,存放資料庫的啟動信息和數據,次要文件存 ...
  • 關係代數 抽象的查詢語言,用關係運算表達查詢 運算對象:關係 運算結果:關係 傳統關係運算(集合關係運算) 1.並運算(υ) RυS:兩個關係放在一起,消去重覆部分 2.交運算(∩) R∩S:兩個關係的重覆部分 3.差運算(-) R-S:表示屬於R但不屬於S的部分,即R中取出R與S的交集部分 R-S ...
  • 一套代碼達到以下效果: 打包不同applicationId能同時安裝在同一手機上 不同logo,app名稱, 不同第三方SDK接入配置(例如微信分享appid,激光推送appkey) 能區分debug和release配置 使用到的功能:productFlavor和buildTypes 原理:優先順序b ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...