2013-02-18 4 views
4

Я пытаюсь сделать скриншот с помощью this код:Скриншот без строки состояния

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    self.view.backgroundColor = [UIColor lightGrayColor]; 
// Do any additional setup after loading the view, typically from a nib. 
} 
- (void)viewDidAppear:(BOOL)animated{ 
    UIImageWriteToSavedPhotosAlbum([self screenshot], self, @selector(image: didFinishSavingWithError:contextInfo:), nil); 
} 

- (UIImage*)screenshot 
{ 
// Create a graphics context with the target size 
// On iOS 4 and later, use UIGraphicsBeginImageContextWithOptions to take the scale into consideration 
// On iOS prior to 4, fall back to use UIGraphicsBeginImageContext 
CGSize imageSize = [[UIScreen mainScreen] bounds].size; 
if (NULL != UIGraphicsBeginImageContextWithOptions) 
    UIGraphicsBeginImageContextWithOptions(imageSize, NO, 0); 
else 
    UIGraphicsBeginImageContext(imageSize); 

CGContextRef context = UIGraphicsGetCurrentContext(); 

// Iterate over every window from back to front 
for (UIWindow *window in [[UIApplication sharedApplication] windows]) 
{ 
    if (![window respondsToSelector:@selector(screen)] || [window screen] == [UIScreen mainScreen]) 
    { 
     // -renderInContext: renders in the coordinate space of the layer, 
     // so we must first apply the layer's geometry to the graphics context 
     CGContextSaveGState(context); 
     // Center the context around the window's anchor point 
     CGContextTranslateCTM(context, [window center].x, [window center].y); 
     // Apply the window's transform about the anchor point 
     CGContextConcatCTM(context, [window transform]); 
     // Offset by the portion of the bounds left of and above the anchor point 
     CGContextTranslateCTM(context, 
           -[window bounds].size.width * [[window layer] anchorPoint].x, 
           -[window bounds].size.height * [[window layer] anchorPoint].y); 

     // Render the layer hierarchy to the current context 
     [[window layer] renderInContext:context]; 

     // Restore the context 
     CGContextRestoreGState(context); 
    } 
} 

// Retrieve the screenshot image 
UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 

UIGraphicsEndImageContext(); 

return image; 
} 

Но сохраненное изображение имеет строку состояния подбеленная из, в том числе сигнала, времени и батареи. Как я могу сделать снимок экрана, включая содержимое строки состояния? enter image description here

+0

http://stackoverflow.com/questions/1291110/capture-iphone-screen-with-status-bar-included –

+0

@NitinGohel UIGetScreenImage() - частный метод. –

+0

извините, я не понимаю, вы спрашиваете меня или говорите ...? –

ответ

1

Скрыть строку состояния перед приемом экрана следующим образом:

([[UIApplication sharedApplication] setStatusBarHidden: ДА];)

+0

Erm, это не то, чего хотел OP. Они хотели включить содержимое строки состояния в скриншот. – Piccolo

+1

@boj is right ... –

+1

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

1

(Испытано с прошивкой 7 и autolayout)

Я использую симулятор «сделайте снимок экрана» функция в сочетании с s ome условный код сборник. Раскомментировать в #define я могу быстро переключиться на «скриншот тека» режим для моего запуска экрана

Основного фокус в том, чтобы скрыть строку состояния, когда появляется view controller вашего открытия экрана, но с очень длинной анимацией, так у вас есть достаточно времени, чтобы нажать на скриншотовую команду в симуляторе, которая помещает скриншот прямо на ваш рабочий стол (или сделайте снимок экрана на устройстве, если вы этого предпочтете).

Используя приведенный ниже код, строка состояния сразу исчезает благодаря «UIStatusBarAnimationNone», но «скользящий экран» анимируется в течение очень длительного периода (5000,0 секунд в коде ниже). Поэтому, прежде чем бар начнет «двигаться» 1 пункт из 20 точек по вертикали, у вас есть примерно 5000/20 = 250 секунд, чтобы сделать снимок экрана (и некоторый кофе).

- (BOOL)prefersStatusBarHidden 
{ 
    return YES; 
} 

- (UIStatusBarAnimation)preferredStatusBarUpdateAnimation 
{ 
    #ifdef kTAKE_LAUNCHIMAGE_SCREENSHOT 
     return UIStatusBarAnimationNone; 
    #else 
     return UIStatusBarAnimationSlide; 
    #endif 
} 

- (void)removeStatusBarAnimated 
{ 
    #ifdef kTAKE_LAUNCHIMAGE_SCREENSHOT 
     [UIView animateWithDuration:5000.0 animations:^{ 
      [self setNeedsStatusBarAppearanceUpdate]; 
     }]; 
    #else 
     [UIView animateWithDuration:2.0 animations:^{ 
      [self setNeedsStatusBarAppearanceUpdate]; 
     }]; 
    #endif 
} 

для получения дополнительной информации о взяв под свой контроль в строке состояния в прошивкой 7, проверить мой ответ и код здесь:

https://stackoverflow.com/a/20594717/1869369

+0

Спасибо за редактирование Anindya, я не знаю, как с вами лично, поэтому я задам свой вопрос здесь: мне всегда не удается скопировать/вставить код из Xcode в переполнение стека - макет ужасен, однако я использую ' вставьте код кнопки ', а затем вставьте мой код. Что я делаю не так? –

0

Это решение, не скрывая строку состояния, просто использовать правильные границы и обратите внимание, что смещение y должно быть отрицательным, здесь «карта» представляет собой представление, которое заполняет экран под строкой состояния: (код написан внутри ViewController)

UIGraphicsBeginImageContextWithOptions(self.map.bounds.size, NO, [UIScreen mainScreen].scale); 
CGRect bounds = CGRectMake(0, -1*(self.view.bounds.size.height-self.map.bounds.size.height), self.map.bounds.size.width, self.map.bounds.size.height); 

BOOL success = [ self.view drawViewHierarchyInRect:bounds afterScreenUpdates:YES]; 

UIImage* image = UIGraphicsGetImageFromCurrentImageContext(); 

UIGraphicsEndImageContext(); 
Смежные вопросы