Money jx es una app iOS que permite registrar los ingresos/gastos que se van teniendo con el día a día, permitiendo con esto, llevar un mejor control del dinero.
Descarga: App Store
Gratuito: Sí.
Money jx es una app iOS que permite registrar los ingresos/gastos que se van teniendo con el día a día, permitiendo con esto, llevar un mejor control del dinero.
Descarga: App Store
Gratuito: Sí.
El formato de imágenes de alta eficiencia HEIC, es un formato introducido por defecto en iOS 11, por lo que todas las imágenes ahora se guardan en este formato y pues tendremos un problema por el momento para abrir esta imagen en otros dispositivos o computadoras mientras obtenemos el codec necesario.
Aquí pongo la manera en que podemos cambiar para seguir guardando nuestras fotos en formato JPG y no en HEIC.
Entramos a:
Configuración -> Camara -> Formatos
y cambiamos a la opción “Más compatible” y con esto ya se guardarán las imágenes en formato JPG.
CocoaPods es un gestor de dependencia para los proyectos Swift y Objective-C Cocoa. Está construido con Ruby y se puede instalar con el Ruby predeterminado disponible en OS X.
Para instalarlo, hay que realizar lo siguiente:
macairjx:~ javoaxian$ sudo gem install cocoapods
Se pedirá nuestra contraseña y después de ingresarla, mostrará una salida similar:
macairjx:~ javoaxian$ sudo gem install cocoapods
Password:
Fetching: concurrent-ruby-1.0.5.gem (100%)
Successfully installed concurrent-ruby-1.0.5
Fetching: i18n-0.9.5.gem (100%)
Successfully installed i18n-0.9.5
Fetching: thread_safe-0.3.6.gem (100%)
Successfully installed thread_safe-0.3.6
Fetching: tzinfo-1.2.5.gem (100%)
Successfully installed tzinfo-1.2.5
Fetching: activesupport-4.2.10.gem (100%)
Successfully installed activesupport-4.2.10
Fetching: nap-1.1.0.gem (100%)
Successfully installed nap-1.1.0
Fetching: fuzzy_match-2.0.4.gem (100%)
Successfully installed fuzzy_match-2.0.4
Fetching: cocoapods-core-1.5.3.gem (100%)
Successfully installed cocoapods-core-1.5.3
Fetching: claide-1.0.2.gem (100%)
Successfully installed claide-1.0.2
Fetching: cocoapods-deintegrate-1.0.2.gem (100%)
Successfully installed cocoapods-deintegrate-1.0.2
Fetching: cocoapods-downloader-1.2.1.gem (100%)
Successfully installed cocoapods-downloader-1.2.1
Fetching: cocoapods-plugins-1.0.0.gem (100%)
Successfully installed cocoapods-plugins-1.0.0
Fetching: cocoapods-search-1.0.0.gem (100%)
Successfully installed cocoapods-search-1.0.0
Fetching: cocoapods-stats-1.0.0.gem (100%)
Successfully installed cocoapods-stats-1.0.0
Fetching: netrc-0.11.0.gem (100%)
Successfully installed netrc-0.11.0
Fetching: cocoapods-trunk-1.3.0.gem (100%)
Successfully installed cocoapods-trunk-1.3.0
Fetching: cocoapods-try-1.1.0.gem (100%)
Successfully installed cocoapods-try-1.1.0
Fetching: molinillo-0.6.5.gem (100%)
Successfully installed molinillo-0.6.5
Fetching: atomos-0.1.2.gem (100%)
Successfully installed atomos-0.1.2
Fetching: CFPropertyList-3.0.0.gem (100%)
Successfully installed CFPropertyList-3.0.0
Fetching: colored2-3.1.2.gem (100%)
Successfully installed colored2-3.1.2
Fetching: nanaimo-0.2.6.gem (100%)
Successfully installed nanaimo-0.2.6
Fetching: xcodeproj-1.5.9.gem (100%)
Successfully installed xcodeproj-1.5.9
Fetching: escape-0.0.4.gem (100%)
Successfully installed escape-0.0.4
Fetching: fourflusher-2.0.1.gem (100%)
Successfully installed fourflusher-2.0.1
Fetching: gh_inspector-1.1.3.gem (100%)
Successfully installed gh_inspector-1.1.3
Fetching: ruby-macho-1.2.0.gem (100%)
Successfully installed ruby-macho-1.2.0
Fetching: cocoapods-1.5.3.gem (100%)
Successfully installed cocoapods-1.5.3
Parsing documentation for concurrent-ruby-1.0.5
Installing ri documentation for concurrent-ruby-1.0.5
Parsing documentation for i18n-0.9.5
Installing ri documentation for i18n-0.9.5
Parsing documentation for thread_safe-0.3.6
Installing ri documentation for thread_safe-0.3.6
Parsing documentation for tzinfo-1.2.5
Installing ri documentation for tzinfo-1.2.5
Parsing documentation for activesupport-4.2.10
Installing ri documentation for activesupport-4.2.10
Parsing documentation for nap-1.1.0
Installing ri documentation for nap-1.1.0
Parsing documentation for fuzzy_match-2.0.4
Installing ri documentation for fuzzy_match-2.0.4
Parsing documentation for cocoapods-core-1.5.3
Installing ri documentation for cocoapods-core-1.5.3
Parsing documentation for claide-1.0.2
Installing ri documentation for claide-1.0.2
Parsing documentation for cocoapods-deintegrate-1.0.2
Installing ri documentation for cocoapods-deintegrate-1.0.2
Parsing documentation for cocoapods-downloader-1.2.1
Installing ri documentation for cocoapods-downloader-1.2.1
Parsing documentation for cocoapods-plugins-1.0.0
Installing ri documentation for cocoapods-plugins-1.0.0
Parsing documentation for cocoapods-search-1.0.0
Installing ri documentation for cocoapods-search-1.0.0
Parsing documentation for cocoapods-stats-1.0.0
Installing ri documentation for cocoapods-stats-1.0.0
Parsing documentation for netrc-0.11.0
Installing ri documentation for netrc-0.11.0
Parsing documentation for cocoapods-trunk-1.3.0
Installing ri documentation for cocoapods-trunk-1.3.0
Parsing documentation for cocoapods-try-1.1.0
Installing ri documentation for cocoapods-try-1.1.0
Parsing documentation for molinillo-0.6.5
Installing ri documentation for molinillo-0.6.5
Parsing documentation for atomos-0.1.2
Installing ri documentation for atomos-0.1.2
Parsing documentation for CFPropertyList-3.0.0
Installing ri documentation for CFPropertyList-3.0.0
Parsing documentation for colored2-3.1.2
Installing ri documentation for colored2-3.1.2
Parsing documentation for nanaimo-0.2.6
Installing ri documentation for nanaimo-0.2.6
Parsing documentation for xcodeproj-1.5.9
Installing ri documentation for xcodeproj-1.5.9
Parsing documentation for escape-0.0.4
Installing ri documentation for escape-0.0.4
Parsing documentation for fourflusher-2.0.1
Installing ri documentation for fourflusher-2.0.1
Parsing documentation for gh_inspector-1.1.3
Installing ri documentation for gh_inspector-1.1.3
Parsing documentation for ruby-macho-1.2.0
Installing ri documentation for ruby-macho-1.2.0
Parsing documentation for cocoapods-1.5.3
Installing ri documentation for cocoapods-1.5.3
Done installing documentation for concurrent-ruby, i18n, thread_safe, tzinfo, activesupport, nap, fuzzy_match, cocoapods-core, claide, cocoapods-deintegrate, cocoapods-downloader, cocoapods-plugins, cocoapods-search, cocoapods-stats, netrc, cocoapods-trunk, cocoapods-try, molinillo, atomos, CFPropertyList, colored2, nanaimo, xcodeproj, escape, fourflusher, gh_inspector, ruby-macho, cocoapods after 30 seconds
28 gems installed
Con esto queda instalado CocoaPods para poder usarlo en nuestros proyectos para iOS.
Telegram es un cliente de mensajería instantánea para móviles, similar a Whatsapp, Kik y otra más que existen.
Esta disponible para varias plataformas móviles y de escritorio en sus respectivas tiendas y repositorios. Además también tiene su versión web.
Aquí dejo el enlace para poder descargarla para diferentes sistemas operativos de escritorio.
Así como mostré la forma de declarar una constante en Swift, ahora le toca a las variables, para ello es muy similar a como se hizo en las constante, la única diferencia es que en lugar de poner la palabra:
let
Se deberá usar la palabra reservada:
var
Se indica la palabra reservada var, posteriormente se especifica el nombre de la variable y se asigna el valor que se le quiere poner, como a continuación se presenta:
var miVariable = "Esta es una variable"
De esta forma queda declarada una constante en Swift.
Para declarar constantes en Swift se realizan de la siguiente manera.
Se indica la palabra reservada:
let
Posteriormente se especifica el nombre de la constante y se asigna el valor que se le quiere poner, como a continuación se presenta:
let miConstante = "Esta es una constante"
De esta forma queda declarada una constante en Swift.
Para obtener el ancho y el alto de una pantalla en iOS con Objective-C es muy sencillo, bastará con ejecutar las siguientes línea según sea el caso:
Ancho (width):
[[UIScreen mainScreen] bounds].size.width;
Alto (height):
[[UIScreen mainScreen] bounds].size.height;
Cuando queremos publicar una app para iOS, el iTunes Connect nos solicita una serie de screenshots para poder publicarla. Yo regularmente tomaba las capturas de pantalla desde los dispositivos, pero conforme fueron apareciendo más de éstos, me fue imposible contar con ellos, por lo que me vi con la necesidad de saber cómo tomar los screenshots de otra forma, a lo cual me llevo a tomarlos desde el iOS Simulator.
Tomar una captura de pantalla desde el simulador es muy sencilla, sólo bastará correr nuestra app en el iOS Simulator, y con éste corriendo bastará con presionar:
Cmd + S
o ir a:
File -> Save Screen Shot
cualquiera de las 2 opciones creará una imagen en el Escritorio (Desktop).
Realizando un post que próximamente publicaré, me ví con la necesidad de limpiar la lista de proyectos recientes en Xcode. Por tal motivo, para llevar esto a cabo, realizaremos lo siguiente:
Abriremos Xcode.
Ahora iremos a:
File -> Open Recent -> Clear Menu
Cerramos Xcode y una vez que lo volvamos a abrir, veremos que se ha limpiado la lista de proyectos recientes.
Existen muchas formas de crear un Scroll en iOS, esta es una forma sencilla de hacerlo, sobre todo cuando tenemos un contenido fijo y requerimos que se contenido tenga scroll.
Pre requisitos:
En este ejemplo la pantalla está configurada para un iPhone de 3.5 pulgadas.
Lo que haremos será agregar un UIScrollView dentro del UIView que tenemos.
Ahora se creará un nuevo UIView el cual tendrá el contenido.
Este UIView será de Size Freedom:
y tendrá las medidas de 320 de width y 568 de height.
En el UIView que acabamos de crear, agregaremos algún elemento visual en él en la parte de abajo, en este caso será un UILabel.
Ahora se deberá crear un property del UIScrollView como del UIView y conectarlos para incrustar el UIView dentro del UIScrollView.
Para hacer la conexión puede ser como se mencionó en cualquiera de estos dos post:
Aquí use el del segundo post.
En este ejemplo el UIScrollView se llama scrollViewContenido y el UIView se llama viewContenido.
Abriremos el archivo ViewController.h y en su método:
– (void)viewDidLoad
vamos a agregar el siguiente código para asignar el contenido del UIView dentro del UIScrollView.
[self.scrollViewContenido setContentSize:CGSizeMake(self.viewContenido.frame.size.width, self.viewContenido.frame.size.height)];
[self.scrollViewContenido addSubview:self.viewContenido];
El método quedará de la siguiente manera:
- (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view from its nib. [self.scrollViewContenido setContentSize:CGSizeMake(self.viewContenido.frame.size.width, self.viewContenido.frame.size.height)]; [self.scrollViewContenido addSubview:self.viewContenido]; }
Si ejecutamos el ejemplo, podemos mover el scroll hacía abajo y veremos el UILabel que habíamos agregado.
En esta ocasión, se describirá como hacerlo de forma más sencilla y casi automática, en: Cómo conectar manualmente una property IBOutlet de un ViewController a un XIB o Storyboard en Objective-C se indica cómo hacerlo de forma manual.
Pre requisitos:
Este ejemplo cuenta con un archivo Storyboard llamado Main.storyboard y un controlador llamado ViewController.
Lo primero que haremos es abrir el archivo de la interfaz gráfica Main.storyboard y crear un UILabel.
Show the Assistant editor
SWRevealViewController es una biblioteca que nos permite crear un menús laterales ya sea del lado derecho o izquierdo de nuestra pantalla. He usado esta herramienta en algunas aplicaciones y la verdad es que me ha sido de bastante utilidad y sencilla de usar.
Pre requisitos:
Para comenzar descargaremos SWRevealViewController.
Descomprimimos el archivo que descargamos.
Ahora agregaremos SWRevealViewController a nuestro proyecto, para ello, haremos lo siguiente:
Presionamos con botón derecho sobre el nombre del proyecto y seleccionamos la opción:
Add Files to “Nombre del proyecto…
En este caso:
Add Files to “ProyectoXib”…
Nos aparecerá una pantalla donde deberemos buscar la ubicación del archivo que descomprimimos y que deseamos agregar a nuestro proyecto.
En mi caso está en la carpeta Downloads, dentro de esta carpeta se creó una sub carpeta llamada: SWRevealViewController-master y dentro de esta existe otra carpeta llamada SWRevealViewController, en la cual se encuentran los archivos necesarios.
Seleccionaremos dicha carpeta, marcamos las opción Copy ítems if needed y Create groups para posteriormente presionar Add.
Se creara una carpeta amarilla con el nombre de:
SWRevealViewController
Ahora abriremos el archivo AppDelegate.h y abajo de los import que tengamos:
#import <UIKit/UIKit.h>
Agregaremos la siguiente línea:
@class SWRevealViewController;
También se agregará la siguiente propiedad:
@property (strong, nonatomic) SWRevealViewController *viewController;
Ahora crearemos un controller que tendrá la información del menú, en mi caso lo llamaré MenuViewController.
Para esto, seleccionamos el proyecto con carpeta amarilla y presionamos el botón derecho para seleccionar la opción New File…
En este ejemplo sería:
ProyectoXib -> New File…
Aparecerá una pantalla donde seleccionamos la opción Cocoa Touch Class:
iOS -> Source Cocoa Touch Class
Presionamos Next y se mostrará una pantalla donde nos pide los datos del ViewController a crear, en este caso le pondré el nombre MenuViewController y marcar la opción Also create XIB file.
Presionamos Next y por último se nos preguntará donde crear los archivos, aquí sólo hay que presionar en Create.
Ahora que tenemos ya nuestro controller para el menú, abriremos el archivo MenuViewController.xib para agregar el contenido de nuestro menú. Aquí colocaré un botón, pero lo más común para este menú es utilizar un UITableViewController para realmente dar el efecto de menú, pero cada quién es libre de construir el menú como se desee.
En este ejemplo el MenuViewController.xib quedaría de la siguiente manera:
Abriremos el archivo AppDelegate.m e importaremos los siguientes archivos:
#import “SWRevealViewController.h”
#import “MenuViewController.h”
Agregaremos a:
@interface AppDelegate ()
lo siguiente:
<SWRevealViewControllerDelegate>
Para que quede de la siguiente manera:
@interface AppDelegate()<SWRevealViewControllerDelegate>
Ahora dentro del método:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
Debido a que este post se está basando en uno anterior, ya tenemos creado un objeto llamado: ViewControllerPrincipal el cual seguiremos usando.
Crearemos un navigationController para nuestra viewControllerPrincipal, esto es de la siguiente manera:
UINavigationController *navPrincipal = [[UINavigationController alloc] initWithRootViewController:viewPrincipal];
Crearemos un objeto del controlador del menú:
MenuViewController *menuView = [[MenuViewController alloc] initWithNibName:@"MenuViewController" bundle:nil];
Ahora crearemos el objeto del controlador SWRevealViewController que se encargará de dar el comportamiento del menú. Esto es de la siguiente manera:
SWRevealViewController *revealView = [[SWRevealViewController alloc] initWithRearViewController:menuView frontViewController:navPrincipal];
Al objeto revealView que creamos, le asignaremos el delegate para que pueda manejar los comportamientos.
revealView.delegate = self;
Lo siguiente será asignarle a nuestra propiedad viewController definida en nuestro AppDelegate.h, el objeto revealView.
self.viewController = revealView;
Lo último que faltará hacer en este archivo es asignar al rootViewController de nuestro window nuestro atributo viewController, esto se hace de la siguiente manera:
[self.window setRootViewController:self.viewController];
Todo este método se verá de la siguiente manera:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // Override point for customization after application launch. self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; ViewControllerPrincipal *viewPrincipal = [[ViewControllerPrincipal alloc] initWithNibName:@"ViewControllerPrincipal" bundle:nil]; MenuViewController *menuView = [[MenuViewController alloc] initWithNibName:@"MenuViewController" bundle:nil]; UINavigationController *navPrincipal = [[UINavigationController alloc] initWithRootViewController:viewPrincipal]; SWRevealViewController *revealView = [[SWRevealViewController alloc] initWithRearViewController:menuView frontViewController:viewPrincipal]; revealView.delegate = self; self.viewController = revealView; [self.window setRootViewController:self.viewController]; [self.window makeKeyAndVisible]; return YES; }
Abriremos el archivo ViewControllerPrincipal.h y haremos el siguiente import:
#import “SWRevealViewController.h”
Dentro del método:
– (void)viewDidLoad
Obtendremos el comportamiento del revealViewController de la siguiente manera:
SWRevealViewController *revealController = [self revealViewController];
Ya que tenemos creado este objeto, asignaremos los gestos para mover el menú de derecha a izquierdo o viceversa.
[revealController panGestureRecognizer];
[revealController tapGestureRecognizer];
Ahora crearemos un botón para el navigationBar que será el que se encargará de al ser presionado, mostrar u ocultar el menú.
UIBarButtonItem *revealButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Menú" style:UIBarButtonItemStylePlain target:revealController action:@selector(revealToggle:)];
por último asignamos el botón al navigationBar del lado izquierdo.
[self.navigationItem setLeftBarButtonItem:revealController];
Esto se verá así:
- (void)viewDidLoad { [super viewDidLoad]; [self setTitle:@"Principal"]; SWRevealViewController *revealController = [self revealViewController]; [revealController panGestureRecognizer]; [revealController tapGestureRecognizer]; UIBarButtonItem *revealButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Menú" style:UIBarButtonItemStylePlain target:revealController action:@selector(revealToggle:)]; [self.navigationItem setLeftBarButtonItem:revealButtonItem]; }
El menú se verá así:
En mi caso, a veces me gusta desactivar la opción de Auto Layout para usar la forma de diseño anterior de pantallas. Para hacer esto es muy sencillo aunque si manejan varios archivos .xib, será necesario hacerlo en cada uno de esos archivos.
Abriremos nuestro archivo xib o storyboard.
Ahora seleccionamos la opción de:
File inspector
Entre las secciones de File inspector encontraremos una sección llamada:
Interface Builder Document
ahí encontraremos la opción:
Use Auto Layout
la cual deberemos desmarcar y también se desmarcará la opción de:
Use Size Classes
Se nos preguntará lo siguiente:
Presionamos sobre:
Disable Size Classes
Y eso será todo
En esta ocasión, se describirá como hacerlo de forma manual y después crear la conexión, en otro post se indicará cómo hacerlo de una manera más sencilla y casi automática.
Pre requisitos:
Este ejemplo cuenta con un archivo XIB y un controlador llamados ViewController.
Lo primero que haremos es abrir el archivo ViewController.h y crear la siguiente propiedad:
@property (strong, nonatomic) IBOutlet UILabel *labelNombre;
Placeholers -> File’s Owner
Para todos aquellos que como yo, les sigue gustando trabajar con archivos XIB en lugar de Storyboard en la programación de apps en iOS. Aquí presento la forma en que pueden crear un proyecto usando archivos XIB en la vista y Objective-C como lenguaje de programación, debido a que con las nuevas versiones de Xcode, sólo podemos crear proyectos con Storyboard’s por default.
Abriremos Xcode:
Creamos un nuevo proyecto:
Create a new Xcode project
Ahora crearemos un Single View Application:
iOS -> Application -> Single View Application
Presionamos en Next y en la siguiente pantalla ingresamos los datos que deseamos para nuestro proyecto, donde deberemos verificar que este seleccionado en el lenguaje de programación Objective-C.
Language: Objective-C
Presionamos Next y la siguiente pantalla es para decidir en donde guardar el proyecto.
Ahora sólo presionamos en Create y quedará creado nuestro proyecto.
Lo siguiente por hacer es borrar los archivos:
ViewController.h
ViewController.m
Main.storyboard
Ahora que hemos borrado los archivos, crearemos un ViewController con su archivo XIB, para esto, seleccionamos el nombre del proyecto con la carpeta amarilla, en este ejemplo:
ProyectoXib -> ProyectoXib
presionamos con botón derecho y en el menú presionamos en:
File -> New -> File…
Aparecerá una pantalla donde seleccionamos la opción Cocoa Touch Class:
iOS -> Source Cocoa Touch Class
Presionamos Next y se mostrará una pantalla donde nos pide los datos del ViewController a crear, en este caso le pondré el nombre ViewControllerPrincipal y hay que cerciorarse en marcar la opción Also create XIB file.
Presionamos Next y por último se nos preguntará donde crear los archivos, aquí sólo hay que presionar en Create.
Ya que tenemos estos archivos creados, abriremos el archivo AppDelegate.m e importamos el controlador que acabamos de crear, que en este caso es ViewControllerPrincipal, y lo colocaremos como sigue:
#import “AppDelegate.h”
#import “ViewControllerPrincipal.h”
Ahora en el método:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // Override point for customization after application launch. return YES; }
Lo modificaremos para crear un objeto del controlador que creamos y lo asignaremos para que esta sea la pantalla que deberá de mostrarse.
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // Override point for customization after application launch. self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; ViewControllerPrincipal *viewPrincipal = [[ViewControllerPrincipal alloc] initWithNibName:@"ViewControllerPrincipal" bundle:nil]; [self.window setRootViewController:viewPrincipal]; [self.window makeKeyAndVisible]; return YES; }
Por último habrá que quitar dentro de la información general del proyecto que la interfaz principal sea Main. Esto se encuentra en:
Nombre del proyecto -> TARGETS -> Nombre del proyecto -> General -> Main interface
En el ejemplo que tenemos, sería:
ProyectoXib -> TARGETS -> ProyectoXib -> General -> Main interface
En Main Interface deberemos quitar Main para así permitir que la pantalla que creamos, sea la que se vea.
Bastará con borrarla y ahora si podemos ejecutar nuestro proyecto y ver la interfaz XIB que creamos.
Para detener un temporizador usando NSTimer y suponiendo que se usó el ejemplo propuesto en el post anterior, lo único que hay que hacer para detener el temporizador es lo siguiente:
[self.temporizador invalidate];
self.temporizador = nil;
Este es un ejemplo muy sencillo de cómo podemos hacer un contador usando NSTimer.
Lo que haremos es imprimir cada segundo un número consecutivo y lo primero a realizar es crear 2 propiedades de la siguiente manera:
@property (strong, nonatomic) NSTimer *temporizador;
@property (nonatomic) NSInteger contador;
Ahora en donde quiera lanzarse el comienzo del contador se deberá poner la siguiente instrucción:
self.temporizador = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(contar) userInfo:nil repeats:YES];
Por último se colocará un método llamado contar el cual irá imprimiendo el número consecutivo:
– (void)contar {
NSLog(@”Contando: %i”,self.contador);
self.contador++;
}
Eso es todo para empezar un temporizador.