Хобрук: Ваш путь к мастерству в программировании

форсирование setNeedsDisplay

У меня есть процедура, которая рисует шестеренку с помощью CoreGraphics и drawRect. Я использовал кнопку для продвижения передач по этапам:

-(IBAction)advanceButtonPressed:(id)sender{

stage=stage+1;

if (stage==4) stage=0;

[self setNeedsDisplay];

}

Процедура рисования шестерни находится в drawRect, и зубья шестерни рисуются в новом положении в зависимости от значения stage, которое передается в drawRect. За четыре шага, по одному на нажатие кнопки, шестеренка поворачивается в новое положение (один сегмент по кругу).

Я изменил процедуру buttonPressed, чтобы она выполняла четыре этапа в цикле, поэтому мне нужно нажать кнопку только один раз, но это не работает:

-(IBAction)buttonPressed:(id)sender{

for (stage=0;stage<4;stage++){

    NSLog(@"%i",stage);

[self setNeedsDisplay];
}

}

Мой NSLog показывает, что этап проходит через свои четыре значения, как и в более ранней процедуре. Но setNeedsDisplay выполняется только один раз (как подтверждает трассировка NSLog в drawRect), поэтому шестерня отображается в своем конечном положении, а не на промежуточных этапах. Похоже, что setNeedsDisplay выполняется только после завершения процедуры кнопки, несмотря на то, что она находится внутри цикла.

Есть ли способ заставить его выполняться?


Ответы:


1

iPhone обновляет экран только 60 раз в секунду, независимо от того, как часто вы звоните setNeedsDisplay. Ваш цикл будет выполняться менее чем за 1/60 секунды. Вот почему вы увидите только последнее состояние.

Если вы хотите отобразить все четыре состояния одним нажатием кнопки, вы можете использовать таймер или performSelector: afterDelay для отображения всех четырех состояний. Немного сложнее, но вот.

06.01.2013
  • Частота обновления экрана не имеет значения; причина, по которой он на самом деле не будет отображаться до тех пор, пока метод не вернется, заключается в том, что именно так работает рисование в Cocoa и Cocoa Touch. Неважно, сколько времени занимает цикл; даже если вы потратите целую минуту, рисование все равно не произойдет, пока ваш код не вернет управление в цикл выполнения. developer.apple.com/library/ios/documentation/WindowsViews/ 07.01.2013

  • 2

    Вызов setNeedsDisplay просто помечает вид для перерисовки в следующем цикле рисования.

    Чтобы перерисовать его во время вашего метода, вы можете явно вызвать drawRect:

    06.01.2013
  • Вы не должны явно вызывать drawRect:. Документация не рекомендует этого делать, и даже если бы это было разрешено, делать это в таком случае было бы просто пустой тратой времени батареи пользователя. Правильным решением является то, что предложил skinnyTOD: используйте таймер, который показывает каждое состояние по очереди, с достаточным интервалом, чтобы дать системе возможность вызвать drawRect: и позволить пользователю увидеть изменение. 07.01.2013
  • Новые материалы

    Создание кнопочного меню с использованием HTML, CSS и JavaScript
    Вы будете создавать кнопочное меню, которое имеет состояние наведения, а также позволяет вам выбирать кнопку при нажатии на нее. Финальный проект можно увидеть в этом Codepen . Шаг 1..

    Внедрите OAuth в свои веб-приложения для повышения безопасности
    OAuth — это широко распространенный стандарт авторизации, который позволяет приложениям получать доступ к ресурсам от имени пользователя, не раскрывая его пароль. Это позволяет пользователям..

    Классы в JavaScript
    class является образцом java Script Object. Конструкция «class» позволяет определять классы на основе прототипов с чистым, красивым синтаксисом. // define class Human class Human {..

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

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

    Обзор: Машинное обучение: классификация
    Только что закончил третий курс курса 4 часть специализации по машинному обучению . Как и второй курс, он был посвящен низкоуровневой работе алгоритмов машинного обучения. Что касается..

    Разработка расширений Qlik Sense с qExt
    Использование современных инструментов веб-разработки для разработки крутых расширений Вы когда-нибудь хотели кнопку для установки переменной в приложении Qlik Sense? Когда-нибудь просили..