Медленное обновление UILabel

У меня очень странная проблема. Я создаю сетку UIImageViews (в настоящее время 16x16), каждый из которых имеет UILabel, который может содержать только один символ текста.

У меня так при нажатии на нее этот текст меняется и при отпускании меняется снова.

Эти UILabels обновляются корректно и с нужной скоростью.

Если я также не обновлю UILabel «статуса» (из которого есть только один) для своего приложения.

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

Теперь, когда я пытаюсь [label setText:] эту метку, она работает нормально и с надлежащей скоростью... если я нажимаю на один из моих UIImageViews в верхней части экрана. Однако, когда я иду, чтобы щелкнуть по одному в нижней части экрана, это занимает заметную разницу во времени.

Я удалил любую итерацию по спискам для получения 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, а label — это UILabel для основного приложения. Каждый шарик содержит небольшой UILabel, который содержит один символ и устанавливается с помощью функции [bead setGlyph:]. - person pantaryl; 24.12.2011
comment
На симуляторе работает нормально, а на устройстве - нет. Почему вы думаете, что проблема может заключаться в сенсорной точке? - person pantaryl; 24.12.2011

В итоге эта проблема была решена с помощью функции NSString drawAtPoint, которой удалось пройти через это без задержек.

person pantaryl    schedule 25.12.2011