2013-02-26 3 views
14

Sto provando a disegnare un rettangolo trasparente nel mio UIView che ha un bordo nero.Disegno di un rettangolo in UIView

Il mio codice tuttavia crea un rettangolo completamente nero. Ecco il mio codice finora:

- (void)drawRect:(CGRect)rect 
{ 
    // Drawing code 
    CGRect rectangle = CGRectMake(0, 100, 320, 100); 
    CGContextRef context = UIGraphicsGetCurrentContext(); 
    CGContextSetRGBFillColor(context, 0.0, 0.0, 0.0, 0.5); 
    CGContextSetRGBStrokeColor(context, 0.0, 0.0, 0.0, 0.5); 
    CGContextFillRect(context, rectangle); 

} 
+1

Cambia 'CGContextFillRect' a' CGContextStrokeRect' –

+0

Stesso problema. C'è solo un rettangolo nero (ed è completamente nero) –

+0

prova con alpha 0.0 in CGContextSetRGBFillColor (context, 0.0, 0.0, 0.0, 0.5); – Exploring

risposta

19
- (void)drawRect:(CGRect)rect 
{ 
    // Drawing code 
    CGRect rectangle = CGRectMake(0, 100, 320, 100); 
    CGContextRef context = UIGraphicsGetCurrentContext(); 
    CGContextSetRGBFillColor(context, 1.0, 1.0, 1.0, 0.0); //this is the transparent color 
    CGContextSetRGBStrokeColor(context, 0.0, 0.0, 0.0, 0.5); 
    CGContextFillRect(context, rectangle); 
    CGContextStrokeRect(context, rectangle); //this will draw the border 

} 

l'effetto è così (backgroundColor è blu)

enter image description here

+0

Hmm, non sta facendo nulla. Anche quando ho provato ad inserire alcuni valori casuali per RGB, mostra semplicemente un rettangolo nero ogni volta. –

+0

@AshishAgarwal vuoi il rettangolo trasparente, perché inserisci valori casuali per RGB? guarda il mio disegno –

+1

Beh, sto cercando di vedere qualcosa di diverso dal nero. Ma finora nessuna fortuna –

3

Esso fornirà il rettangolo/quadrato regolando i valori di telaio auto (personalizzato vista o sottoclasse di qualsiasi classe che è ereditata da UIView) con trasparenza.

[self.layer setBorderWidth:1.0]; 
[self.layer setBorderColor:[[UIColor colorWithRed:0.10 green:0.45 blue:0.73 alpha:1.0] CGColor]]; 
[self.layer setCornerRadius:2.0]; 
[self.layer setShadowOffset:CGSizeMake(-2, -2)]; 
[self.layer setShadowColor:[[UIColor lightGrayColor] CGColor]]; 
[self.layer setShadowOpacity:0.5]; 
+0

Possiamo anche impostare la proprietà Alpha per questo rettangolo in modo che questo rettangolo sia trasparente al 50%? Grazie. – Thanh

0
CGRect bounds = connectorRect; 
CGFloat minx = CGRectGetMinX(bounds), midx = CGRectGetMidX(bounds), maxx = CGRectGetMaxX(bounds); 
CGFloat miny = CGRectGetMinY(bounds), maxy = CGRectGetMaxY(bounds); 
CGContextSetFillColorWithColor(context, [UIColor grayColor].CGColor); 
CGContextSetLineWidth(context, 1.0); 
CGContextBeginPath(context); 
CGContextSetStrokeColorWithColor(context,[UIColor clearColor].CGColor); 
CGContextMoveToPoint(context, minx, maxy); 
CGContextAddLineToPoint(context, midx, miny); 
CGContextAddLineToPoint(context, maxx, maxy); 
CGContextClosePath(context); 
CGContextDrawPath(context, kCGPathFillStroke); 
+3

Questo è per il triangolo Dude not for Rectangle – ashokdy

+1

richiesto rettangolo ma mostra triangolo – vishnu

1

Il codice non richiede la chiamata CGContextSetRGBFillColor e manca la chiamata CGContextStrokeRect. Con Swift 3, il vostro draw(_:) implementazione finale dovrebbe assomigliare a questa:

class CustomView: UIView { 

    override init(frame: CGRect) { 
     super.init(frame: frame) 
     backgroundColor = .white 
    } 

    required init?(coder aDecoder: NSCoder) { 
     fatalError("init(coder:) has not been implemented") 
    } 

    override func draw(_ rect: CGRect) { 
     guard let ctx = UIGraphicsGetCurrentContext() else { return }  
     ctx.setStrokeColor(red: 0, green: 0, blue: 0, alpha: 0.5) 
     let rectangle = CGRect(x: 0, y: 100, width: 320, height: 100) 
     ctx.stroke(rectangle) 
    } 

} 

In alternativa, se il tuo vuole veramente chiamare CGContextSetRGBFillColor, è anche di avere chiamata CGContextFillRect. Il tuo finale draw(_:) implementazione sarebbe quindi simile a questo con Swift 3:

class CustomView: UIView { 

    override init(frame: CGRect) { 
     super.init(frame: frame) 
     backgroundColor = .white 
    } 

    required init?(coder aDecoder: NSCoder) { 
     fatalError("init(coder:) has not been implemented") 
    } 

    override func draw(_ rect: CGRect) { 
     guard let ctx = UIGraphicsGetCurrentContext() else { return } 

     ctx.setFillColor(red: 1, green: 1, blue: 1, alpha: 0) 
     ctx.setStrokeColor(red: 0, green: 0, blue: 0, alpha: 0.5) 

     let rectangle = CGRect(x: 0, y: 100, width: 320, height: 100) 
     ctx.fill(rectangle) 
     ctx.stroke(rectangle) 
    } 

} 
1

Un consiglio utile ......

Molto spesso, quando è necessario disegnare un quadrato

è più facile solo disegnare una 'striscia spessa' .....

let context = UIGraphicsGetCurrentContext() 
    context!.setLineWidth(100) 
    context!.setStrokeColor(blah.cgColor) 
    context?.move(to: CGPoint(x: 500, y: 200)) 
    context?.addLine(to: CGPoint(x: 500, y: 300)) 
    context!.strokePath() 

che trarrà un quadrato, che si estende verso il basso da 200 a 300.

È centrato su 500 attraverso ed è largo 100.