UITextView textColor автоматически становится таким же, как цвет фона - PullRequest
0 голосов
/ 24 февраля 2012

У меня есть некоторый код, который создает группу UITextViews и переводит их в другое представление. Я изменяю backgroundColor на чередующиеся цвета и всегда устанавливаю textColor на черный. Все они работают хорошо, за исключением последнего, который он создает. Тот меняет свой textColor на тот, которым является backgroundColor текстового представления, а затем прекращает обновлять свой интерфейс.

Если я проверяю значение textColor проблемного в GDB, оно становится черным, даже если оно не отображается таким образом. Затем я изменяю его программно (нажимаю кнопку, перебираю все созданные текстовые представления и устанавливаю textColors все на фиолетовый цвет), они все меняются, за исключением последнего, цвет фона которого совпадает с цветом текста. Опять же, когда я проверяю в GDB значение textColor, оно устанавливается в фиолетовый цвет, хотя это не отражается на экране.

WTF?!?!?! Есть идеи? Может ли это быть просто ошибкой?

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

UIColor *evenColor = [self RGBColorR:90 G:95 B:90];
UIColor *oddColor = [self RGBColorR:70 G:75 B:70];

if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) {
    // Loop through adding the buttons.
    for (int i = 0; i < numberOfSections; i++) {
        // Add the label for the actual title of the level.
        UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, ((i * sectionHeight) - 1), self.levelLablesView.frame.size.width, 30)];
        [label setText:[levels objectAtIndex:i]];
        label.font = [UIFont fontWithName:@"Helvetica-Bold" size:24];
        [label setTextAlignment:UITextAlignmentCenter];
        [label setAutoresizingMask:UIViewAutoresizingFlexibleWidth];
        if (i % 2 == 0) {
            // It's an even number.
            [label setBackgroundColor:evenColor];
        } else {
            // Its an odd number.
            [label setBackgroundColor:oddColor];
        }
        [self.levelLablesView addSubview:label];
        [label release];

        // Add a scrolling UITextView for the other stuff.
        UITextView *textView = [[UITextView alloc] initWithFrame:CGRectMake(0, ((i * sectionHeight) + 24), self.levelLablesView.frame.size.width, (sectionHeight - 24))];
        [textView setText:[[[dictionary objectForKey:self.chosenCategory]
                            objectForKey:[levels objectAtIndex:i]]
                           objectForKey:@"Description"]];
        [textView setEditable:NO];
        [textView setAutoresizingMask:UIViewAutoresizingFlexibleWidth];
        if (i % 2 == 0) {
            // It's an even number.
            [textView setBackgroundColor:evenColor];
        } else {
            // Its an odd number.
            [textView setBackgroundColor:oddColor];
        }
        if (i == (numberOfSections-1)) {
            [textView setFrame:CGRectMake(0,((i * sectionHeight) + 24), self.levelLablesView.frame.size.width, ((sectionHeight - 24) + 2))];
        }
        textView.font = [UIFont systemFontOfSize:24];
        [textView setTextColor:[UIColor blackColor]];

        [self.levelLablesView addSubview:textView];
        [textView release];
    }

}

Редактировать: Если кому-то интересно, я не устанавливаю цвет текста где-либо еще в программе случайно. Я нашел «textColor», и единственные совпадения, которые я получил, не имеют значения.

Ответы [ 2 ]

1 голос
/ 06 апреля 2012

Я исправил это с помощью хаков. Я думаю, что это ошибка.

Первоначально я добавил UIView, заполненный цветом фона, который я хотел за UITextView.

Однако я обнаружил, что прокрутка UITextView также меняет цвет фона на цвет, который установлен. Поэтому я добавил BOOL alreadyScrolled; в свой .h, добавил вызов [self scrollLevelLabelsViews] в viewDidAppear: (который сначала проверяет, что он не alreadyScrolled, потому что viewDidAppear: может вызываться несколько раз, если модальное представление представлен, например), и добавил следующий метод для прокрутки представлений. У меня также была проблема с последним текстовым представлением, которое не отображало текст правильно, но пренебрегало его созданием, пока метод alreadyScrolled после того, как представление появилось, не отобразит его нормально.

Ниже приведены методы, которые я создал для прокрутки текстовых представлений вниз и назад. Просто измените levelLablesView на представление, которое содержит ваши textViews, добавьте вызовы методов и переменные, которые я объяснил в предыдущем абзаце, и это должно работать для вас.

- (void)scrollLevelLabelsViewsBackUp{

    // Scroll all UITextViews in levelLabelsView to the top.
    for (UIView *view in self.levelLablesView.subviews) {
        if ([view isKindOfClass:[UITextView class]]) {
            UITextView *textView = (UITextView *)view;
            [textView scrollRangeToVisible:NSMakeRange(1, 1)];
        }
    }
    alreadyScrolled = YES;

}

- (void)scrollLevelLabelsViews{

   /* Setup last UITextView that displays weirdly if it is set up with the rest of them.
    * ...
    */

    // Scroll all UITextViews in levelLabelsView to the bottom.
    for (UIView *view in self.levelLablesView.subviews) {
        if ([view isKindOfClass:[UITextView class]]) {
            UITextView *textView = (UITextView *)view;
            [textView scrollRangeToVisible:NSMakeRange([[textView text] length] - 2, 1)];
        }
    }

    // In .8 seconds, scroll them back up.
    [NSTimer scheduledTimerWithTimeInterval:.8 target:self selector:@selector(scrollLevelLabelsViewsBackUp) userInfo:nil repeats:NO];

}

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

0 голосов
/ 24 февраля 2012

Как настраивается numberOfSections?

Может быть, попробовать:

for (int i = 0; i <= numberOfSections; i++) {
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...