[Résolu] UIScrollView dans un masque dans un autre UIScrollView
busterTheo
Membre
Bonjour,
je n'ai pas de question à formuler, si ce n'est d'attendre un retour de critiques qui seront fort appréciées.
En attendant, mon truc, ça marche, et donc si quelqu'un de débutant comme moi est intéressé, voici un lien vidéo qui montre l'effet, et le code associé, plus bas. J'utilise, entre autres, une fonction de Ray Wenderlich (centerScrollViewContents), à laquelle j'ai rajouté un paramètre (un UIScrollView), pour pouvoir l'utiliser pour les deux UIScrollViews du projet, en testant la UIScrollView transmise.
import UIKit
class ViewController: UIViewController, UIScrollViewDelegate {
// Mark: - Les variables
// Pour la fonction centerScrollViewContents
var maView: UIImageView!
// La photo plein-écran
var myView: UIView!
var myScrollView:UIScrollView = UIScrollView()
var myImageView = UIImageView()
// La photo dans le masque
var myViewParentMask: UIView!
var myScrollTextureView:UIScrollView = UIScrollView()
var myTextureView = UIImageView()
// Le masque et son contour
var myMaskView = UIImageView()
var myMaskContourView = UIImageView()
// Toggle button masque
var boolHiddenParent = true
// MARK: - Actions
@IBAction func masqueButton(sender: AnyObject) {
if boolHiddenParent == true {
myViewParentMask.hidden = false
boolHiddenParent = false
} else {
myViewParentMask.hidden = true
boolHiddenParent = true
}
}
// Mark: - View Life Cycle
override func viewDidLoad() {
super.viewDidLoad()
var mainScreenSize : CGSize = UIScreen.mainScreen().bounds.size
// La vue englobante de la photo plein-écran
myView = UIView(frame: CGRectMake(0, 45, mainScreenSize.width, mainScreenSize.height))
self.view.addSubview(myView)
// La scrollView qui contient la imageView de la photo plein-écran
myScrollView.delegate = self
myScrollView.frame = CGRectMake(0, 0, mainScreenSize.width, mainScreenSize.height)
myView.addSubview(myScrollView)
// La imageView de la photo plein-écran
let myImage = UIImage(named: "sourire2.png")!
myImageView.image = myImage
myImageView.frame = CGRectMake(40 + (mainScreenSize.width - myImage.size.width)/2, -265 + (mainScreenSize.height - myImage.size.height)/2, myImage.size.width, myImage.size.height)
myScrollView.addSubview(myImageView)
myScrollView.userInteractionEnabled = true
myScrollView.minimumZoomScale = 2
myScrollView.maximumZoomScale = 8
myScrollView.zoomScale = 2
centerScrollViewContents(myScrollView)
// La photo masquée
let myTexture = UIImage(named: "texture.png")!
// La vue englobante de la photo dans le masque
myViewParentMask = UIView(frame: CGRectMake((mainScreenSize.width - myTexture.size.width)/2, (mainScreenSize.height - myTexture.size.height)/2, myTexture.size.width, myTexture.size.height))
self.view.addSubview(myViewParentMask)
myViewParentMask.hidden = true
// La scrollView qui contient la imageView de la photo à masquer
myScrollTextureView.delegate = self
myScrollTextureView.frame = CGRectMake(0, 0, myTexture.size.width, myTexture.size.height)
myViewParentMask.addSubview(myScrollTextureView)
// La imageView de la photo à masquer
myTextureView = UIImageView(frame: CGRectMake(0, 0, myTexture.size.width, myTexture.size.height))
myTextureView.image = myTexture
myScrollTextureView.addSubview(myTextureView)
myScrollTextureView.userInteractionEnabled = true
myScrollTextureView.minimumZoomScale = 1
myScrollTextureView.maximumZoomScale = 8
myScrollTextureView.zoomScale = 1
centerScrollViewContents(myScrollTextureView)
// La imageView du masque
myMaskView = UIImageView(frame: CGRectMake(0, 0, myTexture.size.width, myTexture.size.height))
// La photo du masque
myMaskView.image = UIImage(named: "masque1.png")
myViewParentMask.addSubview(myMaskView)
// Le masking
myViewParentMask.maskView = myMaskView
}
func centerScrollViewContents(scrollView: UIScrollView) {
var boundsSize = myScrollView.bounds.size
var contentsFrame = myImageView.frame
if scrollView == myScrollTextureView {
boundsSize = myScrollTextureView.bounds.size
contentsFrame = myTextureView.frame
}
if scrollView == myScrollView {
boundsSize = myScrollView.bounds.size
contentsFrame = myImageView.frame
}
if contentsFrame.size.width < boundsSize.width {
contentsFrame.origin.x = (boundsSize.width - contentsFrame.size.width) / 2.0
} else {
contentsFrame.origin.x = 0.0
}
if contentsFrame.size.height < boundsSize.height {
contentsFrame.origin.y = (boundsSize.height - contentsFrame.size.height) / 2.0
} else {
contentsFrame.origin.y = 0.0
}
if scrollView == myScrollTextureView {
myTextureView.frame = contentsFrame
}
if scrollView == myScrollView {
myImageView.frame = contentsFrame
}
}
func viewForZoomingInScrollView(scrollView: UIScrollView) -> UIView? {
if scrollView == myScrollTextureView {
maView = myTextureView
}
if scrollView == myScrollView {
maView = myImageView
}
return maView
}
func scrollViewDidZoom(scrollView: UIScrollView!) {
centerScrollViewContents(scrollView)
}
}
Mots clés:
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Je pense que le "scroll indicator" qui est parfois visible dans la vidéo gagnerait à être masqué.
Salut, t'as bien raison, j'achète.
J'ai cherché et trouvé (showsHorizontalScrollIndicator et showsVerticalScrollIndicator).
Merci pour ta super remarque.