2016-10-30 3 views
1

Ich habe eine TVOS App mit einer UICollectionView. Innerhalb jeder Zelle gibt es eine UIImageView, die die adjustsImageWhenAncestorFocused auf true gesetzt hat, die mir den schönen Parallax-Effekt gibt, wenn die Zelle fokussiert ist.tvOS Parallax Effekt für Subviews von UIImageView in Zelle

Ich versuche, ein Banner oben auf dem Bild hinzuzufügen und es "haften" zu lassen, so dass die Parallaxe auch darauf angewendet wird.

Ich habe versucht, es als Subview hinzufügen, fügen Sie es als Sublayer, mit den Einschränkungen, aber nichts funktioniert. Wenn die Zelle fokussiert ist, hat das Bild den Effekt und das Banner bleibt ruhig.

+0

Sie können diesen Effekt auch programmgesteuert implementieren. –

+0

Ich würde gerne sehen, ob es eine kürzere, einfachere Lösung gibt. Die programmatische Umsetzung des Effekts wird mein letzter Ausweg sein. –

+0

@AndraTodorescu können Sie den Code Ihrer endgültigen Lösung veröffentlichen? Ich habe das gleiche Problem –

Antwort

3

Im Moment gibt es keine Möglichkeit, es dem UIImageView hinzuzufügen und gleichzeitig Apples Parallax-Effekt zu erhalten.

Sie müssen entweder den Effekt entweder programmatisch implementieren oder CGContext verwenden, um das Bild und ein Banner darüber zu zeichnen.

Ich mache das letztere, abgerundete Bilder in einer CollectionViewCell zu haben, während auch Apples Parallax-Effekt beibehalten wird. Das sieht ein bisschen wie folgt aus:

imageView.sd_setImage(with: URL(string:url), placeholderImage: UIImage(named: "placeholder"), options: SDWebImageOptions.avoidAutoSetImage) { [weak self] (image, error, cacheType, url) in 
    if let image = image { 
     if let strongself = self { 
      UIGraphicsBeginImageContext(strongself.imageView.frame.size) 
      if let ctx = UIGraphicsGetCurrentContext() { 
       let layer = CALayer() 
       layer.frame = CGRect(origin: CGPoint(x: 0, y: 0), size: strongself.imageView.frame.size) 
       layer.cornerRadius = 8 
       layer.masksToBounds = true 
       layer.contentsGravity = "resizeAspectFill" 
       layer.contents = image.cgImage 
       layer.render(in: ctx) 
       let processedImage = UIGraphicsGetImageFromCurrentImageContext() 
       UIGraphicsEndImageContext() 
       strongself.imageView.image = processedImage 
      } 
     } 
    } 
} 

Stellen Sie sicher, Sachen zu einem Hintergrund-Thread zu bewegen, wenn erforderlich, und dass eine Zelle durch die Zeit, ein Bild wiederverwendet worden sein könnte geladen. Fügen Sie also einen Check innerhalb des loadImage Completion Handlers für eine eindeutige ID hinzu.

+0

Vielen Dank! Es wirkt wie ein Zauber! Ich habe nur alles entfernt, was mit dem Einstellen des Eckenradius zu tun hat, ich habe meine Ansicht erstellt, den Rahmen festgelegt und dann folgendes hinzugefügt: layer.addSublayer (myCustomView.layer) –

Verwandte Themen