Вертикално подравняване на текста към горната част в UILabel
Имам UILabel
с място за два реда текст. Понякога, когато текстът е твърде кратък, той се показва във вертикалния център на етикета.
Как да подравня вертикално текста, за да бъде винаги в горната част на UILabel
?
2133
3
Няма начин да се зададе вертикално подравняване на
UILabel
, но можете да постигнете същия ефект, като промените рамката на етикета. Направих моите етикети оранжеви, за да можете ясно да видите какво се случва.Ето бързия и лесен начин да направите това:
Ако имате етикет с по-дълъг текст, който ще се състои от повече от един ред, задайте
numberOfLines
на0
(нула тук означава неограничен брой редове).Дълга версия
Ще направя етикета си в код, за да можете да видите какво'се случва. Можете да настроите повечето от това и в Interface Builder. Моята настройка е приложение, базирано на изглед, с фоново изображение, което направих във Photoshop, за да покажа полетата (20 точки). Етикетът е в атрактивен оранжев цвят, за да можете да видите какво'става с размерите.
Някои ограничения при използването на
sizeToFit
се проявяват при текст, подравнен в центъра или вдясно. Ето какво се случва:Етикетът все още е оразмерен с фиксиран горен ляв ъгъл. Можете да запазите ширината на оригиналния етикет'в променлива и да я зададете след
sizeToFit
, или да му зададете фиксирана ширина, за да се справите с тези проблеми:Обърнете внимание, че
sizeToFit
ще се съобрази с минималната ширина на вашия първоначален етикет'. Ако започнете с етикет с ширина 100 и извикатеsizeToFit
за него, той ще ви върне (вероятно много висок) етикет с ширина 100 (или малко по-малко). Може да искате да зададете минималната ширина на етикета, която искате, преди да промените размера.Някои други неща за отбелязване:
Дали ще се спазва
lineBreakMode
зависи от начина, по който е зададен.NSLineBreakByTruncatingTail
(по подразбиране) се игнорира следsizeToFit
, както и другите два режима на съкращаване (head и middle).NSLineBreakByClipping
също се игнорира.NSLineBreakByCharWrapping
работи както обикновено. Широчината на рамката все още се стеснява, за да се побере в най-дясната буква.Mark Amery даде поправка за NIB и Storyboards, използващи Auto Layout, в коментарите:
**Първоначалният ми отговор (за сведение/препоръка):**
Това използва метода
NSString
sizeWithFont:constrainedToSize:lineBreakMode:
, за да изчисли височината на рамката, необходима за побиране на низ, след което задава началото и ширината.Променете размера на рамката за етикета, като използвате текста, който искате да вмъкнете. По този начин можете да вместите произволен брой редове.
Подобно на отговора по-горе, но той не беше съвсем правилен или лесен за въвеждане в кода, така че го изчистих малко. Добавете това разширение или към собствен .h и .m файл, или просто го поставете точно над имплементацията, която възнамерявате да използвате:
Отделих известно време, за да прочета кода, както и кода във въведената страница, и установих, че всички те се опитват да променят размера на рамката на етикета, така че вертикалното подравняване по подразбиране да не се появи в центъра.
В някои случаи обаче искаме етикетът да заеме всички тези пространства, дори ако етикетът наистина има толкова много текст (например няколко реда с еднаква височина).
Тук използвах алтернативен начин за решаване, като просто подредих нови редове в края на етикета (pls note that I actually inherited the
UILabel
, but it is not necessary):