我正在try 创建一个图标下面有一些文本的按钮(有点像应用程序按钮),但是这似乎很难实现.有什么 idea 吗?我怎么才能让文本显示below,图像有UIButton呢?

推荐答案

或者,您可以只使用此类别:

对象

@interface UIButton (VerticalLayout)

- (void)centerVerticallyWithPadding:(float)padding;
- (void)centerVertically;

@end

@implementation UIButton (VerticalLayout)

- (void)centerVerticallyWithPadding:(float)padding {
    CGSize imageSize = self.imageView.frame.size;
    CGSize titleSize = self.titleLabel.frame.size;
    CGFloat totalHeight = (imageSize.height + titleSize.height + padding);
    
    self.imageEdgeInsets = UIEdgeInsetsMake(- (totalHeight - imageSize.height),
                                            0.0f,
                                            0.0f,
                                            - titleSize.width);
    
    self.titleEdgeInsets = UIEdgeInsetsMake(0.0f,
                                            - imageSize.width,
                                            - (totalHeight - titleSize.height),
                                            0.0f);
    
    self.contentEdgeInsets = UIEdgeInsetsMake(0.0f,
                                              0.0f,
                                              titleSize.height,
                                              0.0f);
}

- (void)centerVertically {
    const CGFloat kDefaultPadding = 6.0f;
    [self centerVerticallyWithPadding:kDefaultPadding];
}

@end

SWIFT扩展

extension UIButton {
    
    func centerVertically(padding: CGFloat = 6.0) {
        guard
            let imageViewSize = self.imageView?.frame.size,
            let titleLabelSize = self.titleLabel?.frame.size else {
            return
        }
        
        let totalHeight = imageViewSize.height + titleLabelSize.height + padding
        
        self.imageEdgeInsets = UIEdgeInsets(
            top: -(totalHeight - imageViewSize.height),
            left: 0.0,
            bottom: 0.0,
            right: -titleLabelSize.width
        )
        
        self.titleEdgeInsets = UIEdgeInsets(
            top: 0.0,
            left: -imageViewSize.width,
            bottom: -(totalHeight - titleLabelSize.height),
            right: 0.0
        )
        
        self.contentEdgeInsets = UIEdgeInsets(
            top: 0.0,
            left: 0.0,
            bottom: titleLabelSize.height,
            right: 0.0
        )
    }
    
}

Suggestion:

imageEdgeInset.top应为:

max(0, -(totalHeight - imageViewSize.height))

Ios相关问答推荐

如何遮罩,动画和添加阴影到CAShapeLayer?

如何解释在SwiftUI视图中观察到持续的数据更改

SWIFT AVFoundation不能在查看更新的同时发布更新

当文本为空时,具有垂直轴的SwiftUI文本字段不会与FirstTextBaseline对齐

如何防止UITest套件与Fastlane一起执行?

快速 keys 串更新只有在第二次try 时才起作用

如何在 Android 上的 Flutter 应用中录制内部音频?

比较 `某个协议` 实例时出现编译错误

在 Swift 中,对象如何被准确地从内存中移除?

部分保留 UITextField 中的占位符

clipShape swift的三元

通过MatchedGeometryEffect向上滑动视图

在 Swift 中为 UITextField/UIView 摇动动画

为什么 Safari 在使用 iOS 6 设备进行远程调试时显示No Inspectable Applications?

如何在上传到服务器之前在 iOS 上压缩/调整图像大小?

每个版本的 iOS 都附带什么版本的移动 Safari?

Xcode:此时无法安装此应用程序.

iOS 7 半透明模态视图控制器

iOS:如何从 URL 调试新启动应用程序

Flutter:如何创建一个新项目