Можно ли переопределить метод drawTextInRect UILabel, чтобы изменить размер текста UILabel?

Документация Apple для drawTextInRect, похоже, указывает на то, что это возможно:

"By the time this method is called, the current graphics context is already configured with the default environment and text color for drawing. In your overridden method, you can configure the current context further and then invoke super to do the actual drawing or you can do the drawing yourself. If you do render the text yourself, you should not invoke super."

Но приведенный ниже пример из моего подкласса UILabel (который, как я подтвердил, вызывается) не вызывает изменения размера текста независимо от того, какой размер текста я указываю. Улавливаю ли я правильный контекст или, возможно, упускаю что-то большее?

- (void)drawTextInRect:(CGRect)rect{

    CGContextRef theContext = UIGraphicsGetCurrentContext();
    CGContextSetFontSize(theContext, 32.0); // <-- doesn't change text size

    [super drawTextInRect:rect];
}

Примечание. Размер текста - это не единственное, что мне нужно изменить в тексте, но если бы я мог изменить размер текста, я почти уверен, что остальные изменения, которые мне нужно внести, были бы легкими.


person Monte Hurd    schedule 10.07.2009    source источник


Ответы (6)


Я думал, что у нас это было вчера ....
вы можете быть уверены, что суперкласс appKit будет устанавливать шрифты, цвета и прочее в соответствии с настройками, которые вы установили в InterfaceBuilder, поэтому попытки переопределить это поведение совершенно бесполезны. что вы МОЖЕТЕ сделать, это помассировать параметр, переходящий в функцию рисования, чтобы изменить функциональность ... попробуйте что-то вроде этого:

- (void)drawTextInRect:(CGRect)rect{

    CGFloat newWidth = rect.size.width * 0.75;    // 3/4 the original width
    CGFloat newHeight = rect.size.height * 0.812; // and a little less tall.

    CGRect newRect = CGRectMake(rect.origin.x,rect.origin.y,newWidth,newHeight);

    [super drawTextInRect:newRect]; // draw text into the NEW rect!
}

к тому же николай прав: если хочешь поменять шрифт, то вызывай setFont!

person kent    schedule 10.07.2009
comment
Да, ваше предложение вчера показалось лучшим путем для реализации - на самом деле, именно поэтому я сейчас спрашиваю о drawTextInRect. Я спросил только о размере шрифта, потому что я пытался свести пример к минимуму - я подумал, что если бы я мог изменить размер шрифта, я мог бы также изменить его заливку и обводку, а также их цвета для текста контура, который мне нужен. Хотя приведенный выше фрагмент помогает, я все еще близок к исходной точке, когда дохожу до понимания, как заставить drawTextInRect добавлять контуры в текст моего подкласса UILabel. Но я ДЕЙСТВИТЕЛЬНО ценю помощь !!! - person Monte Hurd; 10.07.2009

Вы можете попробовать установить шрифт UILabel:

UIFont *font = [UIFont fontWithName:@"Courier" size:32];
[self setFont: font]; 
[super drawTextInRect:rect];
person Toney Sui    schedule 04.12.2010

Я думаю, что вызов [super drawTextInRect: rect] также устанавливает размер шрифта, отменяя ваш вызов CGContextSetFontSize. Если вы этого хотите, вам, вероятно, придется рисовать самостоятельно, а не вызывать реализацию super.

person drvdijk    schedule 10.07.2009

Метод drawTextInRect UILabel сам устанавливает размер текста (вместе со шрифтом и другими параметрами), переопределяя ваш размер. Если вы хотите изменить размер шрифта, почему бы вам просто не использовать метод setFont: или свойство minimumFontSize?

person Nikolai Ruhe    schedule 10.07.2009
comment
Я просто пытался заставить drawTextInRect делать что-нибудь. Моя настоящая цель - получить текст UILabel с черной рамкой в ​​один пиксель: stackoverflow.com/questions/1103148/ - person Monte Hurd; 10.07.2009

Вы не делаете этого в методах делегата. Вам нужно получить указатель (IBOutlet) на UILabel.

Затем вы можете установить шрифт UILabel, полужирность и т. Д. С помощью метода setText: UILabel.

person Brock Woolf    schedule 10.07.2009
comment
Я думаю, что цитата из документации Apple, которую я включил в вопрос, возможно, сбила меня с пути. Часть, в которой говорится, что вы можете настроить текущий контекст, еще больше подтолкнула меня к мысли, что я, возможно, могу добавить свою однопиксельную границу к отдельным буквам, отображаемым UILabel из делегата drawTextInRect. Похоже, что это не так? Я бы хотел, чтобы были методы setTextOutlineColor и setTextOutlineWidth - ЭТО было бы неплохо !!! - person Monte Hurd; 10.07.2009
comment
Опять же, я просто использовал CGContextSetFontSize в качестве простого примера, который, как я думал, люди должны были использовать из drawTextInRect. Я подумал, что если это можно сделать, то я мог бы также легко изменить структуру текста. - person Monte Hurd; 10.07.2009

person    schedule
comment
Просто попробовал, и он нарисовал контур вокруг всего UILabel, а не вокруг букв текста. Спасибо хоть! Серьезно, вы, ребята, классные. - person Monte Hurd; 10.07.2009