Ios 在运行时将多个UILabel添加到子视图中,并将它们与子视图中已存在的另一个标签的不同部分对齐

Ios 在运行时将多个UILabel添加到子视图中,并将它们与子视图中已存在的另一个标签的不同部分对齐,ios,objective-c,Ios,Objective C,我正在创建一个倒计时,希望在倒计时标签的适当位置显示倒计时时间以及单位名称(年、月、日、小时、分钟、秒)。我有一个UILabel对象,名为countdownLabel,我使用故事板将其放入UIView子视图中。倒计时标签的大小跨越了它所在子视图的宽度,并为我要添加的时间单位标签留出了一点空间 我有一个NSTimer,它调用updateLabel方法来更新countdownLabel - (void)updateLabel { NSString *counterStr; self

我正在创建一个倒计时,希望在倒计时标签的适当位置显示倒计时时间以及单位名称(年、月、日、小时、分钟、秒)。我有一个UILabel对象,名为countdownLabel,我使用故事板将其放入UIView子视图中。倒计时标签的大小跨越了它所在子视图的宽度,并为我要添加的时间单位标签留出了一点空间

我有一个NSTimer,它调用updateLabel方法来更新countdownLabel

- (void)updateLabel
{
    NSString *counterStr;

    self.dateComponents = [self.gregorianCalendar components:(NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit | NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit)
                                                    fromDate:[NSDate date]
                                                      toDate:self.countdownDate
                                                     options:0];

    int yearsRemaining   = [self.dateComponents year];
    int monthsRemaining  = [self.dateComponents month];
    int daysRemaining    = [self.dateComponents day];
    int hoursRemaining   = [self.dateComponents hour];
    int minutesReamining = [self.dateComponents minute];
    int secondsReamining = [self.dateComponents second];

    if ((yearsRemaining + monthsRemaining + hoursRemaining + minutesReamining + secondsReamining) > 0)
    {
        if (yearsRemaining == 0 && monthsRemaining == 0 && daysRemaining == 0 && hoursRemaining == 0)
            counterStr = [NSString stringWithFormat:@"%02d:%02d", minutesReamining, secondsReamining];

        else if (yearsRemaining == 0 && monthsRemaining == 0 && daysRemaining == 0)
            counterStr = [NSString stringWithFormat:@"%02d:%02d:%02d", hoursRemaining, minutesReamining, secondsReamining];

        else if (yearsRemaining == 0 && monthsRemaining == 0)
            counterStr = [NSString stringWithFormat:@"%02d:%02d:%02d:%02d", daysRemaining, hoursRemaining, minutesReamining, secondsReamining];

        else if (yearsRemaining == 0)
            counterStr = [NSString stringWithFormat:@"%02d:%02d:%02d:%02d:%02d", monthsRemaining, daysRemaining, hoursRemaining, minutesReamining, secondsReamining];

        else
            counterStr = [NSString stringWithFormat:@"%i:%02d:%02d:%02d:%02d:%02d", yearsRemaining, monthsRemaining, daysRemaining, hoursRemaining, minutesReamining, secondsReamining];

    }
    else
        counterStr = @"Countdown Ended!";

    self.countdownLabel.text = counterStr;

}
该应用程序的计时器功能运行良好。但是,我似乎不知道如何在运行时添加时间单位标签,以便只根据倒计时标签中显示的内容添加所需的标签,并使时间单位标签在倒计时标签下方的相应时间下对齐

我试着使用了一个,然后根据子字符串rect找出了时间单位标签的位置,但效果不好,也不好看


必须有一个更简单的方法来做到这一点,我只是学习目标C,所以任何帮助将不胜感激

每行使用2个独立的
UILabel
s会出现问题(除非使用固定宽度字体)。对于每个单位标签和每个值标签,最好使用
UILabel
。然后你可以将值标签对齐在它各自的单位标签下面。我不知道如何动态地这样做,并使所有东西都居中。我不想在故事板上添加6个时间标签和6个单元名称标签,因为我希望文本更大,这取决于还剩多少时间。我可以向子视图添加标签,如果只有一个,我可以将其居中。但是,当我添加第二个或更多标签时,我不知道如何使它们相对于彼此和子视图居中。您是否使用(或曾经使用)AutoLayout?您必须在Interface Builder中保留一个容器(以避免计算如何/在何处放置它),然后像您所说的那样,动态添加标签。自动布局将考虑间距和大小。多久调用一次
updateLabel
?唯一的问题是,如果每秒调用一次,则必须将代码重构为更新时间方法和设置标签方法。当前每秒调用一次updateLabel,但如果需要,我可以降低该值。我尝试过使用AutoLayout,我可以用它做简单的事情,但我不是很擅长。我是否需要创建12个UILabel(6个用于times,6个用于unit Label)来确定所有东西应该放在哪里?是的!这并不是最简单、最好的代码——布局代码从来都不是。或者,另一个选项是1
UILabel
表示单位和值,但强制在标签中换行,然后将其居中。然后,它会让它看起来像是在彼此之上。