UITextView textColor自动变为与背景颜色相同

时间:2012-02-24 07:29:39

标签: iphone objective-c ios uitextview

我有一些代码可以创建一堆UITextViews并将它们放入另一个视图中。我将backgroundColor更改为交替颜色,并始终将textColor设置为黑色。它们都很好,除了它创建的最后一个。那个将textColor更改为文本视图的backgroundColor,然后停止更新它的UI。

如果我检查GDB中有问题的textColor的值,它是黑色的,即使它没有以这种方式显示。然后我以编程方式更改它(按下一个按钮,遍历所有创建的文本视图并将textColors全部设置为紫色),它们都会更改,除了最后一个,其背景颜色与文本颜色相同。同样,当我在GDB中检查textColor的值时,它被设置为紫色,即使这没有反映在屏幕上。

WTF?!?!?!有任何想法吗?这可能只是一个错误吗?

这是我用来添加UITextViews的代码。我之间有UILabel所以我可以得到居中的文本。

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 个答案:

答案 0 :(得分:1)

我用黑客修好了。我认为这是一个错误。

最初,我添加了一个UIView,其中填充了我想要在UITextView后面的背景颜色。

但是,我发现滚动UITextView也会将背景颜色更改为设置的颜色。 所以我在我的.h中添加了BOOL alreadyScrolled;,在[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];

}

即使你没有遇到这个问题,这也只是一个很酷的效果,因为它让用户知道有更多的文字,他们看不到,文本视图是可滚动的。

答案 1 :(得分:0)

如何设置numberOfSections?

也许试试:

for (int i = 0; i <= numberOfSections; i++) {