2015-05-29 2 views
4

Я натолкнулся на странный сценарий, который я просто не могу понять самостоятельно.Обновление UILabel Text сбрасывает раскадровку?

Я начал небольшой тестовый сценарий с почти пустым приложением iOS Single View и раскадровкой. На доске объявлений есть ярлык и один UIView, 10x10, только для того, чтобы представить проблему. Конечно, они имеют соответствующие IBOutlets назначены и подключены:

@property (nonatomic, weak) IBOutlet UILabel *label; 
@property (nonatomic, weak) IBOutlet UIView *dot; 

В (ничтожной) метод viewDidLoad я запустить таймер и добавить его в цикл выполнения подобного:

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    NSTimer * timer = [NSTimer timerWithTimeInterval:0.5 target:self selector:@selector(doSomething) userInfo:nil repeats:YES]; 
    [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes]; 
} 

В (пустоте) метод йоЗотеЬЫпда я делаю следующее:

-(void)doSomething { 
    // Lets move the dot to the right a bit further 
    _dot.center = CGPointMake(_dot.center.x+1, _dot.center.y); 

    // About every ten steps, update the label with the current 
    // X position, to better show the problem 
    CGFloat moduloResult = (float)((int)_dot.center.x % (int)10.0); 
    if(moduloResult <= 0) 
     _label.text = [NSString stringWithFormat:@"%f", _dot.center.x+1]; 
} 

Так в основном, я изменяю центр маленькой 10х10 точек ракурса каждый раз на 1, а каждый десятый раз, когда я обновить этикетку, чтобы показать текущее положение X. В этом отношении даже не имеет значения, что я обновляю текст ярлыка, просто важно, чтобы он изменился. И я меняю текст каждые 10 раз, чтобы лучше показать проблему здесь.

Если я запустил этот код, точка перемещается точно так же, как указано справа, но затем, когда я обновляю текст ярлыка, точка-точка сбрасывается и возвращается к исходной позиции. Так что обновление текста ярлыка сбрасывает мои другие взгляды на раскадровки, что меня совершенно смущает.

Может ли кто-нибудь воспроизвести это или даже объяснить?

Спасибо всем, заранее :)

Alex

+0

У вас есть ограничения AutoLayout, установленные в раскадровке? BTW love this '(int) 10.0' –

+0

Я не задавал никаких особых ограничений AutoLayout, поэтому у представления есть настройки по умолчанию. – green4367

+0

Возможно, у вас есть ограничения Auto Layout, вы не установили его фрейм, правильно? – Bannings

ответ

3

Я был в состоянии воспроизвести описанное поведение, вот почему это происходит:

  1. По умолчанию, положение элементов определяются автоматически сгенерированные ограничения AutoLayout
  2. При изменении позиции dot вы обновляете текущую рамку, не лежащие в основе ограничений
  3. Изменение текста UILabel возможно изменяет размер UILabel, поэтому его необходимо пересчитать. Здесь весь макет пересчитывается на основе ограничений, а значит, и реселлирующего кадра dot.

Для решения я предлагаю правильно указать ограничения AutoLayout и обновлять их вместо позиции напрямую.

2

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

Итак, поскольку я хотел, чтобы мой lite 10x10 dot-view перемещался по экрану (для практических целей я изменил свой код. Я пытаюсь объяснить это, отсутствие репутации в настоящее время не позволяет мне размещать соответствующие изображения.

Я сделал два пользовательских ограничения AutoLayout, указав, что он всегда сохраняет 120px слева от супервизора и 100px от вершины супервизора. Я также указал ограничение на фиксированную ширину и высоту каждого 10. Так как для действительное ограничение вам нужна комбинация x и y, а также высота и ширина (по крайней мере, насколько я понимаю).

    - 
        | 
        | Constraint *n* from top 
        | 

        |------| 
    Constraint  | view | 
    *n* from left | _dot | 
|--------------- |------| 

Затем я создал два IBOutlets для двух ограничений:

@property (weak, nonatomic) IBOutlet NSLayoutConstraint *c1X; 
@property (weak, nonatomic) IBOutlet NSLayoutConstraint *c1Y; 

я изменил (Недействительными) метод DoSomething к этому:

-(void)doSomething { 

    // Lets move the dot to the right a bit 
    // further by changing its Constraint 
    _c1X.constant++; 

    // About every ten steps, update the labe with the current 
    // X position, to better show the problem 
    CGFloat moduloResult = (float)((int)_dot.center.x % 10); 
    if(moduloResult <= 0) 
     _label.text = [NSString stringWithFormat:@"%f - %f - %f", _c1X.constant, _dot.center.x, _dot.center.y]; 
} 

Он работает, то изменение ограничения вместо фактического представления теперь перемещает представление по экрану. Если это лучшая практика, я не знаю. Если бы я не пробовал это для практических целей, следуя старинному учебнику, я бы не придумал это в первую очередь.

В надежде, что это может помочь в один прекрасный день. Любые комментарии или улучшения приветствуются :)

Alex

Смежные вопросы