2013-09-23 23 views
28

Tôi đang cố gắng triển khai ứng dụng chia sẻ với facebook. tôi đã sử dụng mã này để có những ảnh chụp màn hình:Tại sao ảnh chụp màn hình được tạo theo chương trình của tôi trông rất tệ trên iOS 7?

CGSize imageSize = CGSizeMake(self.view.bounds.size.width, self.view.bounds.size.height); 
UIGraphicsBeginImageContext(imageSize); 
[self.view.layer renderInContext:UIGraphicsGetCurrentContext()]; 
UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

Nó hoạt động tuyệt vời trên iOS 6, nhưng trong iOS 7 hình ảnh trông rất xấu. Tôi đã sử dụng câu trả lời này: iOS: what's the fastest, most performant way to make a screenshot programmatically? để cố khắc phục và điều đó đã giúp ích, ảnh chụp màn hình có vẻ không tốt. Màn hình có màu khác và một số đối tượng (như nhãn) không hiển thị trên hình ảnh được chụp. Bất kỳ trợ giúp nào?

---- Cập nhật ----

Tôi đã giải quyết được hầu hết các đối tượng, bằng cách thay đổi chúng để giữ lại thay vì yếu. Vấn đề chính của tôi vẫn là tableview của tôi, được hiển thị như một khối màu trắng lớn (Nó được cho là minh bạch, với các nhãn có chữ màu trắng, vì vậy tất cả chúng ta thấy là các ô màu trắng). Tôi đã cố gắng để xác định nền bảng như clearcolor, không giúp ..

---- Cập nhật cuối ---

Có câu trả lời tuyệt vời ở đây là không thực sự liên quan đến vấn đề của tôi .. Tôi muốn làm nó hoạt động trên thiết bị chạy với iOS7 nhưng không sử dụng SDK iOS7, vì phải mất nhiều công sức để chuyển SDK dự án vào thời điểm này, khi dự án gần xong.

Dù sao, tôi đã thêm sự yên mã mà cuối cùng giải quyết vấn đề của tôi:

Sự thay đổi này chỉ đơn giản là giải quyết vấn đề:

UIGraphicsBeginImageContextWithOptions(imageSize, NO , 0.0f); 

thay vì:

UIGraphicsBeginImageContext(imageSize); 

Trả lời

53

New API đã được thêm từ iOS 7, sẽ cung cấp cách chụp ảnh hiệu quả

  • snapshotViewAfterScreenUpdates: ám chỉ rằng nhìn vào một UIView với unmodifiable content

  • resizableSnapshotViewFromRect:afterScreenUpdates:withCapInsets: điều tương tự, nhưng với insets resizable

  • drawViewHierarchyInRect:afterScreenUpdates:: điều tương tự nếu bạn cần tất cả subviews được rút ra quá (như nhãn, các nút ...)

Bạn có thể sử dụng UIView trả lại cho bất kỳ hiệu ứng giao diện người dùng nào hoặc hiển thị hình ảnh như bạn đã làm nếu bạn cần xuất.

Tôi không biết làm thế nào tốt phương pháp mới này thực hiện VS một trong những bạn cung cấp (mặc dù tôi nhớ kỹ sư của Apple nói API mới này là hiệu quả hơn)

+0

Cảm ơn cho câu trả lời tốt đẹp. Ứng dụng của tôi hiện không tương thích với iOS 7 SDK. Tôi không có thời gian để thực hiện tất cả các thay đổi cần thiết và thay thế tất cả các lớp học không được chấp nhận. Tôi đang chạy ứng dụng của mình trên iOS7 với iOS 6 SDK. Vấn đề duy nhất tôi gặp trong tất cả ứng dụng là ảnh chụp màn hình này. Bạn có ý tưởng tôi nên làm gì không? – Yossi

+3

Tôi nghĩ rằng, 1 vấn đề với mã hiện tại của bạn có thể là không lấy quy mô (là thiết bị Retina?) Vào tài khoản. bạn có thể sử dụng 'UIGraphicsBeginImageContextWithOptions (imageSize, NO, 0.0)' (tham số cuối cùng là tỷ lệ của ảnh, thiết lập 0.0 đảm bảo chức năng chọn tỷ lệ màn hình của thiết bị chính) – Vinzzz

+0

Nhận xét của bạn gần nhất với giải pháp mà tôi đã sử dụng :) – Yossi

30

bạn có thể thử

- (UIImage *) screenshot { 
    UIGraphicsBeginImageContextWithOptions(self.view.bounds.size, NO, [UIScreen mainScreen].scale); 

    [self.view drawViewHierarchyInRect:self.view.bounds afterScreenUpdates:YES]; 

    UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
    return image; 
} 
+0

Giống như câu trả lời đầu tiên ở đây, đây là API iOS 7 mới. Ứng dụng của tôi không được hỗ trợ SDK iOS 7.Nó sẽ trong tương lai, nhưng bây giờ tôi cần một giải pháp :) – Yossi

+0

Làm cách nào để chụp ảnh màn hình ở bất kỳ chế độ xem iOS nào không chỉ bên trong ứng dụng của tôi? – Suge

+0

[self.view drawViewHierarchyInRect: self.view.bounds afterScreenUpdates: YES]; Sẽ làm cho toàn bộ màn hình nhấp nháy trong trường hợp của tôi trên iPhone 6. Và tôi phải sử dụng "[self.view drawViewHierarchyInRect: self.view.bounds afterScreenUpdates: NO];" thay thế. Tại sao vậy? – noooooooob

0

Make này chắc chắn rằng opaque được thiết lập để NO

+0

lý do là gì? – teradyl

+0

renderInContext là thành phần CPU thuần túy và hiển thị và nó xử lý các cờ mờ khác với công cụ tạo thành phần dựa trên OpenGL thông thường –

5

On iOS7 bạn có thể có trục trặc nếu bạn sử dụng

[view drawViewHierarchyInRect:view.bounds afterScreenUpdates:YES] 

trong khi hoạt ảnh liên tục. Đặt afterScreenUpdates = NO để loại bỏ các trục trặc.

+1

CẢM ƠN BẠN! Tôi đã phát điên trong 3 giờ đồng hồ với những trục trặc kỳ lạ bất cứ khi nào tôi chụp màn hình. Mã của tôi đã được gọi trong applicationDidEnterBackground: và nó đã khiến mọi hoạt ảnh đóng băng khi quay lại ứng dụng. – Dermot

6

trong iOS 8: đây là cách tôi đang làm để có được ảnh chụp màn hình

  1. chỉ cần thêm một UIImageView và Phương pháp để chụp màn hình trong tập tin .h

@property (yếu, nonatomic) IBOutlet UIImageView * imageView;

-(IBAction)takeSnapShot:(id)sender; 

2 thêm mã snip dành ảnh chụp màn hình và thiết lập trên UIImageView trong file .m

- (IBAction)takeSnapShot:(id)sender 
{ 
    UIGraphicsBeginImageContext(self.view.bounds.size); 
    [self.view.layer renderInContext:UIGraphicsGetCurrentContext()]; 
    UIImage *snapShotImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    imageView.image = snapShotImage; 
} 
  1. dưới đây là sản phẩm tôi đã nhận.

enter image description here

Các vấn đề liên quan