NSButton文本插入自动布局约束

时间:2017-04-18 15:07:34

标签: objective-c autolayout interface-builder xcode8 nsbutton

我在OSX(不是iOS),Xcode 8.2,Objective-C

我有两个带约束的按钮。两个按钮都有中心标题,两者都有相同的宽度(通过约束)。否则,当涉及到另一种语言时,按钮会变得更宽,以适应更长的文本。但是我希望在按钮的边框和文本之间留出一些空间。对于NSButton,IB中的标题插入选项不存在,我没有找到任何等效的解决方案。

任何帮助表示赞赏

enter image description here

底部按钮的约束:("新项目"是顶部按钮)

enter image description here

3 个答案:

答案 0 :(得分:3)

你必须像在UILabel中那样覆盖intrinsicContentSize readonly属性

以下是使用属性覆盖NSButton的示例,您可以通过属性检查器在xib / storyboard文件中设置它们的值

//CustomButton.h file

@interface CustomButton : NSButton

@property (nonatomic, assign) IBInspectable CGFloat horizontalPadding;
@property (nonatomic, assign) IBInspectable CGFloat verticalPadding;

@end

//CustomButton.m file

@implementation CustomButton

- (NSSize) intrinsicContentSize{
    CGSize size = [super intrinsicContentSize];
    size.width += self.horizontalPadding;
    size.height += self.verticalPadding;
    return size;
}

@end

快乐编码

答案 1 :(得分:1)

这是 Swift 4

中对我有用的东西
class Button: NSButton {

    @IBInspectable var horizontalPadding   : CGFloat = 0
    @IBInspectable var verticalPadding    : CGFloat = 0

    override var intrinsicContentSize: NSSize {
        var size = super.intrinsicContentSize
        size.width += self.horizontalPadding
        size.height += self.verticalPadding
        return size;
    }
}

答案 2 :(得分:0)

快捷键5

我以这种方式为我工作:

将此类设置为情节提要中按钮的单元格。

class CustomNSButtonCell: NSButtonCell {

@IBInspectable var imagePaddingLeft   : CGFloat = 0
@IBInspectable var imagePaddingTop    : CGFloat = 0
@IBInspectable var textPaddingLeft   : CGFloat = 0
@IBInspectable var textPaddingTop    : CGFloat = 0

override func drawImage(_ image: NSImage, withFrame frame: NSRect, in controlView: NSView) {

    let newFrame = NSRect.init(
        origin: .init(x: frame.minX + imagePaddingLeft, y: frame.minY + imagePaddingTop),
        size: frame.size)

    super.drawImage(image, withFrame: newFrame, in: controlView)
}

override func drawTitle(_ title: NSAttributedString, withFrame frame: NSRect, in controlView: NSView) -> NSRect {
     let newFrame = NSRect.init(
               origin: .init(x: frame.minX + textPaddingLeft, y: frame.minY + textPaddingTop),
               size: frame.size)
    super.drawTitle(title, withFrame: newFrame, in: controlView)
    return newFrame
}

}

您可以设置图像的左侧和顶部填充。 文本通过情节提要板的左侧和顶部填充。