首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >NSTextField垂直对齐

NSTextField垂直对齐
EN

Stack Overflow用户
提问于 2012-04-18 15:46:20
回答 4查看 19.2K关注 0票数 19

我正在创建cocoa应用程序,其中我以编程方式创建了NSTextField,如下所示。

NSView *superView = [[NSView alloc] initWithFrame:NSMakeRect(0, 300, 1400, 500)];
NSTextField *myTextField = [[NSTextField alloc] initWithFrame:NSMakeRect(180, 100, 1000, 300)];
[myTextField setStringValue:myText];
[myTextField setEditable:NO];
[myTextField setBezeled:NO];
[myTextField setDrawsBackground:NO];
[myTextField setSelectable:NO];
[myTextField setFont:[NSFont fontWithName:@"Futura" size:22]];
[superView addSubview:myTextField];
[superView setAutoresizesSubviews:YES];
[myTextField setAutoresizingMask:NSViewWidthSizable | NSViewHeightSizable];
[self.window.contentView addSubview:superView];  

现在我想要我的文本垂直对齐,它应该是可调整的根据文本长度

有人有什么建议吗?请分享您的建议:)

非常感谢..!

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-04-18 16:11:34

您想要的是可能的,但是您必须创建NSTextFieldCell的一个子类,然后在NSTextField中使用这个子类。要覆盖的关键方法是drawingRectForBounds:selectWithFrame:editWithFrame:

关于这一点,他甚至提供了一个可下载的版本Here is a blog post from the fantastic Daniel Jalkut。这个帖子已经相当老了,但它应该仍然可以正常工作。

票数 13
EN

Stack Overflow用户

发布于 2012-04-18 16:04:59

要将文本字段调整为字符串大小,您必须先使用NSStringsizeWithFont: constrainedToSize: lineBreakMode:计算文本大小,然后通过设置框架来调整文本字段的大小。

对于垂直对齐,请查看此question (以及答案)。

票数 1
EN

Stack Overflow用户

发布于 2021-08-27 11:46:16

以下是通过上面的sosborn链接的该解决方案的Swift版本:

open class VerticallyCenteredTextFieldCell: NSTextFieldCell {
    
    fileprivate var isEditingOrSelecting : Bool = false
    
    open override func drawingRect(forBounds rect: NSRect) -> NSRect {
        let rect = super.drawingRect(forBounds: rect)
        
        if !isEditingOrSelecting {
            let size = cellSize(forBounds: rect)
            return NSRect(x: rect.minX, y: rect.minY + (rect.height - size.height) / 2, width: rect.width, height: size.height)
        }
        
        return rect
    }
    
    open override func select(withFrame rect: NSRect, in controlView: NSView, editor textObj: NSText, delegate: Any?, start selStart: Int, length selLength: Int) {
        let aRect = self.drawingRect(forBounds: rect)
        isEditingOrSelecting = true
        super.select(withFrame: aRect, in: controlView, editor: textObj, delegate: delegate, start: selStart, length: selLength)
        isEditingOrSelecting = false
    }
    
    open override func edit(withFrame rect: NSRect, in controlView: NSView, editor textObj: NSText, delegate: Any?, event: NSEvent?) {
        let aRect = self.drawingRect(forBounds: rect)
        isEditingOrSelecting = true
        super.edit(withFrame: aRect, in: controlView, editor: textObj, delegate: delegate, event: event)
        isEditingOrSelecting = false
    }
    
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10205088

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档