2015-12-28 3 views
5

J'essaie de faire une application de dessin simple pour l'iPhone. Tout a bien fonctionné, jusqu'à ce que je tente la mise en page.La vue UIImage n'a pas de hauteur entière avec autolayout, la ligne tracée devient floue

Mon Imageview doit avoir un rapport d'aspect fixe de 3: 4, en raison du format d'image de l'iPhone. Je l'ai également épinglé au top guide et aux côtés.

Les lignes que je dessine sont déformées, et «s'écoulent »

flowing lines - screenshot

Plus je reçois à l'extrémité inférieure de la vue, plus la ligne est tirée vers le haut.

je l'ai lu quelque part que cela pourrait être causé par la vue de recevoir une hauteur qui n'est pas un entier après la mise en forme automatique, ce qui semble être vrai:

rect measurements and autolayout constraints

Je ne veux pas hardcode la rect pour chaque appareil iOS.

Comment puis-je "arrondir" ce 0.5 dans la taille?

Voici ma méthode de ligne de tirage:

func drawLineFrom(fromPoint: CGPoint, toPoint: CGPoint) { 

    // 1 
    UIGraphicsBeginImageContext(tempImageView.frame.size) 

    let context = UIGraphicsGetCurrentContext() 
    tempImageView.image?.drawInRect(CGRect(x: 0, y: 0, width: tempImageView.frame.size.width, height: tempImageView.frame.size.height)) 


    // 2 
    CGContextMoveToPoint(context, fromPoint.x, fromPoint.y) 
    CGContextAddLineToPoint(context, toPoint.x, toPoint.y) 

    // 3 
    CGContextSetLineCap(context, CGLineCap.Round) 
    CGContextSetLineWidth(context, brushWidth) 
    CGContextSetRGBStrokeColor(context, red, green, blue, 1.0) 
    CGContextSetBlendMode(context, CGBlendMode.Normal) 

    // 4b 
    CGContextStrokePath(context) 

    // 5 
    tempImageView.image = UIGraphicsGetImageFromCurrentImageContext() 
    tempImageView.alpha = opacity 
    UIGraphicsEndImageContext() 

} 

je l'ai déjà essayé de changer de antialiasing, mais cela n'a pas aidé, il vient de faire paraître horrible.

Répondre

3

Lors de la création d'un canevas avec UIGraphicsBeginImageContext, l'échelle par défaut est 1. Cela peut rendre l'image générée trop floue pour être affichée sur un écran rétine.

Vous devez donc spécifier l'échelle, soit spécifier l'échelle souhaitée, soit spécifier 0, pour laisser l'écran décider de l'échelle.

UIGraphicsBeginImageContextWithOptions(tempImageView.frame.size, false, 0.0)