Как отобразить затемненный фон на основе UIWindow, например UIAlertView?

Вот моя проблема: я пытался отобразить UIWindow с подвидом, который отображает радиальный градиент. Я хотел поместить окно в UIWindowLevelAlert. Я все это понял раньше, и это работало, но теперь я пытаюсь воспроизвести это, теряя часы... Это код, который у меня есть (фон не градиент, потому что я хотел, чтобы он был простым, затем добавьте представление, которое действительно похоже на представление UIAlertView):

- (IBAction)buttonPressed {
UIWindow *backgroundWindow = [[UIWindow alloc]initWithFrame:[UIScreen mainScreen].bounds];
backgroundWindow.windowLevel = UIWindowLevelAlert;
UIView *backgroundView = [[UIView alloc]initWithFrame:[UIScreen mainScreen].bounds];
backgroundView.backgroundColor = [UIColor blackColor];
backgroundView.alpha = 0.5;
[backgroundWindow makeKeyAndVisible];
[backgroundWindow addSubview:backgroundView];
backgroundWindow.hidden = NO;

}


person Dario    schedule 08.08.2012    source источник
comment
Объявите UIWindow *backgroundWindow в вашем файле .h   -  person Ramaraj T    schedule 12.02.2013


Ответы (1)


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

Решение состоит в том, чтобы где-то сохранить ссылку на окно. Можете ли вы сохранить его как свойство в классе, в котором вы работаете?

person Tim Mahoney    schedule 08.08.2012
comment
UIWindow не выпускается автоматически до его добавления в качестве подпредставления - даже если выпуск был вызван, он не будет выпущен из-за его счетчика сохранения и того факта, что он не выпущен автоматически, во всяком случае, это утечка памяти. - person deleted_user; 09.08.2012
comment
UIWindow будет выпущен после последней строки (по крайней мере, в ARC). Место для поиска [UIApplication sharedApplication].windows. Созданное окно изначально будет там, но если вы посмотрите на этот массив после задержки, это окно исчезнет. - person Tim Mahoney; 09.08.2012
comment
но так как мы на этом, я подумал, что приложения iOS обычно имеют только один UIWindow, окно контейнера приложения - разве это не должно быть представлением? Я никогда не пытался (и не нуждался) показывать UIWindow в приложении для iOS. - person deleted_user; 09.08.2012
comment
Вы можете делать некоторые интересные вещи, используя несколько UIWindows. Например, UIAlertView использует отдельное окно. Это помогает держать вещи разделенными, но также может привести к некоторой путанице. - person Tim Mahoney; 09.08.2012
comment
да, это одна вещь, к которой мне пришлось привыкнуть при создании приложений OSX, — это постоянное использование NSWindowControllers вместо контроллеров представления. Но как только вы освоитесь, это будет легко. - person deleted_user; 09.08.2012