如何修复 UIButton sizeToFit/sizeThatFits 的宽度?

Posted

技术标签:

【中文标题】如何修复 UIButton sizeToFit/sizeThatFits 的宽度?【英文标题】:how to fix width in UIButton's sizeToFit/sizeThatFit? 【发布时间】:2019-04-28 04:11:41 【问题描述】:

我发现 sizeToFit 或 sizeThatFits 会改变 UIButton 的当前宽度。

UIButton* btn = [UIButton buttonWithType:UIButtonTypeCustom];
btn.frame = CGRectMake(100, 100, 200, 40);
btn.backgroundColor = [UIColor redColor];
[btn.titleLabel setText:@"ssdkfjsakdfjsakfjaksdjfkasjfkasjkfasjkfsajfkasjkas"];
btn.titleLabel.numberOfLines = 0;
[btn setTitle:@"ssdkfjsakdfjsakfjaksdjfkasjfkasjkfasjkfsajfkasjkas" forState:UIControlStateNormal];
[self.view addSubview:btn];

NSLog(@"before sizeToFit: %@",NSStringFromCGRect(btn.frame));
CGSize size = [btn sizeThatFits:CGSizeMake(200, 1000)];
[btn sizeToFit];

NSLog(@"after sizeToFit:%@",NSStringFromCGRect(btn.frame));
NSLog(@" sizeThatFits:%@",NSStringFromCGSize(size));

输出将是:

before sizeToFit: 100, 100, 200, 40
after sizeToFit:100, 100, 392, 34
sizeThatFits:392, 34

这不是我想要的行为,如果我希望 sizeToFit 根据其原始宽度将按钮框架调整到适当的高度。如何做到这一点?

【问题讨论】:

【参考方案1】:

如果你想改变 sizeToFit 设置的尺寸,你需要重写 sizeThatFits 方法。创建UIButton的子类如下:

斯威夫特:

class MyButton: UIButton 
    override func sizeThatFits(_ size: CGSize) -> CGSize 
        let sizeThatFits = super.sizeThatFits(size)
        return CGSize(width: sizeThatFits.width, height: self.frame.height)
    

目标 C:

@implementation MyButton

- (CGSize)sizeThatFits:(CGSize)size 
    CGSize sizeThatFits = [super sizeThatFits:size];
    return CGSizeMake(sizeThatFits.width, self.frame.size.height);


@end

并使用子类按钮而不是 UIButton。

UIButton* btn = [MyButton buttonWithType:UIButtonTypeCustom];

参考:Apple Doc: sizeToFit

【讨论】:

以上是关于如何修复 UIButton sizeToFit/sizeThatFits 的宽度?的主要内容,如果未能解决你的问题,请参考以下文章

如何在UIScrollView上进行UIButton修复?

我该如何修复此警告信息。警告:忽略“UIButton”实例上的键路径“radius”的用户定义的运行时属性

只需要修复 UIButton 和 UILabel 的自动布局问题

更新 Xcode 12 后如何修复操作按钮?

UIButton 外观 setBackgroundColor 更新后现在影响导航栏

设置 UIButton 背景图片会导致内存崩溃