This commit is contained in:
2026-01-27 18:53:19 +08:00
parent b34de116a3
commit db869552e4
16 changed files with 402 additions and 3 deletions

View File

@@ -0,0 +1,39 @@
//
// KBImagePositionButton.h
// keyBoard
//
// Created by Kiro on 2026/1/27.
//
#import <UIKit/UIKit.h>
NS_ASSUME_NONNULL_BEGIN
/// 图片位置枚举
typedef NS_ENUM(NSInteger, KBImagePosition) {
KBImagePositionTop, // 图片在上,文字在下
KBImagePositionBottom, // 图片在下,文字在上
KBImagePositionLeft, // 图片在左,文字在右(默认)
KBImagePositionRight // 图片在右,文字在左
};
/// 可以指定图片位置的按钮
@interface KBImagePositionButton : UIButton
/// 图片位置(默认 KBImagePositionLeft
@property (nonatomic, assign) KBImagePosition imagePosition;
/// 图片和文字之间的间距(默认 8
@property (nonatomic, assign) CGFloat spacing;
/**
便捷初始化方法
@param imagePosition 图片位置
@param spacing 图片和文字之间的间距
*/
- (instancetype)initWithImagePosition:(KBImagePosition)imagePosition spacing:(CGFloat)spacing;
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,187 @@
//
// KBImagePositionButton.m
// keyBoard
//
// Created by Kiro on 2026/1/27.
//
#import "KBImagePositionButton.h"
@implementation KBImagePositionButton
- (instancetype)initWithFrame:(CGRect)frame {
if (self = [super initWithFrame:frame]) {
[self setupDefault];
}
return self;
}
- (instancetype)initWithCoder:(NSCoder *)coder {
if (self = [super initWithCoder:coder]) {
[self setupDefault];
}
return self;
}
- (instancetype)initWithImagePosition:(KBImagePosition)imagePosition spacing:(CGFloat)spacing {
if (self = [super initWithFrame:CGRectZero]) {
_imagePosition = imagePosition;
_spacing = spacing;
[self setupDefault];
}
return self;
}
- (void)setupDefault {
// _imagePosition == 0 KBImagePositionTop 0
// initWithFrame initWithCoder _imagePosition 0 (KBImagePositionTop)
// initWithImagePosition _imagePosition
//
if (self.spacing == 0) {
_spacing = 8;
}
[self updateEdgeInsets];
}
#pragma mark - Setter
- (void)setImagePosition:(KBImagePosition)imagePosition {
_imagePosition = imagePosition;
[self updateEdgeInsets];
[self setNeedsLayout];
}
- (void)setSpacing:(CGFloat)spacing {
_spacing = spacing;
[self updateEdgeInsets];
[self setNeedsLayout];
}
- (void)setImage:(UIImage *)image forState:(UIControlState)state {
[super setImage:image forState:state];
// image
dispatch_async(dispatch_get_main_queue(), ^{
[self updateEdgeInsets];
});
}
- (void)setTitle:(NSString *)title forState:(UIControlState)state {
[super setTitle:title forState:state];
// title
dispatch_async(dispatch_get_main_queue(), ^{
[self updateEdgeInsets];
});
}
#pragma mark - EdgeInsets
- (void)updateEdgeInsets {
CGSize imageSize = self.currentImage.size;
CGSize titleSize = CGSizeZero;
if (self.currentTitle.length > 0 && self.titleLabel.font) {
NSDictionary *attributes = @{NSFontAttributeName: self.titleLabel.font};
titleSize = [self.currentTitle sizeWithAttributes:attributes];
}
switch (self.imagePosition) {
case KBImagePositionTop: {
//
self.imageEdgeInsets = UIEdgeInsetsMake(
-(titleSize.height + self.spacing), // top:
0, // left
0, // bottom
-titleSize.width // right:
);
self.titleEdgeInsets = UIEdgeInsetsMake(
imageSize.height + self.spacing, // top:
-imageSize.width, // left:
0, // bottom
0 // right
);
break;
}
case KBImagePositionBottom: {
//
self.imageEdgeInsets = UIEdgeInsetsMake(
titleSize.height + self.spacing, // top:
0, // left
0, // bottom
-titleSize.width // right
);
self.titleEdgeInsets = UIEdgeInsetsMake(
-(imageSize.height + self.spacing), // top:
-imageSize.width, // left
0, // bottom
0 // right
);
break;
}
case KBImagePositionLeft: {
//
self.imageEdgeInsets = UIEdgeInsetsMake(0, 0, 0, self.spacing);
self.titleEdgeInsets = UIEdgeInsetsMake(0, self.spacing, 0, 0);
break;
}
case KBImagePositionRight: {
//
self.imageEdgeInsets = UIEdgeInsetsMake(
0,
titleSize.width + self.spacing,
0,
-(titleSize.width + self.spacing)
);
self.titleEdgeInsets = UIEdgeInsetsMake(
0,
-(imageSize.width + self.spacing),
0,
imageSize.width + self.spacing
);
break;
}
}
NSLog(@"imageEdgeInsets: %@", NSStringFromUIEdgeInsets(self.imageEdgeInsets));
NSLog(@"titleEdgeInsets: %@", NSStringFromUIEdgeInsets(self.titleEdgeInsets));
}
- (CGSize)intrinsicContentSize {
CGSize imageSize = self.currentImage ? self.currentImage.size : CGSizeZero;
CGSize titleSize = CGSizeZero;
if (self.currentTitle.length > 0 && self.titleLabel.font) {
NSDictionary *attributes = @{NSFontAttributeName: self.titleLabel.font};
titleSize = [self.currentTitle sizeWithAttributes:attributes];
}
CGSize size = CGSizeZero;
switch (self.imagePosition) {
case KBImagePositionTop:
case KBImagePositionBottom: {
//
size.width = MAX(imageSize.width, titleSize.width);
size.height = imageSize.height + self.spacing + titleSize.height;
break;
}
case KBImagePositionLeft:
case KBImagePositionRight: {
//
size.width = imageSize.width + self.spacing + titleSize.width;
size.height = MAX(imageSize.height, titleSize.height);
break;
}
}
return size;
}
@end