#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();