/ / Pionowe wyrównanie tekstu w polu NSTextField za pomocą Swift - swift, cocoa, appkit

Wyrównanie tekstu w pionie w polu NSTextField za pomocą Swift - swift, cocoa, appkit

Czytałem różne opcjejak ustawić wyrównanie pionowe na polu NSTextField. Chcę, aby tekst był wyświetlany w centrum i programowo w Swift. Oto rzeczy, które do tej pory wyglądałem:

Jedną z rzeczy, które próbowałem w Swift, jest ustawienie następującej właściwości:

textField.usesSingleLineMode = true

Wszelkie wskazówki dotyczące najlepszego sposobu na środkowy tekst w pionie byłyby bardzo mile widziane!

Odpowiedzi:

5 dla odpowiedzi № 1

Jest to bardzo trudne, ponieważ Apple sprawia, że ​​jest to bardzo trudne. Osiągnąłem to przez podklasowanie NSTextFieldCell i wywołanie metody drawingRectForBounds: w ten sposób:

override func drawingRectForBounds(theRect: NSRect) -> NSRect {
let newRect = NSRect(x: 0, y: (theRect.size.height - 22) / 2, width: theRect.size.width, height: 22)
return super.drawingRectForBounds(newRect)
}

To jest mój sposób, żeby to zrobić, jestem pewien, że sąLepsze sposoby, których nie znam (jeszcze) .To działa tylko dla standardowego rozmiaru czcionki w TextFields (co daje wysokość tekstu 22). Haven jeszcze się nie domyślił, jak uzyskać wysokość w komórce, jeśli zmienisz czcionkę.

Wynik:

wprowadź opis obrazu tutaj


3 dla odpowiedzi № 2

Spróbuj tego na placu zabaw, centruje tekst doskonale, używaj go na swoich projektach! Mam nadzieję, że to pomoże!

import Cocoa

let cell = NSTableCellView()
cell.frame = NSRect(x: 0, y: 0, width: 100, height: 100)
let tf = NSTextField()
tf.frame = cell.frame
tf.stringValue = "MyTextfield"
tf.alignment = .Center

let stringHeight: CGFloat = tf.attributedStringValue.size().height
let frame = tf.frame
var titleRect:  NSRect = tf.cell!.titleRectForBounds(frame)

titleRect.size.height = stringHeight + ( stringHeight - (tf.font!.ascender + tf.font!.descender ) )
titleRect.origin.y = frame.size.height / 2  - tf.lastBaselineOffsetFromBottom - tf.font!.xHeight / 2
tf.frame = titleRect
cell.addSubview(tf)

1 dla odpowiedzi nr 3

Przyjęta odpowiedź działa doskonale i oto wersja Swift3.

class VerticallyAlignedTextFieldCell: NSTextFieldCell {
override func drawingRect(forBounds rect: NSRect) -> NSRect {
let newRect = NSRect(x: 0, y: (rect.size.height - 22) / 2, width: rect.size.width, height: 22)
return super.drawingRect(forBounds: newRect)
}
}

1 dla odpowiedzi nr 4

Dodałem NSTextField wewnątrz NSView i wyśrodkowałem go.

Innym rozwiązaniem było (w projekcie iOS) utworzenie UILabel i umożliwienie dostosowania jego rozmiaru (sizeToFit ()) i ponowne osadzenie go w UIView.

Osobiście nie lubię obliczeń w poprzednich odpowiedziach, a drugie rozwiązanie dla iOS działa dla wszystkich rozmiarów tekstów i numerów wierszy.


0 dla odpowiedzi № 5

Stawiałem także czoła problemowi z wyrównaniem pionowymNSTextField. Moje wymaganie dotyczy renderowania ciągu jednowierszowego wewnątrz pola NSTextField. Do tego, textfield wymagał zmiany rozmiaru, co sugerowało, że programowo zmieniliśmy rozmiar czcionki w tekście w polu tekstowym przy zmianie rozmiaru. W tym scenariuszu napotkaliśmy problemy z wyrównaniem w pionie - błędne wyrównanie było trudne do zrozumienia / zrozumienia w prosty sposób.

Co wreszcie zadziałało:

W moim scenariuszu prosty, wyłącz „Tryb pojedynczej linii” w konstruktorze interfejsu
dla pola tekstowego rozwiązano problem.