[Résolu] Slider et popover avec views et layers imbriqués

busterTheobusterTheo Membre
mai 2015 modifié dans API UIKit #1

Bonjour,


ce post est la suite de celui-ci.


 


J'ai réussi à  faire un popover qui suit un slider sans clignoter, avec des views et layers.


 


Le problème est que la subview se répète. C'est louche, non ?


 


La p'tite vidéo


 


Le code :



func showPopView() {
layerPopSlider.frame = CGRect(x: 0, y: 0, width: 250, height: 377)
layerPopSlider.backgroundColor = UIColor(red: 189/255, green: 139/255, blue: 143/255, alpha: 255/255).CGColor

layerPopSlider.cornerRadius = 12
layerPopSlider.borderColor = UIColor(red: 0.0, green: 0.0, blue: 0.0, alpha: 0.4).CGColor
layerPopSlider.borderWidth = 1
layerPopSlider.shadowColor = UIColor(red: 0.0, green: 0.0, blue: 0.0, alpha: 0.25).CGColor
layerPopSlider.shadowOpacity = 0.8
layerPopSlider.shadowOffset = CGSizeMake(2, 2)
layerPopSlider.shadowRadius = 3

viewPopSlider = UIView(frame: CGRectMake(roundSlider.frame.origin.x - 125, 320, 250, 400))
viewPopSlider.layer.addSublayer(layerPopSlider)

flecheViewSlider = FlecheView(frame: CGRectMake(120,376,20,21))
viewPopSlider.addSubview(flecheViewSlider)

self.view.addSubview(viewPopSlider)
}

Le dessin de la flèche :



import UIKit

class FlecheView: UIView {

override init(frame: CGRect) {
super.init(frame: frame)
self.backgroundColor = UIColor.clearColor()
}

required init(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}

override func drawRect(myRect: CGRect) {
let context = UIGraphicsGetCurrentContext()

CGContextSetFillColorWithColor(context, UIColor(red: 189/255, green: 139/255, blue: 143/255, alpha: 255/255).CGColor)
CGContextMoveToPoint(context, 0, 0)
CGContextAddLineToPoint(context, 10, 20)
CGContextAddLineToPoint(context, 20, 0)
CGContextAddLineToPoint(context, 0, 0)
CGContextFillPath(context)

CGContextSetLineWidth(context, 1.0)
CGContextSetStrokeColorWithColor(context, UIColor(red: 0.0, green: 0.0, blue: 0.0, alpha: 0.4).CGColor)
CGContextMoveToPoint(context, 0, 0)
CGContextAddLineToPoint(context, 10, 20)
CGContextAddLineToPoint(context, 20, 0)
CGContextStrokePath(context)
}
}

La subView de la flèche se répète. Je fais certainement une erreur de construction (view, layer, subBiew, drawrect)


 


Voilà , merci si quelqu'un a une idée


Réponses

  • Bonjour à  tous,


    après 31  visites de ce post, sans réponses, je me suis dit qu'il fallait que je fasse un gros effort intellectuel. 


     


    Après reflexion et de beaux rêves inspirant, j'ai donc décidé de n'inclure que des loyers dans ma view, et non pas un layer et un subView.


     


    Le côté positif, en dehors du fait que j'y suis parvenu, est surtout, que maintenant je sais dessiner, enfin, le mot est fort, dans une UIView avec Drawtect, et mettre tout ça dans une subView (ou une view, d'ailleurs), et aussi sur un layer. Pfff., c'est quand même bien laborieux, tout ça, pour un simple dessin. Enfin, bref, je donne le code ici pour ceux que ça intéresse. Encore merci aux collègues de bars pour leur contribution, sans laquelle je n'évoluerai pas.


     


    Voici la p'tite vidéo, pour la frime. :D


     


     


    Voici le code :


    Je ne met que la fonction principale, le reste étant plus haut et dans le post d'origine (voir lien plus haut)



    // Le popup du slider
    var viewPopSlider: UIView!
    var layerPopSlider: CALayer = CALayer()
    var flecheViewSlider: FlecheView!
    var layerFlechePopSlider: CAShapeLayer = CAShapeLayer()
    var layerFlecheContourPopSlider: CAShapeLayer = CAShapeLayer()



    func showPopView() {
    layerPopSlider.frame = CGRect(x: 0, y: 0, width: 250, height: 377)
    layerPopSlider.backgroundColor = UIColor(red: 189/255, green: 139/255, blue: 143/255, alpha: 255/255).CGColor

    layerPopSlider.cornerRadius = 12
    layerPopSlider.borderColor = UIColor(red: 0.0, green: 0.0, blue: 0.0, alpha: 0.4).CGColor
    layerPopSlider.borderWidth = 1
    layerPopSlider.shadowColor = UIColor(red: 0.0, green: 0.0, blue: 0.0, alpha: 0.25).CGColor
    layerPopSlider.shadowOpacity = 0.8
    layerPopSlider.shadowOffset = CGSizeMake(2, 2)
    layerPopSlider.shadowRadius = 3

    viewPopSlider = UIView(frame: CGRectMake(roundSlider.frame.origin.x - 125, 320, 250, 400))
    viewPopSlider.layer.addSublayer(layerPopSlider)

    layerFlechePopSlider.frame = CGRect(x: 120, y: 377, width: 20, height: 21)
    var pathFleche = CGPathCreateMutable()
    CGPathMoveToPoint(pathFleche, nil, 0, 0)
    CGPathAddLineToPoint(pathFleche, nil, 10, 20)
    CGPathAddLineToPoint(pathFleche, nil, 20, 0)
    CGPathAddLineToPoint(pathFleche, nil, 0, 0)
    layerFlechePopSlider.fillColor = UIColor(red: 189/255, green: 139/255, blue: 143/255, alpha: 255/255).CGColor

    layerFlechePopSlider.path = pathFleche
    viewPopSlider.layer.addSublayer(layerFlechePopSlider)

    layerFlecheContourPopSlider.frame = CGRect(x: 120, y: 376, width: 20, height: 21)
    var pathFlecheContour = CGPathCreateMutable()
    CGPathMoveToPoint(pathFlecheContour, nil, 0, 0)
    CGPathAddLineToPoint(pathFlecheContour, nil, 10, 20)
    CGPathAddLineToPoint(pathFlecheContour, nil, 20, 0)
    layerFlecheContourPopSlider.lineWidth = 1.0
    layerFlecheContourPopSlider.strokeColor = UIColor(red: 0.0, green: 0.0, blue: 0.0, alpha: 0.4).CGColor
    layerFlecheContourPopSlider.fillColor = UIColor(red: 189/255, green: 139/255, blue: 143/255, alpha: 255/255).CGColor

    layerFlecheContourPopSlider.path = pathFlecheContour
    viewPopSlider.layer.addSublayer(layerFlecheContourPopSlider)

    self.view.addSubview(viewPopSlider)
    }

    Merci à  tous, je met résolu.

  • colas_colas_ Membre

    Pour les dessins, je te conseille d'aller voir du côté de cette librairie : https://github.com/AliSoftware/OHPDFImage(créée par Aligator)


     


    En gros, tu donnes un pdf (crée avec un logiciel de dessin vectoriel ou du svg trouvé sur le web puis converti en pdf. D'ailleurs au passage, vas voir ce site... https://thenounproject.com)et lui il renvoie une UIView, à  la taille que tu veux et de la couleur que tu veux.


     


    Vraiment, je te conseille de dessiner comme ça.


  • Ah merci colas2,


    je vais voir ça...


Connectez-vous ou Inscrivez-vous pour répondre.