cocoa-touch - poner - recuperar notificaciones iphone
¿Cómo puedo mostrar una pantalla de bienvenida durante más tiempo en un iPhone? (24)
¿Cómo puedo mostrar una pantalla de bienvenida durante un período de tiempo más largo que el tiempo predeterminado en un iPhone?
A pesar de que va en contra de las pautas, pero si aún desea hacer esto, un mejor enfoque en lugar de hilo de dormir será
//Extend the splash screen for 3 seconds.
[[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:3]];
de esta manera, el hilo principal no está bloqueado y si está escuchando notificaciones y otras cosas relacionadas con la red, aún continúa.
ACTUALIZAR PARA SWIFT:
NSRunLoop.currentRunLoop().runUntilDate(NSDate(timeIntervalSinceNow:3))
Aquí está mi código de pantalla de presentación simple. ''splashView'' es una salida para una vista que contiene un logotipo de imagen, UIActivityIndicator y una etiqueta "Cargar ..." (agregada a mi ''MainWIndow.xib'' en IB). El indicador de actividad está configurado para ''animar'' en IB, luego engendro un hilo separado para cargar los datos. Cuando termine, elimino el splashView y agrego mi vista de aplicación normal:
-(void)applicationDidFinishLaunching:(UIApplication *)application {
[window addSubview:splashView];
[NSThread detachNewThreadSelector:@selector(getInitialData:)
toTarget:self withObject:nil];
}
-(void)getInitialData:(id)obj {
[NSThread sleepForTimeInterval:3.0]; // simulate waiting for server response
[splashView removeFromSuperview];
[window addSubview:tabBarController.view];
}
En Xcode 6.3, puede mostrar el archivo de inicio screen.xib e incluso poner un indicador en él, primero se mostrará la pantalla de inicio predeterminada, se sustituirá por la punta para que el usuario no lo sepa y luego, si todo está cargado, se ocultará eso :-)
func showLaunchScreen() {
// show launchscreen
launchView = NSBundle.mainBundle().loadNibNamed("LaunchScreen", owner: self, options: nil)[0] as! UIView
launchView.frame = self.view.bounds;
self.view.addSubview(launchView)
// show indicator
launchScreenIndicator = UIActivityIndicatorView(frame: CGRectMake(0, 0, 50, 50)) as UIActivityIndicatorView
launchScreenIndicator.center = CGPointMake(self.view.center.x, self.view.center.y+100)
launchScreenIndicator.hidesWhenStopped = true
launchScreenIndicator.activityIndicatorViewStyle = UIActivityIndicatorViewStyle.Gray
launchView.addSubview(launchScreenIndicator)
self.view.addSubview(launchView)
launchScreenIndicator.startAnimating()
self.navigationController?.setNavigationBarHidden(self.navigationController?.navigationBarHidden == false, animated: true) //or animated: false
}
func removeLaunchScreen() {
println("remove launchscreen")
self.launchView.removeFromSuperview()
self.launchScreenIndicator.stopAnimating()
self.navigationController?.setNavigationBarHidden(false, animated: true)
}
Escribe una clase de pantalla de bienvenida real.
Aquí hay una pantalla de bienvenida de uso gratuito que publiqué recientemente en mi iPhone en el blog de Acción: http://iphoneinaction.manning.com/iphone_in_action/2009/03/creating-a-splash-screen-part-one.html
Estoy de acuerdo en que puede tener sentido tener una pantalla de inicio cuando se inicia una aplicación, especialmente si primero se necesita obtener algunos datos de un sitio web.
En lo que respecta a seguir a Apple HIG, eche un vistazo a la aplicación iDisk (MobileMe); hasta que registre los detalles de sus miembros, la aplicación muestra una uitableview Default.png típica antes de mostrar rápidamente una vista de pantalla completa.
Hay muchas opciones ya publicadas aquí, pero me encontré con cocoapod hoy que le permite mostrar los contenidos de su LaunchScreen.xib
como el controlador de vista inicial:
https://github.com/granoff/LaunchScreen (También vea esta publicación del blog del autor con más detalles de implementación ).
Esto parece una forma bastante directa de hacerlo, y mejor que la gran mayoría de las respuestas publicadas aquí. (Por supuesto, no fue posible hasta la introducción de los archivos LaunchScreen
en primer lugar.) Es posible mostrar un indicador de actividad (o cualquier otra cosa que desee) en la parte superior de la vista.
En cuanto a por qué querrías hacer esto, me sorprende que nadie haya mencionado que a menudo hay requisitos de editores y / o socios sobre este tipo de cosas. Es MUY común en juegos, pero también aplicaciones financiadas por publicidad.
También tenga en cuenta que esto actúa en contra de HIG, pero también lo hace esperando a cargar cualquier contenido después de que se inicia la aplicación. Recuerde que HIG son pautas y no requisitos.
Una nota final: es mi opinión personal, que cada vez que se implemente una pantalla inicial como esta, debería poder tocar para descartarla.
Hay una imagen predeterminada (default.png) que se muestra cuando inicias tu aplicación.
Entonces puede agregar un nuevo controlador de visualización que mostrará esa imagen predeterminada en la aplicación didFinishLoading.
Entonces, mediante esta lógica, muestra la imagen predeterminada durante un poco más de tiempo.
Haz que tu aplicación tarde más en cargarse.
Con toda seriedad, Paul Tomblin tiene razón en que, por lo general, esta no es una buena idea. Default.png es un mecanismo destinado a hacer que tu aplicación parezca cargar más rápido al mantener una captura de pantalla "vacía". Usarlo para una pantalla de bienvenida es un abuso menor, pero intencionalmente hacer que la pantalla de bienvenida aparezca durante más tiempo de lo necesario es casi enfermizo. (También degradará su experiencia de usuario. Recuerde, cada segundo que se visualiza la pantalla de bienvenida es un segundo que el usuario mira con impaciencia su logotipo, jurando que cambiarán al primer competidor decente que puedan encontrar).
Si estás tratando de cubrir algún tipo de carga secundaria, por ejemplo, si la interfaz se ha cargado y estás esperando obtener algunos datos de la red, entonces probablemente esté bien, y el enfoque de Ben Gottlieb está bien. Sugiero agregar una barra de progreso o una ruleta para dejar en claro al usuario que algo realmente está sucediendo.
He hecho esto de la siguiente manera:
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"LaunchScreen" bundle:nil];
UIViewController *viewController = [storyboard instantiateViewControllerWithIdentifier:@"splashView"];
self.window.rootViewController = viewController;
Nota: LaunchScreen es la historia de lanzamiento borad y splashView es el storyboardIdentifier
La forma más sencilla de hacerlo es crear un UIImageView cuya imagen es tu Default.png. En su método applicationDidFinishLaunching: agregue esa vista de imagen a su ventana y ocúltela cuando desee que desaparezca su pantalla de bienvenida.
La forma más simple es poner el hilo principal de su aplicación en modo de suspensión durante el período de tiempo deseado. Siempre que exista "Default.png" en el paquete de su aplicación, se mostrará mientras el hilo principal esté dormido:
-(void)applicationDidFinishLaunching:(UIApplication *)application {
[NSThread sleepForTimeInterval:5];
window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
[window setBackgroundColor:[UIColor yellowColor]];
[window makeKeyAndVisible];
}
Como ya saben, es una idea horriblemente mala, pero debería funcionar bien ...
Lea las Pautas de interfaz humana de Apple iPhone (HIG). La "pantalla de bienvenida" no se supone que sea para marcar o mostrar un logotipo, se supone que debe verse como la condición predeterminada de la aplicación, por lo que parece que se inicia rápidamente.
Hacer que permanezca allí durante más tiempo sería una violación del HIG.
Lo hice de manera bastante simple, al hacer que mi control raízViewController un modalViewController, cargando desde "Splash.nib" en una subclase de UIViewController llamé a "SplashViewController". La llamada exacta fue:
- (void) viewDidLoad {
SplashViewController *splashScreen = [[[SplashViewController alloc]
initWithNibName:@"SplashViewController" bundle:nil] autorelease];
[self presentModalViewController:splashScreen animated:NO];
//continue loading while MVC is over top...
Cuando inicias la aplicación, aparece directamente, como debería hacerlo una pantalla de bienvenida. Entonces, la punta SplashViewController es solo una pantalla completa UIImageView con un splash png, 320x480. Después de un NSTimer de 1 segundo (cualquier cosa más parecía interponerse), dispara timerFireMethod, un método personalizado que simplemente llama
[self dismissModalViewControllerAnimated:YES];
Entonces el VC modal simplemente se desliza hacia abajo y hacia afuera, dejando mi TableView superior. Lo bueno es que, mientras el MVC está activo, la tabla subyacente puede seguir cargándose debido a la naturaleza independiente de los controladores de vista modal. Por lo tanto, no creo que esto viole los HIG, y de hecho permite un lanzamiento más rápido. ¿Qué preferirías ver, una linda foto o una vista predeterminada vacía (ronquido)?
Lo que hice fue presentar un controlador modalview en la pantalla inicial y luego desaprovecharlo después de varios segundos
- (void)viewDidLoad
{
[super viewDidLoad];
....
saSplash = [storyboard instantiateViewControllerWithIdentifier:@"SASplashViewController"];
saSplash.modalPresentationStyle = UIModalPresentationFullScreen;
[self presentModalViewController: saSplash animated:NO];
}
-(void) dismissSASplash {
[saSplash dismissModalViewControllerAnimated:NO];
}
Necesitaba hacer esto para bloquear mostrando una vista de tabla hasta que los datos se cargaron a través de la red. Usé una variación de uno que encontré aquí:
http://michael.burford.net/2008/11/fading-defaultpng-when-iphone-app.html
En la interfaz de su delegado de la aplicación:
@interface AppDelegate : NSObject
{
UIImageView *splashView;
}
En la implementación:
@implementation AppDelegate
- (void)applicationDidFinishLaunching:(UIApplication *)application {
// After this line: [window addSubview:tabBarController.view];
splashView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 320, 480)];
splashView.image = [UIImage imageNamed:@"Default.png"];
[window addSubview:splashView];
[window bringSubviewToFront:splashView];
// Do your time consuming setup
[splashView removeFromSuperview];
[splashView release];
}
Asegúrate de tener un Default.png en los recursos
Para un tutorial elegante de la pantalla de bienvenida, consulte este http://adeem.me/blog/2009/06/22/creating-splash-screen-tutorial-for-iphone/
Sí, la forma más simple es (recuerde agregar su ''default.png'' a targets -> [yourProjectName]: inicie imágenes en ''xCode''):
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
[NSThread sleepForTimeInterval:3.0];
}
Según Apple HIG no deberías hacer eso. Pero si su aplicación necesita hacerlo para un propósito definido, puede hacer:
- importar <unistd.h> en su AppDelegate.m
Escriba la siguiente línea al principio del método "application didFinishLaunchingWithOptions:"
sleep(//your time in sec goes here//)
;
en su aplicaciónDelegate, hay un método llamado applicationDidFinishedLaunching que utiliza una función de suspensión. Pase un dígito en la función de reposo para el no. de segundos que desea mantener la pantalla.
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
[window makeKeyAndVisible];
[window addSubview:viewController.view];
sleep(5);
return YES;
}
Busqué mucho por esto y todos dieron su propio punto de vista complejo. No pude encontrar una manera simple que me dejara hacerlo.
KISS (Keep it simple and Smart :) Evité lo real como ofensivo.
simplemente haga que la ventana duerma por algunos segundos en el método applicationDidFininshLaunchings
ejemplo: dormir (3)
simplemente use sleep (tiempo en segundos); en su aplicación Método de inicio de ejecución terminado
Swift 2.0
Use la siguiente línea en didFinishLaunchingWithOptions: delegar método:
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
NSThread.sleepForTimeInterval(5.0)
return true
}
Pero yo recomiendo esto:
Coloque su imagen en una pantalla completa UIImageView como una subvista en la parte superior de su vista principal, cubriendo así su otra IU. Establezca un temporizador para eliminarlo después de algunos segundos (posiblemente con efectos) que ahora muestra su aplicación.
import UIKit
class ViewController: UIViewController
{
var splashScreen:UIImageView!
override func viewDidLoad()
{
super.viewDidLoad()
self.splashScreen = UIImageView(frame: self.view.frame)
self.splashScreen.image = UIImage(named: "Logo.png")
self.view.addSubview(self.splashScreen)
var removeSplashScreen = NSTimer.scheduledTimerWithTimeInterval(3.0, target: self, selector: "removeSplashImage", userInfo: nil, repeats: false)
}
func removeSplashImage()
{
self.splashScreen.removeFromSuperview()
}
}
Versión Swift:
Agregue esta línea en AppDelegate
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
NSThread.sleepForTimeInterval(2.0)//in seconds
return true
}
Inside your AppDelegate.m
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// Sleep is code to stop the slash screen for 5MoreSeconds
sleep(5);
[self initializeStoryBoardBasedOnScreenSize];
return YES;
}
// VKJ