Переместить объекты в цикле в target-c?

Я пытаюсь переместить UIView в while-loop, Это не визуально перемещает UIView и я думаю, что это странно. Это только так в Obj-C, основываясь на моем опыте, почему это так в Obj-C? Он только визуально перемещает его, когда цикл завершен. Я не думаю, что для этого нужен код, это всего лишь одна строка, которая его перемещает.

РЕДАКТИРОВАТЬ

Код запрошен, поэтому здесь вы идете:

while (!CGPointEqualToPoint(finder.center, endPoint)) {
    [finder setCenter:CGPointMake(finder.center.x+10, finder.center.y)];
}

1 строка

Edot

ОК, это еще не все, это для поиска пути. Но эта линия движет UIView, поэтому я подумал, что это единственная соответствующая строка в моем вопросе.

3 ответа

Потому что пока вы обновляете свой кадр в цикле, экран не обновляется. IOS решает, когда обновлять экран самостоятельно. Вот почему существуют такие методы, как setNeedsDisplay но не существует такой метод, как display, Поэтому, если вы сделаете это в цикле while, экран будет обновлен только один раз. Увидеть NSRunLoop документация. https://developer.apple.com/library/mac/documentation/cocoa/reference/foundation/classes/NSRunLoop_Class/Reference/Reference.html

кажется, что ты хочешь сделать что-то подобное:

- (void)doSomeAnimation {
    [UIView animateWithDuration:0.5
                     animations:^{
                         self.someView.frame = CGRectMake(self.someView.frame.origin.x + 10,
                                                          self.someView.frame.origin.y,
                                                          self.someView.frame.size.width,
                                                          self.someView.frame.size.height);
                     } 
                     completion:^(BOOL finished){
                         if ([self needsDoAnimation]) // while condition analog 
                         { 
                             [self doSomeAnimation]; 
                         }
                     }];
}

- (BOOL)needsDoAnimation {
    BOOL needsAnimation = (self.someView.frame.origin.x < 320); // some conditions
    return needsAnimation;
}

посмотри, что такое Main Event Loop

https://developer.apple.com/library/ios/documentation/general/conceptual/Devpedia-CocoaApp/MainEventLoop.html

Я не уверен, что я действительно понимаю ваш вопрос. Если вы хотите переместить цикл в течение определенного периода времени и определенной репутации, почему бы вам не написать метод, который оживляет ваш UIView внутри UIAnimation блок и после анимации при входе в блог завершения просто вызовите метод снова.

- (void)animateMyView:(UIView *)view 
         withDuration:(float)duration 
            andRepeat:(int)repeat{

    [UIView animateWithDuration:duration animations:^{
        view.frame = CGRectMake(self.view.frame.origin.x,
                                  self.view.frame.origin.y + 20,
                                  self.view.frame.size.width,
                                  self.view.frame.size.height);
    } completion:^(BOOL finished) {

        if(repeat > 0){
           [self animateMyView:view 
                  withDuration:duration 
                     andRepeat:(repeat - 1)];
        }
    }];
}

Это будет перемещать ваш взгляд каждый раз 20,0 по оси Y.

Если вы хотите анимировать вид в новую позицию, вы можете использовать:

[UIView animateWithDuration:2.0 animations:^{
  view.frame = finalPosition;
} completion:^(BOOL finished){
  // code to run when animation is done
}

ссылка: https://developer.apple.com/library/ios/documentation/uikit/reference/uiview_class/UIView/UIView.html:

Другие вопросы по тегам