экран загрузки не центрирован на втором запуске - PullRequest
0 голосов
/ 28 декабря 2011

У меня есть UIView, это мой вид загрузки. Все, что он делает, это отображает круговой загрузочный круг (много-много "круг" для одного предложения).
Он отлично работает в первый раз, но после этого круг не центрируется. Он двигается влево и вниз по некоторым. Как сделать так, чтобы он всегда был в центре, помните, что я ограничил приложение отображением только в горизонтальных режимах (альбомная ориентация, горизонтальная ориентация вправо) во всех видах, чтобы проблема не возникала при повороте устройства.

вызов для загрузки представления:

loadingViewController = [LoadingViewController loadSpinnerIntoView:self.view];

LoadingViewController.h:

#import <UIKit/UIKit.h>
#import <QuartzCore/QuartzCore.h>
#import "CrestronClient.h"
@interface LoadingViewController : UIView
{
    CrestronClient *cClient;


}
+(LoadingViewController *)loadSpinnerIntoView:(UIView *)superView;
-(void)removeLoadingView;
- (UIImage *)addBackground;
@end

LoadingView.m:

    #import "LoadingViewController.h"
#import "RootViewController.h"
@implementation LoadingViewController

CGRect priorFrameSettings;
UIView *parentView;


- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    // Return YES for supported orientations

    if (interfaceOrientation == UIInterfaceOrientationLandscapeLeft ||interfaceOrientation == UIInterfaceOrientationLandscapeRight ) {
        return YES;
    }else{
        return NO;
    }

}


-(void)removeLoadingView
{

//    [parentView setFrame:priorFrameSettings];

    CATransition *animation = [CATransition animation];

    [animation setType:kCATransitionFade];

    [[[self superview] layer] addAnimation:animation forKey:@"layerAnimation"];

    [self removeFromSuperview];
}

+(LoadingViewController *)loadSpinnerIntoView:(UIView *)superView
{

    priorFrameSettings = superView.frame;
    parentView = superView;
   // [superView setFrame:CGRectMake(0, 0, 1024, 1024)];


    // Create a new view with the same frame size as the superView


LoadingViewController *loadingViewController = [[LoadingViewController alloc] initWithFrame:superView.frame];

loadingViewController.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;

    // If something's gone wrong, abort!

    if(!loadingViewController){ return nil; }


    [superView addSubview:loadingViewController];

    if(!loadingViewController){ return nil; }

    // This is the new stuff here ;)

    UIActivityIndicatorView *indicator =

    [[[UIActivityIndicatorView alloc]

      initWithActivityIndicatorStyle: UIActivityIndicatorViewStyleWhiteLarge] autorelease];

    // Set the resizing mask so it's not stretched
    UIImageView *background = [[UIImageView alloc] initWithImage:[loadingViewController addBackground]];

    // Make a little bit of the superView show through

    background.alpha = 0.7;

    [loadingViewController addSubview:background];

    indicator.autoresizingMask =

    UIViewAutoresizingFlexibleTopMargin |

    UIViewAutoresizingFlexibleRightMargin |

    UIViewAutoresizingFlexibleBottomMargin |

    UIViewAutoresizingFlexibleLeftMargin;

    // Place it in the middle of the view

    indicator.center =   superView.center;

    // Add it into the spinnerView

    [loadingViewController addSubview:indicator];

    // Start it spinning! Don't miss this step

    [indicator startAnimating];


    // Create a new animation

    CATransition *animation = [CATransition animation];

    // Set the type to a nice wee fade

    [animation setType:kCATransitionFade];

    // Add it to the superView

    [[superView layer] addAnimation:animation forKey:@"layerAnimation"];


    return loadingViewController;

}
- (UIImage *)addBackground{

    cClient = [CrestronClient sharedManager];
    if (cClient.isConnected == FALSE) {
        [cClient connect];
    }
    // Create an image context (think of this as a canvas for our masterpiece) the same size as the view

    UIGraphicsBeginImageContextWithOptions(self.bounds.size, YES, 1);

    // Our gradient only has two locations - start and finish. More complex gradients might have more colours

    size_t num_locations = 2;

    // The location of the colors is at the start and end

    CGFloat locations[2] = { 0.0, 1.0 };

    // These are the colors! That's two RBGA values

    CGFloat components[8] = {

        0.4,0.4,0.4, 0.8,

        0.1,0.1,0.1, 0.5 };

    // Create a color space

    CGColorSpaceRef myColorspace = CGColorSpaceCreateDeviceRGB();

    // Create a gradient with the values we've set up

    CGGradientRef myGradient = CGGradientCreateWithColorComponents (myColorspace, components, locations, num_locations);

    // Set the radius to a nice size, 80% of the width. You can adjust this

    float myRadius = (self.bounds.size.width*.8)/2;

    // Now we draw the gradient into the context. Think painting onto the canvas

    CGContextDrawRadialGradient (UIGraphicsGetCurrentContext(), myGradient, self.center, 0, self.center, myRadius, kCGGradientDrawsAfterEndLocation);

    // Rip the 'canvas' into a UIImage object

    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();

    // And release memory

    CGColorSpaceRelease(myColorspace);

    CGGradientRelease(myGradient);

    UIGraphicsEndImageContext();

    // … obvious.

    return image;

}
- (void)dealloc {

    [super dealloc];
}
@end

Ответы [ 2 ]

0 голосов
/ 29 декабря 2011

исправил фон, добавив

[background setFrame:CGRectMake(0, 0, 1024, 768 )];

и зафиксировал центрирование круга с помощью:

indicator.center =   background.center;
0 голосов
/ 28 декабря 2011

Убедитесь, что представление загрузки установлено в родительский фрейм и для него установлен правильный autoresizingMask.Это, вероятно, на UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...