1

我正在尝试添加一些 UI 元素,例如,UIProgressView和-我认为代码是正确的(或者我认为是正确的),但除了背景之外什么都没有显示。我究竟做错了什么?UILabelUIButtonUIActivityIndicator

@interface LoadingView : UIView

@property (weak, nonatomic) IBOutlet UIActivityIndicatorView *activityIndicator;
@property (weak, nonatomic) IBOutlet UIProgressView *progressView;
@property (weak, nonatomic) IBOutlet UILabel *statusLabel;
@property (weak, nonatomic) IBOutlet UIButton *cancelButton;

- (void)removeLoadingView;

@end


@implementation LoadingView

@synthesize activityIndicator = _activityIndicator;
@synthesize progressView = _progressView;
@synthesize statusLabel = _statusLabel;
@synthesize cancelButton = _cancelButton;

- (UIView *)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];

    if (self) {
        self.progressView = [[UIProgressView alloc] initWithFrame:CGRectMake(34, 225, 248, 9)];
        self.statusLabel = [[UILabel alloc] initWithFrame:CGRectMake(36, 257, 248, 31)];
        self.cancelButton = [[UIButton alloc] initWithFrame:CGRectMake(121, 317, 74, 37)];

        // Create a new image view, from the image made by our gradient method
        UIImageView *background = [[UIImageView alloc] initWithImage:[self addBackground]];
        background.alpha = 0.8;
        [self addSubview:background];

        self.activityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
        // Set the resizing mask so it's not stretched
        self.activityIndicator.autoresizingMask =
        UIViewAutoresizingFlexibleTopMargin |
        UIViewAutoresizingFlexibleRightMargin |
        UIViewAutoresizingFlexibleBottomMargin |
        UIViewAutoresizingFlexibleLeftMargin;

        CGRect indicatorFrame = CGRectMake(142, 163, 37, 37);
        [self.activityIndicator setFrame:indicatorFrame];

        self.statusLabel.text = @"test 123";
        self.statusLabel.hidden = NO;
        self.statusLabel.enabled = YES;
        self.statusLabel.textColor = [UIColor whiteColor];
        [self addSubview:self.activityIndicator];
        [self addSubview:self.progressView];
        [self addSubview:self.cancelButton];
        [self addSubview:self.statusLabel];

        [self.activityIndicator 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
        [[super layer] addAnimation:animation forKey:@"layerAnimation"];*/

    }
    return self;
}



- (UIImage *)addBackground{
    // 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;
}

编辑:所以我只是把代码放进去,viewDidload现在什么都没有显示,甚至没有背景。我还尝试了代码,layoutSubviews结果与上面的代码相同,除了背景之外的所有内容都被隐藏了。

我用来从视图控制器实例化此视图的代码是;

@property (nonatomic, strong) LoadingView *loadingView;

@synthesize loadingView = _loadingView;

- (LoadingView *)loadingView
{
    if (!_loadingView) _loadingView = [[LoadingView alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    return _loadingView;
}


- (void)viewDidLoad
{
    [super viewDidLoad];
    [self.view addSubview:self.loadingView];
}
4

6 回答 6

3

把它放到viewDidLoad你的视图控制器中。这将确保您的主视图已经存在。

于 2012-08-31T08:13:20.713 回答
2

只有在发布了代码之后,@interface我才意识到我正在使用weak指针创建元素。我将其更改为strong,一切正常。感谢大家的回答,我知道我没有显示整个代码而让大家感到困惑。

于 2012-08-31T08:57:10.520 回答
1

您是否应该将新的 UI 元素添加到 self 的视图中,而不仅仅是 self 。所以它看起来有点像这样:

 [[self view] addSubview:background];

并不是

 [self addSubview:background];

编辑

试试这个查看控制器上的所有视图。

    for(UIView *vw in self.subviews) {
         NSLog(@"View : %@", vw);
    }

如果您无法访问 self.subviews 这意味着您无法添加除初始视图之外的任何视图,因此您必须开始添加到 [self view]。尝试将 self.subviews 更改为 [[self view] subviews];

您的背景视图可能已被放置为初始视图,因为它是 UIImageView,请尝试添加。

于 2012-08-31T08:27:28.673 回答
1

你应该这样做viewDidLoad,或者- (void)layoutSubviews如果你正在构建一个自定义 UIView

于 2012-08-31T08:16:42.890 回答
1

你有没有initWithFrame:在你想要的地方调用方法?

我认为您最好在方法中添加代码init:-ViewDidLoad

于 2012-08-31T08:13:28.517 回答
1

尝试 self.cancelButton.backgroundColor = [UIColor redColor]; 看看有没有出现。

默认情况下使用代码创建的自定义按钮没有背景图像或颜色,您需要手动指定它们。

于 2012-08-31T08:14:40.593 回答