UIImageView только отображается с перерывами - PullRequest
1 голос
/ 05 июля 2011

Я использую следующий код для отображения номера страницы, когда пользователь переключает страницы в моем приложении для iPad.Номер должен отображаться в красивой прозрачной серой панели (аналогично сообщению «Build Succeeded» в XCode).Тем не менее, изображение отображается только около 5% времени.(Я еще не добавил код для размещения числа на панели).Сообщение NSLog() появляется каждый раз.Я также установил точку останова и прошел через нее, и вызывается код UIImageView.К сожалению, я не могу войти в структуру, чтобы увидеть, что она делает.

Используемые переменные - все локальные или постоянные, поэтому я сомневаюсь, что это как-то связано с состоянием гонки.Кроме того, я могу подождать несколько минут между щелчками мыши и не получить изображение, или быстро нажать кнопку и получить несколько изображений в стопке (они прозрачные, поэтому легко заметить стопку).

Я попытался запустить setNeedsDisplay на self.view после addSubview: (хотя я вполне уверен, что addSubview: делает это), но это ничего не сделало.

Вызов displayPageNumber: напрямую, без потоков, нене заставлять это появляться последовательно либо.

Есть идеи?

#define PageDisplayTime        0.5
#define PageDisplayImageName   @"PageIndicator.png"
#define PageDisplayImage       [UIImage imageNamed: PageDisplayImageName]

...
[NSThread detachNewThreadSelector: @selector(displayPageNumber:) 
          toTarget: self withObject: index];
...

- (void) displayPageNumber: (NSNumber*) _pageIndex
{
  NSLog(@"Page Number: '%d'.", [_pageIndex integerValue] + 1);
  NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
  UIImageView* glassPaneView = [[UIImageView alloc] initWithImage: PageDisplayImage];
  glassPaneView.center = CGPointMake(300.0, 300.0);
  [self.view addSubview: glassPaneView];
  [NSThread sleepForTimeInterval: PageDisplayTime];
  [glassPaneView removeFromSuperview];
  [glassPaneView release];
  [pool release];
}

Ответы [ 2 ]

1 голос
/ 05 июля 2011

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

Вызов метода напрямую (таким образом, в основном потоке) не работает, потому что сон просто останавливает текущий поток, поэтому он не может ничего делать, включая рисование, до тех пор, пока вы не удалите представление, тем самым предотвращая его показ.

Вы должны реорганизовать метод в несколько методов, вызываемых в основном потоке. Первый просто добавляет подпредставление и устанавливает таймер, затем метод обработки таймера удаляет подпредставление.

0 голосов
/ 06 июля 2011

Я разобрался в проблеме.В случае, если другие столкнутся с этим, вот оно: пара addSubview: / removeFromSuperview с sleepForTimeInterval: между ними в основном бесполезны.Я знал, что сон заблокировал поток, но, очевидно, этот поток необходимо разблокировать, чтобы обновить представление.Я предположил (неправильно это выглядит), что обновление представления произошло в главном потоке.

Вот мое решение по замене: показать подпредставление в главном потоке и вызвать detachNewThreadSelector: с сообщением, которое спит в течение X секунд, а затемскрывает подпредставлениеИ я собираюсь добавить NSLock ed счетчик, который увеличивается на unhide и уменьшается в сообщении hider, но прячется, только когда счетчик уменьшен до 0. Это позволит повторным активациям увеличивать продолжительность.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...