2012-02-26 16 views
5

¿Es posible en iOS que una vista siempre flote sobre todas las demás vistas? Pregunto esto porque lo que me gustaría lograr es una vista que flota sobre un ViewController, y luego se desliza un Controlador de Vista Modal, mientras esa vista particular todavía está flotando sobre ese Controlador de Vista Modal (espero que entiendas lo que estoy tratando de decir)Vista flotante sobre todos los ViewControllers

Respuesta

8

Hay. Puede agregar su vista al window principal y llevarlo al frente cuando sea necesario.

En el siguiente código se supone que _viewConroller y _anotherView son propiedades sólidas de appDelegate: la configuración podría ser diferente.

Este código agregaría un pequeño cuadrado azul en la esquina superior izquierda de la pantalla.

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 

    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 

    _viewController = [[ViewController alloc] initWithNibName:@"ViewController" bundle:nil]; 
    _anotherView = [[UIView alloc] initWithFrame: CGRectMake (0.0,0.0,20.0,20.0)]; 
    [anotherView setBackgroundColor: [UIColor blueColor]];  

    self.window.rootViewController = self.viewController; 
    [self.window makeKeyAndVisible]; 

    [self.window addSubView: _anotherView]; 
    [self.window bringSubViewToFront: _anotherView]; //not really needed here but it doesn't do any harm 

    return YES; 
} 
+0

Ok, ¿esto también funcionará cuando esté usando el storyboard? – thvanarkel

+0

Creo que debería, pero no lo probé. Es posible que tengas que crear un método para traer _otras ViewToFront y llamarla después de que ViewControllers cambie de lugar. –

3

Usted puede hacer lo siguiente si está utilizando guión gráfico y el diseño automático (inspirado en la primera respuesta)

UIStoryboard *sb = [UIStoryboard storyboardWithName:@"Main" bundle:nil]; 
UIViewController *_vc = [sb instantiateViewControllerWithIdentifier:@"FloatingController"]; 

_anotherView = _vc.view; 
[_anotherView setTranslatesAutoresizingMaskIntoConstraints:NO]; 
[self.window addSubview: _anotherView]; 

[[VLBConstraintsGenerator sharedInstance] setWidth:200 forView:_anotherView inSuperView:_window]; 
[[VLBConstraintsGenerator sharedInstance] setHeight:200 forView:_anotherView inSuperView:_window]; 
[[VLBConstraintsGenerator sharedInstance] setLeading:0 forView:_anotherView inSuperView:_window]; 


[_anotherView setBackgroundColor:[UIColor grayColor]]; 

[[_anotherView layer] setBorderWidth:1]; 
[[_anotherView layer] setBorderColor:[UIColor yellowColor].CGColor]; 

[self.window makeKeyAndVisible]; 
[self.window bringSubviewToFront:_anotherView]; //not really needed here but it doesn't do any harm 

todo lo que necesita hacer es arrastrar un controlador de vista en que guión gráfico principal con FloatingController como un ID de guión gráfico

Métodos adicionales

-(void)setWidth:(CGFloat)theWidth forView:(UIView *)theView inSuperView:(UIView *)theSuperView 

{ 
assert([theSuperView isEqual:theView.superview]); 
    NSLayoutConstraint *cn = [NSLayoutConstraint constraintWithItem:theView 
                  attribute:NSLayoutAttributeWidth 
                  relatedBy:NSLayoutRelationEqual 
                  toItem:nil 
                  attribute:NSLayoutAttributeNotAnAttribute 
                 multiplier:1 
                  constant:theWidth]; 


// [cn setPriority:999];//make it variable according to the orientation 
[theSuperView addConstraint:cn]; 
} 


-(void)setHeight:(CGFloat)theHeight forView:(UIView *)theView inSuperView:(UIView *)theSuperView 
{ 
assert([theSuperView isEqual:theView.superview]); 

NSLayoutConstraint *cn = [NSLayoutConstraint constraintWithItem:theView 
                 attribute:NSLayoutAttributeHeight 
                 relatedBy:NSLayoutRelationEqual 
                 toItem:nil 
                 attribute:NSLayoutAttributeNotAnAttribute 
                multiplier:1 
                 constant:theHeight]; 

[theSuperView addConstraint:cn]; 
} 

-(void)setLeading:(CGFloat)theLeading forView:(UIView *)theView inSuperView:(UIView *)theSuperView 
{ 
assert([theSuperView isEqual:theView.superview]); 

NSLayoutConstraint *cn = [NSLayoutConstraint constraintWithItem:theView 
                 attribute:NSLayoutAttributeLeading 
                 relatedBy:NSLayoutRelationEqual 
                 toItem:theSuperView 
                 attribute:NSLayoutAttributeLeading 
                multiplier:1 
                 constant:theLeading]; 

[theSuperView addConstraint:cn]; 
} 
Cuestiones relacionadas