【问题标题】:NSTextField Vertical alignmentNSTextField 垂直对齐
【发布时间】:2012-04-29 14:39:17
【问题描述】:

我正在创建可可应用程序,我在其中以这样的编程方式创建了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];  

现在我希望我的文本垂直对齐,它应该可以根据 文本长度进行调整。
有人有什么建议吗?请分享您的建议:)

非常感谢..!!

【问题讨论】:

    标签: xcode cocoa xcode4.2 vertical-alignment nstextfield


    【解决方案1】:

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

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

    【讨论】:

    • @iUser 询问的是与 UITextField 不同的 NSTextField。 NSTextField 没有 contentVerticalAlignment 属性。
    • 谢谢凯..!!我正在使用NSTextField,它没有提供contentVerticalAlignment 选项。有什么建议吗?
    • 对不起。我刚刚改变了答案。
    【解决方案2】:

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

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

    【讨论】:

    • 谢谢sosborn..!!让我试试这个。如果有任何问题,我会回复你。 :)
    • 好的,我有 RSVerticallyCenteredTextFieldCell.h 和 RSVerticallyCenteredTextFieldCell.m 课程,但我不知道如何使用它,我的 myTextField。
    • 看看 NSControl(NSTextField 继承自)。它有一个名为 setCellClass: 的方法。 Apple 的 Control and Cell Programming Guide 文档也很好读。
    【解决方案3】:

    此时覆盖 ViewWillDraw 并将您的 NSTextField 放置在其父视图的中心。这也适用于实时调整大小。您也可以此时调整字体大小以找到适合新大小的字体。

    【讨论】:

    • 解释你的反对意见,并注意这是在 2015 年回答的。这类似于接受的答案,只是不是在 NSTextFieldCell 中进行自定义绘图,而是在 NSTextField 中进行......
    【解决方案4】:

    这是上面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
        }
        
    }
    

    【讨论】:

      猜你喜欢
      • 2022-01-06
      • 2012-01-27
      • 1970-01-01
      • 1970-01-01
      • 2015-09-06
      • 2011-03-16
      • 2015-01-16
      • 2011-10-03
      相关资源
      最近更新 更多