Есть пара потенциальных решений, опубликованных в подобном вопросе , который я задал некоторое время назад.
Честно говоря, я все еще использую недокументированный логический _cFlags.vCentered
( tsk tsk , плохой программист!), Чтобы выполнить свою работу. Все просто и работает. Я изобрету колесо позже, если придется.
Обновление:
ОК, думаю, я понял это. Оба решения полагаются на вызов super
для получения прямоугольника по умолчанию, а затем изменяют origin.y
и size.height
для выполнения вертикального центрирования. Однако вызовы super
возвращают прямоугольник, ширина которого уже была отрегулирована для размещения текста по горизонтали.
Решение состоит в том, чтобы использовать origin.x
и size.width
из прямоугольника границ, который передается методу:
В растворе № 1:
- (NSRect)titleRectForBounds:(NSRect)theRect {
NSRect titleFrame = [super titleRectForBounds:theRect];
NSSize titleSize = [[self attributedStringValue] size];
// modified:
theRect.origin.y += (theRect.size.height - titleSize.height)/2.0 - 0.5;
return theRect;
}
В растворе № 2:
- (NSRect)drawingRectForBounds:(NSRect)theRect
{
NSRect newRect = [super drawingRectForBounds:theRect];
// modified:
newRect.origin.x = theRect.origin.x;
newRect.size.width = theRect.size.width;
if (mIsEditingOrSelecting == NO)
{
// Get our ideal size for current text
NSSize textSize = [self cellSizeForBounds:theRect];
// Center that in the proposed rect
float heightDelta = newRect.size.height - textSize.height;
if (heightDelta > 0)
{
newRect.size.height -= heightDelta;
newRect.origin.y += (heightDelta / 2);
}
}
return newRect;
}