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
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.
Nasıl WPF Yuvarlak Köşe kap oluşturabi...
UİView kullanarak CALayers - sadece ba...
Nasıl renk drawable kullanarak bir xml...
Yuvarlak köşeler ve gölge ile UİView?...
Nasıl bir UİView arka plan görüntü dol...