Снимок внешнего экрана принудительно отображается на фоне кнопок

#ios #objective-c #ipad

#iOS #objective-c #iPad

Вопрос:

Мое приложение использует внешний экран, поэтому в моем приложении для iPad у меня есть небольшой контроллер, который работает как пульт дистанционного управления для внешнего экрана:

введите описание изображения здесь

Вы можете видеть сам RemoteControlViewController, и он имеет: 1) Кнопка отключения 2) Динамически добавляемая кнопка (они используются для изменения того, что отображается на внешнем экране). 3) Снимок внешнего экрана, чтобы пользователь знал, что в данный момент находится на внешнем экране.

При просмотре (моего RemoteControlViewController) я делаю снимок внешнего экрана и размещаю его в UIImageView Но при втором открытии фонов RemoteControl — buttons заполняется снимком внешнего экрана — КАК, как это предотвратить?!

 - (void)viewDidLoad
{
[super viewDidLoad];

//Add external display controls
[self addExternalDisplayControls];

//Display initial image
[self getExternalDisplaySnapshot];

//Add notification listeners to show/hide external display miniature responsivly
[self setUpScreenConnectionNotificationHandlers];
}

-(void)getExternalDisplaySnapshot
{
//Load screenshot
if ([[UIScreen screens] count] > 1)
{
    self.iboExternalDisplayNotFoundMessage.text = @"";
    self.iboScaledExternalDisplay.hidden=NO;
    self.iboExternalDisplayControlsPanel.hidden=NO;
    // Get the screen object that represents the external display.
    UIScreen *secondScreen = [[UIScreen screens] objectAtIndex:1];

    //Detect if retina
    if ([secondScreen respondsToSelector:@selector(scale)])
        UIGraphicsBeginImageContextWithOptions(secondScreen.bounds.size, NO, secondScreen.scale);
    else
        UIGraphicsBeginImageContext(secondScreen.bounds.size);
    //Get external windows instance from AppDelegate
    UIWindow   *externalWindow =[(AppDelegate*)[[UIApplication sharedApplication] delegate] secondWindow];
    //Render the screen
    [externalWindow.layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    //Set image to imageview
    self.iboScreenImage.image = image;
}
else
{
    self.iboExternalDisplayNotFoundMessage.text = @"No External Displays are connected.";
    self.iboScaledExternalDisplay.hidden=YES;
    self.iboExternalDisplayControlsPanel.hidden=YES;
}
}

- (void)setUpScreenConnectionNotificationHandlers
{
NSNotificationCenter *center = [NSNotificationCenter defaultCenter];

[center addObserver:self selector:@selector(handleScreenDidConnectNotification:)
               name:UIScreenDidConnectNotification object:nil];
[center addObserver:self selector:@selector(handleScreenDidDisconnectNotification:)
               name:UIScreenDidDisconnectNotification object:nil];
}

- (void)handleScreenDidConnectNotification:(NSNotification*)aNotification
{
//Just show the screen miniature
[self getExternalDisplaySnapshot];
}

- (void)handleScreenDidDisconnectNotification:(NSNotification*)aNotification
{
//Just show the screen miniature
[self getExternalDisplaySnapshot];
}
  

Проблема в том, что когда я отключаю контроллер и вызываю его снова — на фоне кнопок отображаются изображения снимка внешнего экрана! Почему? Как это предотвратить?

Это мой код для добавления кнопок:

 -(void)addExternalDisplayControls{
//Adds blood products button
CGRect rect = CGRectMake(10, 5, 100, 50);
UIButton *button = [self createButton:@"button" cords:rect buttonTag:0];
[self.iboExternalDisplayControlsPanel addSubview:button];
}

- (UIButton *)createButton:(NSString *)title cords:(CGRect)cords buttonTag:(int)tag {
UIButtonStyled *button = [UIButtonStyled new];
button.tag=tag;
button.contentHorizontalAlignment = UIControlContentHorizontalAlignmentCenter;
[button setTitle:title forState:UIControlStateNormal];
[button setStyleName:@"buttonSelection"];
//button.styleName = @"buttonSelection";
button.titleLabel.numberOfLines = 2;
[button addTarget:self action:@selector(p_buttonTapped:) forControlEvents:UIControlEventTouchUpInside];
button.frame = cords;
return button;
}
  

Ответ №1:

Я действительно не знаю, как это произошло и как это происходит, но в конце моей функции создания моментального снимка я добавил это:

 UIGraphicsEndImageContext();
  

И теперь все работает как по маслу.

Вот функция моментального снимка:

 // Get the screen object that represents the external display.
    UIScreen *secondScreen = [[UIScreen screens] objectAtIndex:1];

    //Detect if retina
    if ([secondScreen respondsToSelector:@selector(scale)])
        UIGraphicsBeginImageContextWithOptions(secondScreen.bounds.size, NO, secondScreen.scale);
    else
        UIGraphicsBeginImageContext(secondScreen.bounds.size);
    //Get external windows instance from AppDelegate
    UIWindow   *externalWindow =[(AppDelegate*)[[UIApplication sharedApplication] delegate] secondWindow];
    //Render the screen
    [externalWindow.layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    //Set image to imageview
    self.iboScreenImage.image = image;
    UIGraphicsEndImageContext();