我需要在UIButton的左侧显示一个电子邮件地址,但它被定位到中心。

有什么方法来设置对齐到UIButton的左边?

这是我当前的代码:

UIButton* emailBtn = [[UIButton alloc] initWithFrame:CGRectMake(5,30,250,height+15)];
emailBtn.backgroundColor = [UIColor clearColor];
[emailBtn setTitle:obj2.customerEmail forState:UIControlStateNormal];
emailBtn.titleLabel.font = [UIFont systemFontOfSize:12.5];
[emailBtn setTitleColor:[[[UIColor alloc]initWithRed:0.121 green:0.472 blue:0.823 alpha:1]autorelease] forState:UIControlStateNormal];
[emailBtn addTarget:self action:@selector(emailAction:) forControlEvents:UIControlEventTouchUpInside];
[elementView addSubview:emailBtn];
[emailBtn release];

当前回答

tl;dr:使用UIButton。配置-做titlealign = .center,但也添加一个副标题,使其字体微观。


我们在iOS 15+上,我们使用新的UIButton。配置api,按钮现在默认多行,你试图弄清楚-我如何使按钮的标题居中或尾对齐,而不是默认的(领先)。例如,你有一个图像和一个按钮标题在下面,你想让它居中。

这样做似乎是合理的:

configuration.titleAlignment = .center

但这改变不了什么。

通过在Interface Builder中尝试,我注意到以下情况:只有当标题中有副标题时,titleAlignment才会起作用。

我不确定这是苹果方面的疏忽(稍后可能会修复),还是有一个很好的理由。在任何情况下,我们都需要一种没有字幕的方式来让它工作。也许是一些聪明的contentInset或UIControl。contentthorizontalalignment可以做到这一点,但我担心在我们必须考虑其他语言,动态类型等情况下使用这些。

这里有一个解决方案,仍然是俗气的,但可以完成工作: 添加一个只包含空格的副标题,然后使字体微观,例如0.01。

这是如何在代码中做到这一点,假设你已经在使用UIButton。配置:

configuration.titleAlignment = .center
configuration.title = "Hello hi"
configuration.subtitle = " "
configuration.subtitleTextAttributesTransformer = UIConfigurationTextAttributesTransformer({ input in
    var output = input
    output.font = .systemFont(ofSize: 0.01)
    return output
})

这不是一个理想的解决方案,将来可能会出现问题,但对于某些用例来说,这是目前可用的最佳解决方案。

其他回答

斯威夫特 4+

button.contentHorizontalAlignment = .left
button.contentVerticalAlignment = .top
button.contentEdgeInsets = UIEdgeInsets(top: 10, left: 10, bottom: 10, right: 10)

使用emailBtn。titleEdgeInsets比contenttedgeinsets更好,如果你不想改变按钮内的整个内容位置。

如果你使用按钮。contenttedgeinsets = UIEdgeInsets(top: 10, left: 10, bottom: 10, right: 10),你会得到一个警告,声明“contenttedgeinsets”在iOS 15.0中已弃用:使用UIButtonConfiguration时忽略此属性。另一种解决方案是:

15、0 +。

    var button: UIButton = {
        let button = UIButton(configuration: .filled())

        button.configuration?.contentInsets = NSDirectionalEdgeInsets(top: 16, leading: 20, bottom: 16, trailing: 20)
        button.contentHorizontalAlignment = .leading
        
        return button
    }()

迅捷用户界面

你应该改变应用于文本的.frame修饰符的对齐属性。另外,将多行文本对齐设置为.leading。

Button {
    // handler for tapping on the button
} label: {
    Text("Label")
        .frame(width: 200, alignment: .leading)
        .multilineTextAlignment(.leading)
}

设置contentthorizontalalign:

// Swift 
emailBtn.contentHorizontalAlignment = .left;

// Objective-C
emailBtn.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft;

你可能还想调整内容的左插入,否则文本将触及左边框:

// Swift 3 and up:
emailBtn.contentEdgeInsets = UIEdgeInsets(top: 0, left: 10, bottom: 0, right: 0);

// Objective-C
emailBtn.contentEdgeInsets = UIEdgeInsetsMake(0, 10, 0, 0);