2017-08-26 4 views
0

Ich versuche zu spiegeln, was in einer Ansicht auf einem iPad auf einem externen Bildschirm passiert.Erfassen UIScrollView in UIImage beim Scrollen

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 
    } 
} 

Das Problem

Blätter in einem Scrollview wird nur im Snapshot reflektiert werden, nachdem Scrollen beendet ist. Ich glaube, der Scrollview aktualisiert seine Ansichtshierarchie und das Layout beim Scrollen auf Effizienz nicht wirklich. Ich muss es jedoch während des Scrollens erfassen.

Ich habe versucht:

  • afterScreenUpdates: true

In scrollViewDidScroll:

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

Ist es möglich Scrollviews während des Scrollens zu erfassen?

bearbeiten zu klären:

Hierarchie:

  • UIWindow < - ich snapshot will diese
  • ---- UIView
  • -------- UIScrollView < - i habe keine Kenntnis von diesem

Antwort

2

Bitte entfernen Sie Timer und rufen Sie startMirroring() -Methode in sc rollViewDidScroll, ich habe Ihr Szenario versucht und bekam die kontinuierliche Überwachung von 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 
    } 
} 

Hoffnung wird es hilfreich sein,

+0

ich eine ganze Ansicht aufnehmen möchten, dass scrollviews enthalten ‚könnte‘ und nicht nur bestimmte scrollviews. Ich kann dies verwenden, um scrollviews in der Ansichtshierarchie anders zu behandeln, also ist das bereits großartig, aber idealerweise möchte ich es tun, ohne irgendwelche Kenntnisse über die Ansichtshierarchie zu haben. – matteok

+0

Bitte behalten Sie jede Ansicht an der Stelle von scrollView.snapshotImage() (zB: someView.snapshotImage()), es funktioniert gut für mich. –

+0

Ich habe meinen Beitrag bearbeitet, um eine mögliche Ansichtshierarchie anzuzeigen – matteok

Verwandte Themen