加载屏幕不以第二次启动为中心

时间:2011-12-28 19:33:51

标签: objective-c ios ipad

我有UIView这是我的加载视图。它只是显示圆形加载圆(lol到一个句子的“圆”) 它第一次工作正常,但之后圆圈不居中。它向左和向下移动一些。如何让它始终居中,请记住,我已将应用程序限制为仅在所有视图中以横向模式(横向左侧,横向右侧)显示,因此问题不会来自正在旋转的设备。

调用加载视图:

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 :(得分:0)

确保加载视图设置为其父框架并具有正确的autoresizingMask设置。这可能是UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight

答案 1 :(得分:0)

通过添加

修复了背景
[background setFrame:CGRectMake(0, 0, 1024, 768 )];

并用以下方法修正圆心:

indicator.center =   background.center;