Cómo agregar UIView en la parte superior de todos los puntos de vista?

He dicho código:

@interface Alert : UIView 
{

}
/*
- (void) initWithTitle:(NSString*)title message:(NSString*)message cancelButtonTitle:(NSString*)cancelButtonTitle otherButtonTitles:(NSString*)buttonTitle,... delegate:(id)delegate;
*/
@end


@implementation Alert

- (void) drawRect:(CGRect)rect 
{
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextClearRect(context, rect); //Очистим context

    CGContextSetRGBFillColor(context, 255, 0, 0, 1);
    CGContextFillRect(context, CGRectMake(20, 20, 100, 100));
}

- (void) show
{
    self.center = [[[UIApplication sharedApplication] keyWindow] center];
    [[[UIApplication sharedApplication] keyWindow] addSubview:self];
    [[[UIApplication sharedApplication] keyWindow] bringSubviewToFront:self];
}

A continuación, voy a usar:

- (void)viewDidLoad
{
    [super viewDidLoad];
     Alert * alert = [[Alert alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];
    [alert show];
    [alert release];
}

Pero no funciona(quiero ver la Alerta por encima de todos los otros puntos de vista). ¿Podría usted ayudarme?

5 Kommentare

  1. 55

    Las soluciones recomendadas que se ocupan de la orientación del dispositivo correctamente son

    • pod
      AGWindowView Automáticamente lidiar con cualquier rotación y framechanges de modo que usted no tiene que preocuparse por eso.
    • lea y siga el funcionario de correos https://developer.apple.com/library/content/qa/qa1688/_index.html
    • Agregar a la vista a la primera vista, en lugar de añadir a la ventana

      UIWindow* window = [UIApplication sharedApplication].keyWindow;
      if (!window) 
          window = [[UIApplication sharedApplication].windows objectAtIndex:0];
      [[[window subviews] objectAtIndex:0] addSubview:myView];

    También puede agregar a la ventana. No va a manejar la orientación del dispositivo, aunque.

    let window = UIApplication.sharedApplication().keyWindow!
    let view = UIView(frame: CGRect(x: window.frame.origin.x, y: window.frame.origin.y, width: window.frame.width, height: window.frame.height))
    window.addSubview(v);
    view.backgroundColor = UIColor.blackColor()
    • La primera solución no respeto dispositivo de rotaciones. La segunda solución no funciona si un modal viewcontroller se presenta.
    • segundo para ipad está funcionando muy bien gracias 🙂
  2. 5

    También hay uno que otro método

    Agregue el siguiente método en la vista aparecerá a agregar cada vez push/pop controlador de vista de

    -(void)viewWillAppear:(BOOL)animated
    {
         [super viewWillAppear:animated];
    
         [[[UIApplication sharedApplication] keyWindow] addSubview:<yourViewObject>];
    }

    Y para eliminar este punto de vista en la próxima clase, agregue las siguientes líneas de código

    -(void)viewWillDisappear:(BOOL)animated
    {
        [super viewWillDisappear:animated];
    
        [<yourViewObject> removeFromSuperview];
     }
  3. 1

    @MaciekWrocław respondemos swift versión

    Swift2

     var appDelegate = (UIApplication.sharedApplication().delegate! as! AppDelegate)
     var backgrView = UIView(frame: CGRectMake(0, 0, UIScreen.mainScreen().bounds.size.width, UIScreen.mainScreen().bounds.size.height))
     backgrView.backgroundColor = UIColor.redColor()
     backgrView.alpha = 0.6
     window?.addSubview(backgrView)

    swift3

         var appDelegate: AppDelegate? = (UIApplication.shared.delegate as? AppDelegate)
         var backgrView = UIView(frame: CGRect(x: CGFloat(0), y: CGFloat(0), width: CGFloat(UIScreen.main.bounds.size.width), height: CGFloat(UIScreen.main.bounds.size.height)))
         backgrView.backgroundColor = UIColor.red
         backgrView.alpha = 0.6
         window?.addSubview(backgrView)

    y estoy haciendo para mi aplicación acerca de la conexión de red en el AppDelegate:

    func checkReachabilityUpdateUI() -> Int {
    
        let remoteHostStatus = self.reachability?.currentReachabilityStatus()
    
    
        if remoteHostStatus?.rawValue == 0 {
            let backgrView = UIView(frame: CGRectMake(0, 60, UIScreen.mainScreen().bounds.size.width, 44))
    
            let statusMessage = UILabel(frame: CGRect(x: 0, y: 0, width: UIScreen.mainScreen().bounds.size.width, height: 44))
    
            statusMessage.text = "No internet Connection"
            statusMessage.textAlignment = .Center
            statusMessage.textColor =  UIColor.whiteColor()
    
            backgrView.backgroundColor = UIColor.redColor()
    
            backgrView.addSubview(statusMessage)
    
            backgrView.tag = 100
    
            window?.addSubview(backgrView)
    
            return (remoteHostStatus?.rawValue)!
    
        }
        else {
    
            if let viewWithTag = self.window!.viewWithTag(100) {
                print("Tag 100")
                viewWithTag.removeFromSuperview()
            }
            else {
                print("tag not found")
            }
    
           return (remoteHostStatus?.rawValue)!
    
        }
    
    }
  4. 0
    UIView *spinnerView;//This is your view
    
    self.spinnerView = [[UIView alloc]initWithFrame:CGRectMake(0, 0, UIScreen.mainScreen.bounds.size.width, UIScreen.mainScreen.bounds.size.height)];  
    //Based on your requirement change width and height like self.view.bounds.size.width
    self.spinnerView.backgroundColor = [[UIColor blackColor] colorWithAlphaComponent:0.6];
    //[self.view addSubview:self.spinnerView];
    UIWindow *currentWindow = [UIApplication sharedApplication].keyWindow;
    [currentWindow addSubview:self.spinnerView];

    En Swift 5

    let window = UIApplication.shared.keyWindow! 
    window.addSubview(self.spinnerView) //Add your view here

    Uno más solución es simple :

    yourViewName.layer.zPosition = 1//Here fix your view name
  5. -4

    Si usted sabe lo que subvista es en la parte superior, uso:

    UIView* topMostSubView = <your view's top most subview>
    [self.view insertSubview:alert aboveSubview:topMostSubView];
    • Eso es una gran suposición para hacer.

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea