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:
- http://www.cocoabuilder.com/archive/cocoa/174994-repositioning-an-nstextfieldcell.html
- https://red-sweater.com/blog/148/what-a-difference-a-cell-makes
- Pionowo wyśrodkuj tekst w NSSecureTextField z podklasą
- Pobierz zawartość NSTextField do skalowania
- pionowo wyrównać tekst w CATextLayer?
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 № 1Jest 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:
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.