В объективе c Xcode Изменение UIImages одним нажатием кнопки - PullRequest
0 голосов
/ 09 марта 2012

Когда я нажимаю кнопку, я хочу, чтобы первое изображение отображалось в UIImageView, оставалось на короткое время, а затем показывалось следующее изображение.Только второе изображение показывает через некоторое время.Первое изображение никогда не появляется.

//  TestProjectViewController.m
//  Created by Jack Handy on 3/8/12.

#import "TestProjectViewController.h"

@implementation TestProjectViewController

@synthesize View1= _view1;
@synthesize yellowColor = _yellowColor;
@synthesize greenColor = _greenColor;


    - (IBAction)button:(id)sender {

        _greenColor = [UIImage imageNamed: @"green.png"];
             _view1.image = _greenColor;

    [NSThread sleepForTimeInterval:2];

        _yellowColor = [UIImage imageNamed: @"yellow.png"];
             _view1.image = _yellowColor;

}
@end

Ответы [ 2 ]

0 голосов
/ 09 марта 2012

Проблема в том, что вы заменяете образ до того, как ОС получит возможность рисовать.Поскольку все эти три операции: изменение изображения, ожидание в течение 2 секунд, изменение изображения снова) происходят до того, как ваше действие кнопки вернется, вы препятствуете выполнению основного потока и, следовательно, обновлению экрана.Итак, происходит то, что через 2 секунды экран рисует изображение, которое вы недавно поместили на его место.

Вам нужно, чтобы ожидание происходило отдельно.Есть три типичных способа сделать это, каждый из которых имеет свои преимущества: - отправить себе отложенное сообщение, используя -performSelector:withObject:afterDelay: - порождать другой поток или использовать очередь отправки, чтобы запустить поток в фоновом режиме для сна, а затем отправить сообщениеоттуда к основному потоку - или используйте таймер.

Я бы предложил использовать таймер, потому что его легко отменить, если вам нужно сделать что-то вроде перехода на другой экран.

NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:2.0 target: self selector: @selector(updateColor:) userInfo: nil repeats: NO];
// store the timer somewhere, so that you can cancel it with
// [timer invalidate];
// later as necessary

, а затем позже:

-(void)updateColor:(NSTimer*)timer
{
    _yellowColor = [UIImage imageNamed: @"yellow.png"];
    _view1.image = _yellowColor;
}

Если вы хотите, чтобы цвета чередовались, вы можете передать YES для значения repeat: значение в коде создания, а затем изменить -updateColor: на переменный ... илиперейти к следующему цвету.

0 голосов
/ 09 марта 2012

U можете попробовать и разместить

 _yellowColor = [UIImage imageNamed: @"yellow.png"];
             _view1.image = _yellowColor;

и вместо

[NSThread sleepForTimeInterval:2];

назови это

[self performSelector:@selector(changeColor) withObject:nil afterDelay:2];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...