2016-04-25 10 views
0

Ich fand diesen Code, der perfekt funktioniert. Aber es verwendet die Größe der Scrollview. Ich möchte die meine Größe verwenden.iOS - Screenshot von UIScrollView sichtbaren Bereich mit Größe machen?

UIScrollView *contentScrollView;....//scrollview instance 

UIGraphicsBeginImageContextWithOptions(contentScrollView.bounds.size, 
             YES, 
             [UIScreen mainScreen].scale); 

//this is the key 
CGPoint offset=contentScrollView.contentOffset; 
CGContextTranslateCTM(UIGraphicsGetCurrentContext(), -offset.x, -offset.y); 

[contentScrollView.layer renderInContext:UIGraphicsGetCurrentContext()]; 
UIImage *visibleScrollViewImage = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

Wenn ich möchte, dass mein CGSize verwenden, was soll ich für CGContextTranslateCTM verwenden?

EDIT

Meine scrollView Größe 350 x 350. Ich hinzugefügt eine imageView als Subview. Der Benutzer kann die scrollView zoomen und scrollen.

Nachdem der Benutzer zoomen/scrollen kann, kann der Benutzer auf die Schaltfläche Speichern klicken. Diese Schaltfläche nimmt einen Screenshot meiner scrollView

Aus dem obigen Code. Meine Bildschirmgröße beträgt 350 x 350 (entspricht der Größe). Ich möchte einen Screenshot des scrollView mit der Größe 1040 x 1040 machen und den richtigen Zoom/Scroll-Bereich bekommen.

Ich weiß, dass ich die Größe ändern kann, indem Sie diese:

UIGraphicsBeginImageContextWithOptions(CGSizeMake(1040, 1040), YES, [UIScreen mainScreen].scale); 

Aber ich weiß nicht, wie der Offset-Teil an die neue Größe entsprechend zu ändern.

+0

Sie die CGSize zu UIGraphicsBeginImageContext (imgV.frame.size) passieren kann; –

+0

Ja, das weiß ich. Die Sache ist meine Scrollview wird gezoomt werden. Ich weiß nicht, wie man den Offset für das Ergebnisbild einstellt. Wenn Sie die Antwort wissen, bitte helfen Sie mir. Vielen Dank. – imstillalive

+0

@imstillalive Sie versuchen also nicht, die Größe des resultierenden Bildes zu ändern, sondern möchten nur einen benutzerdefinierten Offset angeben, um den Teil der Bildlaufansicht zu definieren, der gerendert werden soll? – Hamish

Antwort

0

Wenn Sie drawViewHierarchyInRect: verwenden, können Sie überspringen mit dem Inhalt Offset und Maßstab zu beginnen mit zu beginnen. Es wird einfach den sichtbaren Bereich der Bildlaufansicht in einem bestimmten Rechteck dargestellt.

Dadurch können Sie Ihre benutzerdefinierte Größe übergeben, und es wird entsprechend hoch oder runter skaliert.

Zum Beispiel:

CGSize size = (CGSize){1040, 1040}; 

UIGraphicsBeginImageContextWithOptions(size, NO, 0.0); 
[scrollView drawViewHierarchyInRect:(CGRect){CGPointZero, size} afterScreenUpdates:NO]; 
UIImage* img = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

Wenn Sie weiterhin die Schicht selbst machen möchten, dann müssen Sie nur noch den Kontext Skalierung entsprechend dem Verhältnis des neuen Größe auf die Größe der Scroll-Ansicht (wie renderInContext verwendet die Größe des Layers, nicht die Größe des Kontexts) und wird dann um den Offset des Inhalts versetzt.

Zum Beispiel:

CGSize size = (CGSize){1040, 1040}; 

UIGraphicsBeginImageContextWithOptions(size, NO, 0.0); 
CGContextRef ctx = UIGraphicsGetCurrentContext(); 

CGContextScaleCTM(ctx, size.width/scrollView.bounds.size.width, size.height/scrollView.bounds.size.height); 
CGContextTranslateCTM(ctx, -scrollView.contentOffset.x, -scrollView.contentOffset.y); 
[scrollView.layer renderInContext:ctx]; 

UIImage* img = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 
Verwandte Themen