lunes, 11 de enero de 2016

IBInspectable and IBDesignable iOs


Con @IBDesignable conseguimos en tiempo de diseño por un lado como se renderiza en el canvas y con @IBInspectable nos facilita modificar los valores en el inspector de atributos.

@IBDesignable
class FaceView: UIView
{
    @IBInspectable
    var lineWidth: CGFloat = 3 { didSet { setNeedsDisplay() } }
    @IBInspectable
    var color: UIColor = UIColor.blueColor() { didSet { setNeedsDisplay() } }
    @IBInspectable

    var scale: CGFloat = 0.90 { didSet { setNeedsDisplay() } }




Si descargas el proyecto "Happines L6.zip" veréis los resultados de estas anotaciones.

Lecture 6 Delegation & Gestures

Happiness Demo #2

Downloads







lunes, 30 de noviembre de 2015

VIPER Clean Architecture for iOs



VIPER es una aplicación de Clean Architecture para iOs.

VIPER es un acrónimo:

Pulsa este enlace para descargar el ejemplo inicial para aplicar VIPER primeros pasos.






VIEW: Muestra lo que se le dice que por el Presentator.

INTERACTOR: Contiene la lógica de negocio según lo especificado por un caso de uso.

PRESENTER: Contiene vista lógica para la preparación de contenidos para la pantalla (como se recibió del INTERACTOR).

ENTITY: Contiene objetos modelo básico utilizado por el INTERACTOR.

ROUTING: Contiene la lógica de navegación para describir qué pantalla se muestran y en qué orden.

martes, 16 de junio de 2015

Relación entre KVC y KVO (Key-Value Coding / Key-Value Object). Relationship between KVC and KVO (Key-Value Coding / Key-Value Object).

//
//  ViewController.m
//  DemoKVC
//  Relación entre KVC y KVO
//  Created by eduardo fulgencio on 16/6/15.
//  Copyright (c) 2015 eduardo fulgencio. All rights reserved.
//

// Al final de la página está la definición de la clase Deposito

#import "ViewController.h"
#import "Deposito.h"

@interface ViewController ()
// Declaramos dos objetos de tipo Deposito
@property (nonatomic, strong) Deposito *depositoAgua;
@property (nonatomic, strong) Deposito *depositoLeche;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    self.depositoAgua = [[Deposito alloc] init];
    self.depositoLeche = [[Deposito alloc] init];
    
}

-(void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:NO];
    
    // Asignamos nombre y litros a DepositoAgua
    self.depositoAgua.tipo = @"Agua";
    self.depositoAgua.litros = 10;
    // Asignamos nombre y litros a DepositoLeche
    self.depositoLeche.tipo = @"Leche";
    self.depositoLeche.litros = 5;
    
    // Utilización de KVC Key-Value Coding para generar el mismo valor anterior
    
    [self.depositoAgua setValue:@"Agua" forKey:@"tipo"];
    [self.depositoAgua setValue:[NSNumber numberWithInteger:10] forKey:@"litros"];

     // Relacion KVC y KVO ( Key-Value Observing )
    [self.depositoAgua addObserver:self forKeyPath:@"litros" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:nil];
  
    // Aumentamos en 1 litro los litros del deposito agua
    [self.depositoAgua setValue:[NSNumber numberWithInteger:11] forKey:@"litros"];
}


// En cuanto se produza un cambio en los litros del depósito de agua
// este método será llamado
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{
    
    if ([keyPath isEqualToString:@"litros"]) {
        NSLog(@"La cantidad de litros ha cambiado.");
        NSLog(@"%@ : ", change);
    }
    
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}


@end



// ESTA ES LA DEFINICION DE LA CLASE DEPOSITO

/* Clase deposito 

 #import <Foundation/Foundation.h>

 @interface Deposito : NSObject

 @property (nonatomic, strong) NSString *tipo;

 @property (nonatomic) NSUInteger litros;


 @end

 #import "Deposito.h"

 @implementation Deposito

 - (instancetype)init
 {
 self = [super init];
 if (self) {
 self.tipo = @"";
 self.litros = 0;
 }
 return self;
 }

 @end

 */

jueves, 11 de junio de 2015

CGContextSetShadowWithColor dibujar sobra a un Rectángulo. CGContextSetShadowWithColor to draw a rectangle.

/*
 En un UIView asignado 
 @interface TrianguloSombraView : UIView

*/

// En el método drawRect llamamos a dibujarRectanguloConSombra
- (void)drawRect:(CGRect)rect{
    [self dibujarRectanguloConSombra];
}


- (void) dibujarRectanguloConSombra{
  

  CGContextRef currentContext = UIGraphicsGetCurrentContext();
  CGContextSaveGState(currentContext);
    
  // Sombra a aplicar al rectángulo
  CGContextSetShadowWithColor(currentContext, CGSizeMake(15.0f, 15.0f), 12.0f,[[UIColor redColor] CGColor]);
  

  CGMutablePathRef mutablePathRef = CGPathCreateMutable();

  CGRect rectangulo = CGRectMake(55.0f, 60.0f, 150.0f,150.0f);
  
  // Añadidmos el rectángulo al path
  CGPathAddRect(mutablePathRef,  NULL, rectangulo);
  
  CGContextAddPath(currentContext, mutablePathRef);
  
  // Color de rellon para el rectángulo
  [[UIColor colorWithRed:0.20f green:0.60f  blue:0.80f  alpha:1.0f] setFill];
  
  CGContextDrawPath(currentContext,  kCGPathFill);
  
  CGPathRelease(mutablePathRef);
  
  CGContextRestoreGState(currentContext);
  
}

miércoles, 10 de junio de 2015

Creación de un Block Object para centralizar acciones. Creating a Block Object to centralize actions.

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController


- (void)viewDidLoad {
    
    [super viewDidLoad];
    // Llamada al bloque definido
    [self testMetodoMultiplicaPorMil];
    
}

- (void) testMetodoMultiplicaPorMil{
    
    NSString *testBloqueIntToString = multiplicaPorMil(135);
    NSLog(@" Resultado de 135 * 1000  %@", testBloqueIntToString);
    
}

NSString* (^multiplicaPorMil)(NSUInteger) = ^(NSUInteger parametroIn){
    
    NSString *result = [NSString stringWithFormat:@"%lu",(unsigned long)parametroIn * 1000];
    
    return result;
    
};




@end