UIView imperative drawRect cauze de vedere să nu se supună masksToBounds

voturi
7

Am încercat să suprascrie drawRect:metoda de UIView în opinia mea personalizată. Cu toate acestea, opinia noastră are o rază de frontieră definită ca:

    sub = [[[NSBundle mainBundle] loadNibNamed:@ProfileView owner:self options:nil] objectAtIndex:0];
    [self addSubview:sub];
    [sub setUserInteractionEnabled:YES];
    [self setUserInteractionEnabled:YES];
    CALayer *layer = sub.layer;
    layer.masksToBounds = YES;
    layer.borderWidth = 5.0;
    layer.borderColor = [UIColor whiteColor].CGColor;
    layer.cornerRadius = 30.0;

Acest lucru funcționează perfect și plasează o frontieră frumoasă, cu o rază de frontieră în jurul valorii de punctul meu de vedere (nu minte diagonale linii albe / drepte din spate, nu au nimic de-a face cu acest punct de vedere):

una

Cu toate acestea, atunci când încerc să suprascrie drawRect:metoda în opinia mea, eu pot vedea un fundal negru , nu de mascare a limitelor. Eu nu fac nimic ( în prezent), aici este codul meu:

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

Și aici este rezultatul:

una

M-am schimbat nimic, dar metoda de tragere. Cum pot suprascrie metoda remiză păstrând în același timp punctul meu de vedere ascultă masca raza de colț? Este un bug în iOS sau sunt eu lipsesc ceva?

Întrebat 06/12/2012 la 13:21
sursa de către utilizator
În alte limbi...                            


4 răspunsuri

voturi
3

Nu știu răspunsul plin, dar eu știu că punerea în aplicare a UIView drawLayer:inContext:funcționează diferit în funcție de faptul dacă ați implementat drawRect:sau nu. Poate că mascarea / tăiere a limitelor este unul dintre acele lucruri pe care le face în mod diferit.

Puteți încerca rezolvarea problemei dumneavoastră un număr de moduri:

  • face fundal transparent:

        layer.backgroundColor = [UIColor clearColor].CGColor;
    
  • clip - te în interiorul tău personalizat drawRect::

    - (void)drawRect:(CGRect)rect {
        [[UIBezierPath bezierPathWithRoundedRect:rect cornerRadius:30.0] addClip];
        [image drawInRect:rect];  // or whatever
    }
    
  • sculpta colțuri în mod explicit:

    CGContextBeginPath(c);
    CGContextAddArc(c, r, r, r, M_PI, 3*M_PI_2, 0);
    CGContextAddLineToPoint(c, 0, 0);
    CGContextClosePath(c);
    CGContextClip(c);
    [[UIColor grayColor] setFill];
    UIRectFill(rect);
    

Am furat aceste ultimele 2 sugestii de la acest mare prezentare de la WWDC 2010: avansate de optimizare de performanță pe iPhone OS (video listate la pagina de index - supărător, fără legătură directă).

Publicat 23/04/2013 la 23:56
sursa de către utilizator

voturi
1

Probabil că nu ar trebui sa solicite

[super drawRect:rect]

în interiorul drawRect tău. Apple spune că:

Daca subclasa direct UIView, implementarea acestei metode nu are nevoie pentru a apela super-. Cu toate acestea, dacă subclasarea o clasă de vedere diferit, ar trebui să apelați super-la un moment dat în implementarea.

Se pare că apelarea super-metoda provoacă un comportament ciudat.

Publicat 09/12/2014 la 12:32
sursa de către utilizator

voturi
2

Aceasta este o întrebare veche, dar am fost citit recent un articol de blog util intitulat abuzează de UIView . În ea autorul recomandă împotriva major de drawRecta face lucruri cum ar fi adăugați un chenar atunci când există și alte modalități de a face asta. El spune,

Supracomanda drawRect:produce un hit de performanță. Nu l - am profilat, așa că nu știu dacă este o performanță signifigant în condiții normale (probabil că nu e), dar în cele mai multe cazuri, oameni care suprascriu drawRect:poate realiza ceea ce doresc mult mai ușor prin setarea proprietăților pe proprietatea strat vederea lui . Dacă aveți nevoie pentru a desena un contur în jurul unui punct de vedere, iată cum v - ar face:

#import <QuartzCore/QuartzCore.h>

- (id)initWithFrame:(CGRect)frame {
  self = [super initWithFrame:frame];
  if (self) {
      self.layer.borderWidth = 2.f;
      self.layer.borderColor = [UIColor redColor].CGColor;
  }
  return self;

Îmi dau seama că, probabil, nu rezolvă problema de fond negru, prin care arată. Este doar ceva să se gândească.

Publicat 18/06/2015 la 13:51
sursa de către utilizator

voturi
1

reglaj

opaque = false // NO for ObjC

pe vizualizarea rezolvă problema.

Publicat 22/06/2016 la 08:51
sursa de către utilizator

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more