如何以编程方式添加子视图

时间:2015-01-24 12:41:11

标签: ios objective-c xcode

首先,我对IOS编程很陌生。我正在研究一个项目并面临一个问题。

我想以编程方式在“桌面”视图上添加“球”子视图,但是球不会出现。该程序仅显示该表。什么原因?在此先感谢,这是我的文件:

Table.m

//
//  Table.m
//  Lines
//
//  Created by Eduard Avetisyan on 1/24/15.
//  Copyright (c) 2015 Eduard Avetisyan. All rights reserved.
//

#import "Table.h"
#import "Constants.h"

@implementation Table


-(id)initWithCoder:(NSCoder *)aDecoder
{
    self = [super initWithCoder:aDecoder];
    if(self)
    {
        [self addBall];
    }
    return self;
}

- (void)addBall
{
    Ball* myBall = [[Ball alloc]init];
    [self.window addSubview:myBall];
    myBall.center = self.window.center;
    [self.window bringSubviewToFront:myBall];
}
- (void)drawRect:(CGRect)rect
{
    [super drawRect:rect];

    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetStrokeColorWithColor(context, [UIColor blueColor].CGColor);
    CGContextSetLineWidth(context, 2.0f);

    for (int i = 0;i <= TABLE_LENGTH; i++)
    {

        //draw rows
        CGContextMoveToPoint(context, BORDER_DISTANCE +i * CELL_LENGTH, BORDER_DISTANCE);
        CGContextAddLineToPoint(context, BORDER_DISTANCE + i * CELL_LENGTH, BORDER_DISTANCE + CELL_LENGTH * TABLE_LENGTH);
        CGContextStrokePath(context);

        //draw columns
        CGContextMoveToPoint(context, BORDER_DISTANCE, BORDER_DISTANCE + i * CELL_LENGTH);
        CGContextAddLineToPoint(context, BORDER_DISTANCE + CELL_LENGTH * TABLE_LENGTH, BORDER_DISTANCE + i * CELL_LENGTH);
        CGContextStrokePath(context);
    }

}

@end

Ball.m

//
//  Ball.m
//  Lines
//
//  Created by Eduard Avetisyan on 1/24/15.
//  Copyright (c) 2015 Eduard Avetisyan. All rights reserved.
//

#import "Ball.h"

@implementation Ball

-(instancetype)init
{
    self = [super init];

    if (self) {

        CGRect newFrame = self.frame;

        newFrame.size.width = 50;
        newFrame.size.height = 50;
        [self setFrame:newFrame];

        Colors color = arc4random_uniform(NUMBER_OF_COLORS);
        [self drawBall:color];
    }

    return self;
}


-(void)drawBall:(Colors)color
{
    switch (color) {
        case red:
            self.fillColor = [UIColor redColor].CGColor;
            break;
        case green:
            self.fillColor = [UIColor greenColor].CGColor;
            break;
        case yellow:
            self.fillColor = [UIColor orangeColor].CGColor;
            break;
        case blue:
            self.fillColor = [UIColor blueColor].CGColor;
            break;

        default:
            break;
    }

}

-(void)setFillColor:(CGColorRef)fillColor
{
    _fillColor = fillColor;

    [self setNeedsDisplay];
}


- (void)drawRect:(CGRect)rect {

    CGContextRef context = UIGraphicsGetCurrentContext();

    CGContextSetFillColorWithColor(context, self.fillColor);
    CGContextSetStrokeColorWithColor(context, [UIColor greenColor].CGColor);

    CGContextFillEllipseInRect(context, rect);
    CGContextStrokeEllipseInRect(context, rect);

}

@end

Constants.h

//
//  Constants.h
//  Lines
//
//  Created by Eduard Avetisyan on 1/24/15.
//  Copyright (c) 2015 Eduard Avetisyan. All rights reserved.
//

#ifndef Lines_Constants_h
#define Lines_Constants_h

#define TABLE_LENGTH 10
#define CELL_LENGTH 30
#define BORDER_DISTANCE 5
#define NUMBER_OF_COLORS 4

typedef enum {
    red,
    green,
    yellow,
    blue,
    black,
    orange,
    violet
}Colors;


#endif

1 个答案:

答案 0 :(得分:2)

addBall方法中,您要将新的Ball对象添加到self.window。您应该将其添加到self。而且您不需要致电bringSubviewToFront: