Бавна актуализация на UILabel

Имам много странен проблем. Създавам мрежа от UIImageViews (понастоящем 16x16), всеки от които има UILabel върху себе си, който може да съдържа само един символ текст.

Разбрах го, така че когато щракнете върху него, този текст се променя и когато го пуснете, той се променя отново.

Тези UILabels се актуализират правилно и с правилната скорост.

Освен ако не актуализирам и UILabel за „статус“ (от който има само един) за моето приложение.

Този UILabel е значително по-голям от останалите и отново има само един екземпляр. Той се намира в горната част на екрана, а размерът му е широчината на екрана и 40 пиксела височината.

Сега, когато се опитвам да [label setText:] този етикет, той се представя добре и с подходяща скорост... ако щракна върху един от моите UIImageView в горната част на екрана. Въпреки това, когато отида да щракна върху един към долната част на екрана, отнема забележима разлика във времето.

Премахнах всяка итерация през списъци за извличане на UIImageViews. Той изчислява точката, където съм щракнал върху (x, y) цяло число координата, и след това избира подходящия UIImageView от масив чрез [[array objectAtIndex:x] objectAtIndex:y].

Стесних го до основния UILabel за „статус“ като причина за забавянето. Ако коментирам [label setText:] за този етикет и го заменя с разпечатка на NSLog, всичко върви с правилната скорост. И отново се движи с правилната скорост за UIImageViews към горната част на екрана.

Някой има ли предложения? Знам, че определено не итерирам през някакъв списък тук, така че съм малко объркан защо това забавяне се случва само към дъното на мрежата.

Благодаря за помощта!

Малко код:

-(void) touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
    CGPoint touchPoint = [[touches anyObject] locationInView: imageView];
    int x = 0;
    int y = 0;
    x = touchPoint.x/(screenWidth/width);
    y = (touchPoint.y - OFFSET)/(screenHeight/height);

    if ( [self outOfBoundsWithX:x Y:y] ) {

        if ( !isMoving && lastBead != nil ) {
            [self releaseBead:lastBead];
        }

        lastPoint = CGPointZero;
        lastBead = nil;
    }
    else {

        if ( !isMoving && lastBead != nil ) {
            NSLog(@"TEST");
            [self releaseBead:lastBead];
        }
        else {
            Bead * b = [self getBeadAtX:x Y:y];
            [self releaseBead:b];
        }

    }
}

- (void) releaseBead:(Bead*)b
{
    [b setGlyph:'c'];
    if (statusText == "Test") {
        [self setStatus:"Woohoo!"];
    else {
        [self setStatus:"Text"];
    }
}

- (void) setStatus:(char*)status
{
    label.text = [NSString stringWithCString:status encoding:NSASCIIStringEncoding];
    statusText = status;
}

person pantaryl    schedule 23.12.2011    source източник


Отговори (2)


Не съм съвсем сигурен. Единственият ред, който изглежда, че може да е проблем, е:

CGPoint touchPoint = [[touches anyObject] locationInView: imageView];

но това не обяснява останалото. Възможно ли е етикетът, причиняващ проблем, да извиква нещо във фонов режим? Може би ще преминете през него и ще видите какво се случва.

Освен това това може да звучи странно, но може да е проблем със симулатора. Опитайте да изтриете приложението от симулатора, след което го стартирайте отново.

person Kinetic Stack    schedule 23.12.2011
comment
Публикува някакъв код. Моля, кажете ми какво мислите. Bead е моят UIImageView, а етикетът е UILabel за основното приложение. Всяко мънисто съдържа малък UILabel, който съдържа един знак и се задава чрез функцията [bead setGlyph:]. - person pantaryl; 24.12.2011
comment
На симулатора работи добре... на устройството обаче не. Защо смятате, че проблемът може да е точката на допир? - person pantaryl; 24.12.2011

В крайна сметка реших този проблем с помощта на функцията drawAtPoint на NSString, която успя да премине през това без забавяне.

person pantaryl    schedule 25.12.2011