iOS Untersicht dargestellt als Schwarzes Rechteck, wenn drawRect überschrieben

Habe ich ein storyboard, das lädt lädt eine benutzerdefinierte UIView. Auch ein sub-view ist die Ansicht Hinzugefügt, in das storyboard. Es funktionierte gut, bis ich überschrieb die drawRect Methode der sub-Ansicht, und ich sah nur ein Schwarzes Rechteck anstelle der Untersicht. Hier ist der code:

#import <UIKit/UIKit.h>
#import "MySubview.h"

@interface MyView : UIView

@end

#import "MyView.h"

@implementation MyView

- (void) awakeFromNib
{
    CGRect frame = [self frame];
    MySubview* sv = [[MySubview alloc] initWithFrame:frame];
    [self addSubview:sv];
}

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        //Initialization code
    }
    return self;
}

@end

#import <UIKit/UIKit.h>

@interface MySubview : UIView

@property (retain, nonatomic) NSString* text;
@property (retain, nonatomic) UILabel* label;

@end

#import "MySubview.h"

@implementation MySubview

@synthesize text, label;


- (void)attachLabel
{
    text = @"Hello";
    label = [[UILabel alloc] init];
    [label setText:text];
    [label setFont:[UIFont fontWithName:@"Futura" size:18]];
    [label setBackgroundColor:[UIColor clearColor]];

    [label sizeToFit];

    CGRect labelFrame = label.frame;
    labelFrame.origin.x = (self.frame.size.width  - labelFrame.size.width) / 2;
    labelFrame.origin.y = (self.frame.size.height - labelFrame.size.height) / 2;
    label.frame = labelFrame;

    [self addSubview:label];
}

- (void)awakeFromNib
{
    [self attachLabel];
}

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        [self attachLabel];
    }
    return self;
}

//Works if I comment this out!
- (void)drawRect:(CGRect)rect
{
}

@end

Update - Added-Zeichnung folgenden code:

- (void)drawRectWithRoundBorders:(CGRect)rect
{
    [super drawRect:rect];

    //Parameters used for drawing.
    const CGFloat lineWidth = 5;
    const CGFloat shadowOffset = 3;
    const CGFloat shadowBlur = 4;
    const CGFloat spaceToBB = 10;   //Space to the bounding box of this view.
    const CGFloat cornerRadii = 5;
    const CGFloat lineColor[4] = { 0, 0, 0, 1 };

    CGContextRef ctx = UIGraphicsGetCurrentContext();

    CGContextSetLineWidth(ctx, lineWidth);
    CGContextSetStrokeColor(ctx, lineColor);
    CGContextSetShadow(ctx, CGSizeMake(shadowOffset, shadowOffset), shadowBlur);

    CGRect innerRect = rect;

    innerRect.size.width -= 2*spaceToBB;
    innerRect.size.height -= 2*spaceToBB;
    innerRect.origin.x += spaceToBB;
    innerRect.origin.y += spaceToBB;

    UIBezierPath *path = 
    [UIBezierPath bezierPathWithRoundedRect:innerRect 
                          byRoundingCorners:UIRectCornerAllCorners 
                                cornerRadii:CGSizeMake(cornerRadii, cornerRadii)
     ];

    CGContextAddPath(ctx, path.CGPath);
    CGContextStrokePath(ctx);
}


- (void)drawRect:(CGRect)rect
{
    [self drawRectWithRoundBorders:rect];
}

Update

Scheint es zu funktionieren, wenn ich füllen die bounding-box der sub-Ansicht mit einer Farbe zuerst.

CGContextRef ctx = UIGraphicsGetCurrentContext();
CGFloat white[] = {1, 1, 1, 0.5};
CGContextSetFillColor(ctx, white);
CGContextAddRect(ctx, rect);
CGContextFillPath(ctx);
  • Wann ist dieser - (void)drawRectWithRoundBorders:(CGRect)rect aufgerufen?
  • in drawRect, nur ein wenig scrollen
  • Ach ja richtig, ich war verwirrt durch die leeren Implementierung oben - sollten Sie vielleicht entfernen, die aus der Frage (und der code??)
  • Beachten Sie auch, dass die rect im drawRect ist nicht unbedingt die gesamten Grenzen Ihrer Sicht - Sie erscheinen als solche in Ihrer Methode, aber Sie sollten wirklich mit sich selbst.Grenzen.
  • Die opake Eigenschaft war das, was ich gesucht habe! Die Einstellung KEINE führte zu dem gewünschten Verhalten.
  • Bitte wählen Sie die richtige Antwort unten, da Sie auch herausgefunden, dass es funktioniert.

InformationsquelleAutor Nils | 2012-01-03
Schreibe einen Kommentar