SORU
31 Ocak 2011, PAZARTESİ


Yuvarlak UİView iki köşe

Biraz önce rounding just two corners of a view hakkında bir sorum yayınlanan ve büyük bir tepki var, ama uygulama sorunları yaşıyorum. Burada benim drawRect: yöntem:

- (void)drawRect:(CGRect)rect {
    //[super drawRect:rect]; <------Should I uncomment this?
    int radius = 5;
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextBeginPath(context);
    CGContextAddArc(context, rect.origin.x   radius, rect.origin.y   rect.size.height - radius, radius, M_PI, M_PI / 2, 1);
    CGContextAddArc(context, rect.origin.x   rect.size.width - radius, rect.origin.y   rect.size.height - radius, radius, M_PI / 2, 0.0f, 1);
    CGContextClosePath(context);
    CGContextClip(context);
}

Yöntem deniyor, ama manzara sonucu etkileyecek gibi görünmüyor. Neden herhangi bir fikir?

CEVAP
8 ŞUBAT 2011, Salı


Tüm @lomanf cevabına bir yorum bu sığdıramadım. Cevap olarak ekliyorum.

Gibi @lomanf dedi, yolun sınırları dışında çizim alt katmanlar engellemek için bir katman maskesi eklemek gerekir. Çok daha kolay şimdi. İOS 3.2 veya daha yüksek hedeflediğiniz sürece, kuvars ile bir görüntü oluşturmak ve maske olarak ayarlayın gerek yok. Sadece UIBezierPath CAShapeLayer oluşturabilir ve maske olarak kullanan.

Katman maskeleri kullanarak ya da maskeleme katman maskesi eklediğinizde herhangi bir katman hiyerarşisinin bir parçası olmadığından emin olun. Aksi davranışı tanımlı değil. Eğer görüşünü zaten hiyerarşisinde ise, superview, maske çıkarmak, olduğu yere geri koymak gerekir.

CAShapeLayer *maskLayer = [CAShapeLayer layer];
UIBezierPath *roundedPath = 
  [UIBezierPath bezierPathWithRoundedRect:maskLayer.bounds
                        byRoundingCorners:UIRectCornerTopLeft |
                                          UIRectCornerBottomRight
                              cornerRadii:CGSizeMake(16.f, 16.f)];    
maskLayer.fillColor = [[UIColor whiteColor] CGColor];
maskLayer.backgroundColor = [[UIColor clearColor] CGColor];
maskLayer.path = [roundedPath CGPath];

//Don't add masks to layers already in the hierarchy!
UIView *superview = [self.view superview];
[self.view removeFromSuperview];
self.view.layer.mask = maskLayer;
[superview addSubview:self.view];

Temel Animasyon render çalışır şekilde nedeniyle, maskeleme oldukça yavaş bir işlemdir. Her maske ekstra render pass gerektirir. Maskeleri idareli kullanın.

Bu yaklaşımın en iyi parçalarından biri artık 6 ** bir özel oluşturmak ve drawRect: geçersiz kılmak gerekir. Bu kod daha basit ve daha hızlı belki de yapmak gerekir.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • ChrisCrossMedia

    ChrisCrossMe

    17 EYLÜL 2009
  • RocketJump

    RocketJump

    22 ŞUBAT 2006
  • FF Radioo

    FF Radioo

    14 ŞUBAT 2007