Выровнять текст по вертикали внутри UILabel

// Path relative to where the php file is or absolute server path
chdir($FilePath); // Comment this out if you are on the same folder
chown($FileName,465); //Insert an Invalid UserId to set to Nobody Owner; for instance 465
$do = unlink($FileName);

if($do=="1"){ 
    echo "The file was deleted successfully."; 
} else { echo "There was an error trying to delete the file."; } 

Попробуйте это. Надеюсь, что это поможет.

2114
задан Pramod More 30 May 2018 в 14:22
поделиться

6 ответов

Невозможно установить выравнивание по вертикали для UILabel , но вы можете получить тот же эффект, изменив рамку метки. Я сделал свои ярлыки оранжевыми, чтобы вы могли ясно видеть, что происходит.

Вот быстрый и простой способ сделать это:

    [myLabel sizeToFit];

sizeToFit to squeeze a label


Если у вас есть ярлык с более длинным текстом, который будет составлять более одной строки, установите ] numberOfLines до 0 (ноль здесь означает неограниченное количество строк).

    myLabel.numberOfLines = 0;
    [myLabel sizeToFit];

Longer label text with sizeToFit


Расширенная версия

Я сделаю свою метку в коде, чтобы вы могли видеть, что происходит. Вы также можете настроить большую часть этого в Интерфейсном Разработчике. Моя установка - это приложение на основе просмотра с фоновым изображением, которое я сделал в Photoshop, чтобы показать поля (20 точек). Этикетка привлекательного оранжевого цвета, поэтому вы можете видеть, что происходит с размерами.

- (void)viewDidLoad
{
    [super viewDidLoad];

    // 20 point top and left margin. Sized to leave 20 pt at right.
    CGRect labelFrame = CGRectMake(20, 20, 280, 150);
    UILabel *myLabel = [[UILabel alloc] initWithFrame:labelFrame];
    [myLabel setBackgroundColor:[UIColor orangeColor]];

    NSString *labelText = @"I am the very model of a modern Major-General, I've information vegetable, animal, and mineral";
    [myLabel setText:labelText];

    // Tell the label to use an unlimited number of lines
    [myLabel setNumberOfLines:0];
    [myLabel sizeToFit];

    [self.view addSubview:myLabel];
}

Некоторые ограничения использования sizeToFit вступают в игру с текстом, выровненным по центру или по правому краю. Вот что происходит:

    // myLabel.textAlignment = NSTextAlignmentRight;
    myLabel.textAlignment = NSTextAlignmentCenter;

    [myLabel setNumberOfLines:0];
    [myLabel sizeToFit];

enter image description here

Размер метки остается неизменным с фиксированным левым верхним углом. Вы можете сохранить исходную ширину метки в переменной и установить ее после sizeToFit или дать ей фиксированную ширину для решения этих проблем:

    myLabel.textAlignment = NSTextAlignmentCenter;

    [myLabel setNumberOfLines:0];
    [myLabel sizeToFit];

    CGRect myFrame = myLabel.frame;
    // Resize the frame's width to 280 (320 - margins)
    // width could also be myOriginalLabelFrame.size.width
    myFrame = CGRectMake(myFrame.origin.x, myFrame.origin.y, 280, myFrame.size.height);
    myLabel.frame = myFrame;

label alignment


Обратите внимание, что sizeToFit будет учитывать исходную ширину метки. минимальная ширина. Если вы начнете с метки шириной 100 и вызовете для нее sizeToFit , она вернет вам этикетку (возможно, очень высокую) шириной 100 (или немного меньше). Перед изменением размера вы можете установить для метки минимальную ширину.

Correct label alignment by resizing the frame width

Еще несколько замечаний:

Соблюдается ли lineBreakMode , зависит от того, как он установлен. NSLineBreakByTruncatingTail (по умолчанию) игнорируется после sizeToFit , как и два других режима усечения (начальный и средний). NSLineBreakByClipping также игнорируется. NSLineBreakByCharWrapping работает в обычном режиме. Ширина рамки по-прежнему сужена, чтобы соответствовать крайней правой букве.


Марк Эмери дал исправление для NIB и раскадровки, используя Auto Layout в комментариях:

Если ваша этикетка включена в перо или раскадровку как подвид представления ViewController, который использует автоматическое размещение, а затем размещение вашего вызова sizeToFit в viewDidLoad не будет работать, потому что автоматическое размещение размеров и позиций вложенных представлений после вызова viewDidLoad немедленно отменяет эффекты вашего вызова sizeToFit . Однако вызов sizeToFit из viewDidLayoutSubviews будет работать .


Мой исходный ответ (для потомков / справки):

Здесь используется NSString метод sizeWithFont: constrainedToSize: lineBreakMode: для вычисления высоты фрейма, необходимой для размещения строки, затем устанавливает исходную точку и ширину.

Измените размер фрейма для метки, используя текст, который вы хотите вставить. Таким образом, вы можете разместить любое количество строк.

CGSize maximumSize = CGSizeMake(300, 9999);
NSString *dateString = @"The date today is January 1st, 1999";
UIFont *dateFont = [UIFont fontWithName:@"Helvetica" size:14];
CGSize dateStringSize = [dateString sizeWithFont:dateFont 
        constrainedToSize:maximumSize 
        lineBreakMode:self.dateLabel.lineBreakMode];

