2017-08-26 3 views
0

J'essaie de refléter ce qui se passe dans une vue sur un iPad sur un écran externe.capture UIScrollView dans UIImage en faisant défiler

func startMirroring() { 
    Timer.scheduledTimer(timeInterval:0.05, target: self, selector: #selector(tick), userInfo: nil, repeats: true) 
} 

func tick() { 
    let snapshot = someView.snapshotImage() 
    placeSomewhereElse(image: snapshot) 
} 

extension UIView { 
    func snapshotImage() -> UIImage? { 
     UIGraphicsBeginImageContextWithOptions(bounds.size, isOpaque, 0) 
     drawHierarchy(in: bounds, afterScreenUpdates: false) 
     let snapshotImage = UIGraphicsGetImageFromCurrentImageContext() 
     UIGraphicsEndImageContext() 
     return snapshotImage 
    } 
} 

Le problème

Scrolling dans un scrollview ne sera reflété dans l'instantané après le défilement est terminé. Je crois que le scrollview ne met pas vraiment à jour sa hiérarchie et sa mise en page pendant le défilement pour plus d'efficacité. Je dois cependant le capturer pendant le défilement.

J'ai essayé:

  • afterScreenUpdates: true

En scrollViewDidScroll:

  • setNeedsDisplay()
  • layoutIfNeeded()
  • setNeedsLayout()

Est-il possible de capturer les scrollviews pendant le défilement?

Modifier pour clarifier:

Hiérarchie:

  • UIWindow < - Je veux instantané ce
  • ---- UIView
  • -------- UIScrollView < - i N'avoir aucune connaissance de ceci

Répondre

2

Veuillez supprimer Timer et appelez la méthode startMirroring() en sc rollViewDidScroll, j'ai essayé votre scénario et obtenu une surveillance continue de scrollview,

func scrollViewDidScroll(_ scrollView: UIScrollView) { 
    print("scrolling") 
    startMirroring() 
} 

func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) { 
    print("scrolling ends") 
} 

func startMirroring() { 
    imgView.image = scrollView.snapshotImage() 
} 

extension UIView { 
    func snapshotImage() -> UIImage? { 
     UIGraphicsBeginImageContextWithOptions(bounds.size, isOpaque, 0) 
     drawHierarchy(in: bounds, afterScreenUpdates: false) 
     let snapshotImage = UIGraphicsGetImageFromCurrentImageContext() 
     UIGraphicsEndImageContext() 
     return snapshotImage 
    } 
} 

espère que ce sera utile

+0

Je veux saisir une vue entière que « pourrait » contenir scrollviews et pas seulement scrollviews spécifiques. Je peux l'utiliser pour manipuler différemment les scrollviews dans la hiérarchie de la vue, donc c'est déjà génial, mais idéalement, je veux le faire sans aucune connaissance de la hiérarchie des vues. – matteok

+0

S'il vous plaît garder une vue à la place de scrollView.snapshotImage() (ex: someView.snapshotImage()), son fonctionnement bien pour moi. –

+0

J'ai modifié mon message pour afficher une hiérarchie de vue potentielle – matteok