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.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Fügen Sie einfach
[self setOpaque:NO]
in IhreminitWithFrame:
Methode.Weil deine
drawRect
ist nichts zu tun. Überschreiben SiedrawRect
wenn Sie wollen, um benutzerdefinierte Zeichnung. Also:drawRect
.drawRect
.[super drawRect:rect]
wenn Sie möchten, zeichnen Sie ontop von der Standard-Ansicht 🙂setNeedsDisplay
nach dem hinzufügen, wenn Sie es direkt als eine Untersicht?opaque
- Eigenschaft des view-wie einstellen? In einem Storyboard/xib-Datei die Eigenschaft standardmäßigNO
, aber das instanziieren der view einen anderen Weg, verlassen die Eigenschaft alsYES
.