CGRect dateFrame = CGRectMake(10, 10, 300, dateStringSize.height);

self.dateLabel.frame = dateFrame;
2673
ответ дан 22 November 2019 в 19:59
поделиться

Как и ответ выше, но он был не совсем верным или его легко было вставить в код, поэтому я немного его почистил. Добавьте это расширение либо в его собственные файлы .h и .m, либо просто вставьте прямо над реализацией, которую вы собираетесь использовать:

#pragma mark VerticalAlign
@interface UILabel (VerticalAlign)
- (void)alignTop;
- (void)alignBottom;
@end


@implementation UILabel (VerticalAlign)
- (void)alignTop
{
    CGSize fontSize = [self.text sizeWithFont:self.font];

    double finalHeight = fontSize.height * self.numberOfLines;
    double finalWidth = self.frame.size.width;    //expected width of label


    CGSize theStringSize = [self.text sizeWithFont:self.font constrainedToSize:CGSizeMake(finalWidth, finalHeight) lineBreakMode:self.lineBreakMode];


    int newLinesToPad = (finalHeight  - theStringSize.height) / fontSize.height;

    for(int i=0; i<= newLinesToPad; i++)
    {
        self.text = [self.text stringByAppendingString:@" \n"];
    }
}

- (void)alignBottom
{
    CGSize fontSize = [self.text sizeWithFont:self.font];

    double finalHeight = fontSize.height * self.numberOfLines;
    double finalWidth = self.frame.size.width;    //expected width of label


    CGSize theStringSize = [self.text sizeWithFont:self.font constrainedToSize:CGSizeMake(finalWidth, finalHeight) lineBreakMode:self.lineBreakMode];


    int newLinesToPad = (finalHeight  - theStringSize.height) / fontSize.height;

    for(int i=0; i< newLinesToPad; i++)
    {
        self.text = [NSString stringWithFormat:@" \n%@",self.text];
    }
}
@end

А затем, чтобы использовать, поместите свой текст в метку, а затем вызовите соответствующий метод для его выравнивания :

[myLabel alignTop];

или

[myLabel alignBottom];
77
ответ дан 22 November 2019 в 19:59
поделиться

Еще более быстрый (и грязный) способ сделать это - установить для режима разрыва строки UILabel значение «Обрезать» и добавить фиксированное количество новых строк.

myLabel.lineBreakMode = UILineBreakModeClip;
myLabel.text = [displayString stringByAppendingString:"\n\n\n\n"];

Это решение не сработает для всех - в частности, если вы по-прежнему хотите отображать "..." в конце строки, если оно превышает количество строк, которые вы показываете, вам необходимо используйте один из более длинных фрагментов кода - но во многих случаях это даст вам то, что вам нужно.

69
ответ дан 22 November 2019 в 19:59
поделиться
  1. Установите новый текст:

     myLabel.text = @"Some Text"
     
  2. Установите максимальное количество строк равным 0 (автоматически):

     myLabel.numberOfLines = 0
     
  3. Установите максимальный размер рамки этикетки:

     myLabel.frame = CGRectMake(20,20,200,800)
     
  4. Вызовите sizeToFit, чтобы уменьшить размер кадра, чтобы содержимое поместилось:

    [myLabel sizeToFit]
     

Рамка меток теперь достаточно высока и широка, чтобы вместить текст. Верхний левый должен быть без изменений. Я проверил это только с текстом, выровненным по верхнему левому краю. Для других выравниваний вам, возможно, придется впоследствии изменить рамку.

Кроме того, для моей метки включен перенос слов.

334
ответ дан 22 November 2019 в 19:59
поделиться

Я немного почитал код, а также код на введенной странице, и обнаружил, что все они пытаются изменить размер кадра метки, чтобы не появлялось выравнивание по вертикали по центру по умолчанию.

Однако, в некоторых случаях мы хотим, чтобы метка занимала все эти места, даже если в метке так много текста (например, несколько строк с одинаковой высотой).

Здесь я использовал альтернативный способ решения этой проблемы, просто подставляя новые строки в конец метки (pls заметьте, что на самом деле я унаследовал UILabel, но в этом нет необходимости):

CGSize fontSize = [self.text sizeWithFont:self.font];

finalHeight = fontSize.height * self.numberOfLines;
finalWidth = size.width;    //expected width of label

CGSize theStringSize = [self.text sizeWithFont:self.font constrainedToSize:CGSizeMake(finalWidth, finalHeight) lineBreakMode:self.lineBreakMode];

int newLinesToPad = (finalHeight  - theStringSize.height) / fontSize.height;

for(int i = 0; i < newLinesToPad; i++)
{
    self.text = [self.text stringByAppendingString:@"\n "];
}
26
ответ дан 22 November 2019 в 19:59
поделиться

- SwiftUI

В SwiftUI, все представления обычно sizeToFit их содержание, но если Вы явно используете frame модификатор, можно использовать alignment параметр кадра:

Text("Text")
    .background(Color.red)
    .frame(width: 100, height: 200, alignment: .top)

Также, если Вы используете какой-либо вид Stack для расположения представлений, у всех них есть параметр, подобный кадру, названному alignment:

ZStack(alignment: .top) {
    Color.red
    Text("Text")
        .background(Color.red)
}
1
ответ дан 22 November 2019 в 19:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: