Image DrawRect et TableViewCell (scroll)

citrix6citrix6 Membre
juin 2013 modifié dans Dev. iOS, watchOS, tvOS #1

Bonjour


Donc j'arrive à  faire faire apparaitre des UILabel et des UIImageView Proprement (cela s'affiche bien plus besoin de scroller ).


 


Mais maintenant je voudrais faire apparaitre une UIView pour le fond de la cellule cela fonctionne parfaitement mais pour afficher UIView avec une image que je passe en property c'est plus dure 


je doit scroller pour avoir les images sinon je vois l'image en Placeholder (AFNetworking)


 


 


 


 


Ma CustomCell .h






@interface ;CustomCell : UITableViewCell


@property(nonatomic,strong) UILabel *titreLabelCustomCell;


@property(nonatomic,strong) UILabel *vueLabelCustomCell;


@property(nonatomic,strong) UILabel *dateLabelCustomCell;


@property(nonatomic,strong) BackgroundViewCell *backgroundViewCell;


@property(nonatomic,strong) ImageViewCell *imageViewCell;



 


 


Ma ImageViewCell .h




@interface ;ImageViewCell : UIView
@property ;(nonatomic,strong)UIImage *image;
@end

 

 


 


 


 


Ma ImageViewCell .m



- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        self.backgroundColor = [UIColor clearColor];
        self.image = [[UIImage alloc]init];
    }
    return self;
}
- (void)drawRect:(CGRect)rect
{
.... MON CODE 
 CGContextRef context = UIGraphicsGetCurrentContext();
UIImage* image3 = self.image;
shadow...
color...
... MON CODE
}


-(void) setImage:(UIImage *)image
{
    _image = image;
    [self setNeedsDisplay];
}

Donc j'ai essayé plein mais rien a faire je doit toujours scroller 


 


 


 


 

 


 


 


Mots clés:

Réponses

  • Je vois pas l'intérêt d'appeler drawRect: pour ce que tu veux faire. Pareil pour le setNeedsDisplay.


    Donc en gros ce que tu veux c'est télécharger en async des images mais pendant le téléchargement avec un placeholder.


     


    Si c'est ça, va sur le repo de AFNetworking. Il y a une méthode toute faite pour faire exactement ce que tu veux sans avoir à  te prendre la tête.


     


    Et puis ton code est bizarre ... Ouai non en fait tout est faux !


     


    Tu te compliques la vie. 


    Supprimes ta classe ImageViewCell (mal nommée soit dit en passant) et dans ton header de CustomClass écris :



    @property(nonatomic,strong) UIImageView *imageViewCell;

    Initialise avec la frame que tu veux et basta.


    Dans ton tableView tu accèdes à  ta property imageViewCell et tu appelles dessus la fameuse méthode de AF.


  • citrix6citrix6 Membre
    juin 2013 modifié #3

       Merci de ta réponse rapide ! :)    



    tableViewCntroller.m
    [cell.myImageCell setImageWithURL:[NSURL URLWithString:imgUrl] placeholderImage:[UIImage imageNamed:@noimage.jpg]];

    cela j'y arrive et ça fonctionne parfaitement mais je ne veux pas simplement afficher une imageView mais je veux la faire passer dans  


    drawRect pour y faire des modifications et sortir une View. 


    Donc je sais pas si cela est possible , je voudrais recharger mon UIView qui contient traite l'image donné en paramètre pour quelle s'affiche sans scroller...


  • Tu veux faire quoi comme traitement ?

  • AliGatorAliGator Membre, Modérateur
    Faut pas créer ton image à  chaque reuse, sinon tu vas t'embêter à  recalculer le dessin à  chaque reuse de cellule. Faut mieux créer les images potentiellement à  la demande, pourquoi pas, mais qu'une seule fois, et la mettre en cache (dans un NSCache par exemple ? Ou un petit cache maison)
  • citrix6citrix6 Membre
    juin 2013 modifié #6

    je t'envoi le traitement que je fait dessus :) Merci à  toi AliGator je vais me renseigner, si quelqu'un a un lien (pas la doc apple je suis pas excellent en anglais )



    #import "ImageViewCell.h"

    @implementation ImageViewCell

    - (id)initWithFrame:(CGRect)frame
    {
        self = [super initWithFrame:frame];
        if (self) {
            self.backgroundColor = [UIColor clearColor];
            self.image = [[UIImage alloc]init];
        }
        return self;
    }


    // Only override drawRect: if you perform custom drawing.
    // An empty implementation adversely affects performance during animation.
    - (void)drawRect:(CGRect)rect
    {
     //// General Declarations
     CGContextRef context = UIGraphicsGetCurrentContext();

     //// Color Declarations
     UIColor* shadowColorIn = [UIColor colorWithRed: 1 green: 1 blue: 1 alpha: 1];
     UIColor* lineColor = [UIColor colorWithRed: 0 green: 0 blue: 0 alpha: 0];
     UIColor* shadowColorOut = [UIColor colorWithRed: 0 green: 0 blue: 0 alpha: 1];

     //// Shadow Declarations
     UIColor* shadow = shadowColorOut;
     CGSize shadowOffset = CGSizeMake(0.1, -0.1);
     CGFloat shadowBlurRadius = 10;
     UIColor* shadowIn = shadowColorIn;
     CGSize shadowInOffset = CGSizeMake(0.1, -0.1);
     CGFloat shadowInBlurRadius = 10;

     //// Image Declarations
     UIImage* image3 = self.image;
     UIColor* image3Pattern = [UIColor colorWithPatternImage: image3];

     //// Frames
     CGRect frame = CGRectMake(0, 0, 320, 100);


     //// Rounded Rectangle Drawing
     CGRect roundedRectangleRect = CGRectMake(CGRectGetMinX(frame) + 4.5, CGRectGetMinY(frame) + 4.5, 120, 90);
     UIBezierPath* roundedRectanglePath = [UIBezierPath bezierPathWithRoundedRect: roundedRectangleRect cornerRadius: 15];
     CGContextSaveGState(context);
     CGContextSetShadowWithColor(context, shadowOffset, shadowBlurRadius, shadow.CGColor);
     CGContextSaveGState(context);
     CGContextSetPatternPhase(context, CGSizeMake(CGRectGetMinX(roundedRectangleRect), CGRectGetMinY(roundedRectangleRect)));
     [image3Pattern setFill];
     [roundedRectanglePath fill];
     CGContextRestoreGState(context);

     ////// Rounded Rectangle Inner Shadow
     CGRect roundedRectangleBorderRect = CGRectInset([roundedRectanglePath bounds], -shadowInBlurRadius, -shadowInBlurRadius);
     roundedRectangleBorderRect = CGRectOffset(roundedRectangleBorderRect, -shadowInOffset.width, -shadowInOffset.height);
     roundedRectangleBorderRect = CGRectInset(CGRectUnion(roundedRectangleBorderRect, [roundedRectanglePath bounds]), -1, -1);

     UIBezierPath* roundedRectangleNegativePath = [UIBezierPath bezierPathWithRect: roundedRectangleBorderRect];
     [roundedRectangleNegativePath appendPath: roundedRectanglePath];
     roundedRectangleNegativePath.usesEvenOddFillRule = YES;

     CGContextSaveGState(context);
     {
     CGFloat xOffset = shadowInOffset.width + round(roundedRectangleBorderRect.size.width);
     CGFloat yOffset = shadowInOffset.height;
     CGContextSetShadowWithColor(context,
     CGSizeMake(xOffset + copysign(0.1, xOffset), yOffset + copysign(0.1, yOffset)),
     shadowInBlurRadius,
     shadowIn.CGColor);

     [roundedRectanglePath addClip];
     CGAffineTransform transform = CGAffineTransformMakeTranslation(-round(roundedRectangleBorderRect.size.width), 0);
     [roundedRectangleNegativePath applyTransform: transform];
     [[UIColor grayColor] setFill];
     [roundedRectangleNegativePath fill];
     }
     CGContextRestoreGState(context);

     CGContextRestoreGState(context);

     [lineColor setStroke];
     roundedRectanglePath.lineWidth = 1;
     [roundedRectanglePath stroke];



    }
    -(void) setImage:(UIImage *)image
    {
        _image = image;
        [self setNeedsDisplay];
    }

    @end

    Voila


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