2011-02-23 20 views
12

Yuvarlatılmış köşeleri olan bir NSView alt sınıfı oluşturuyorum. Bu görüş bir konteynır olmalı ve diğer alt görünümler buna eklenecektir. Tüm alt köşelerin köşelerini de kırpmak için NSView'un köşeli köşelerini almaya çalışıyorum, ancak alamıyorum.Tüm yuvarlak görünümleri görüntüleyen NSView üzerinde yuvarlatılmış rect

- (void)drawRect:(NSRect)dirtyRect { 
    NSRect rect = [self bounds]; 
    NSBezierPath *path = [NSBezierPath bezierPathWithRoundedRect:rect xRadius:self.radius yRadius:self.radius]; 
    [path addClip]; 

    [[NSColor redColor] set]; 
    NSRectFill(dirtyRect); 

    [super drawRect:dirtyRect];  
} 

kırmızı sadece örnek içindir. Rect'e bir alt görünüm eklerseniz, köşeler kırpılmaz: enter image description here

Bunu nasıl başarabilirim?

+1

-drawRect klip Nitelikler: etkiler * sadece görünümün çizimi ve görünümün tüm dikdörtgeni içinde hala mevcut olan alt görünümlerle ilgisi yoktur. Çizim, alt raporlar değildir * alt *, * altındadır. Bunu başarmanın tek yolu hakkında. Katman destekli görünümler kullanın. –

cevap

-1

Katmanlarla kırpma yapmayı denediniz mi?

self.layer.cornerRadius = self.radius; self.layer.masksToBounds = YES;


Ah

, üzgünüm, nasılsa ben, NSView hakkında UIView değil konuştuğumuz özlemişim. NSView alt görünümlerini tüm durumlarda kırpmak zor olurdu çünkü Kakao standart görünümlerinin çoğunun kendi kırpma yolunu belirlediği görülüyor. Bazı gösterimlerle alt görünümleri düzenlemek ve kırpma gereksinimini ortadan kaldırmak daha kolay olabilir.

+0

Evet. Bu satırların yanı sıra [self setWantsLayer: YES] eklemek, kabın veya içeriğinin köşelerini yuvarlamaz – coneybeare

+0

Ah, üzgünüm, bir şekilde UIView değil, NSView hakkında konuştuğunuzu özledim. NSView alt görünümlerini tüm durumlarda kırpmak zor olurdu çünkü Kakao standart görünümlerinin çoğunun kendi kırpma yolunu belirlediği görülüyor. Bazı gösterimlerle alt görünümleri düzenlemek ve kırpma gereksinimini ortadan kaldırmak daha kolay olabilir. – tundrabot

+0

Düzenimi yeniden tasarladım. Bunun için doğru şekilde işaretlenmiş, ancak cevabınızı, yorumda söylediklerinizi dahil etmek için düzenlemelisiniz, yanlış katmandan kaçınmak için yanlış katmanlara dikkat edin – coneybeare

26

Çekirdek Animasyon katmanlarını kullanmak, alt katmanları doğru şekilde keser. konteynırınız NSView alt sınıfında

:

- (id)initWithFrame:(NSRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self) { 
     self.layer = _layer; // strangely necessary 
     self.wantsLayer = YES; 
     self.layer.masksToBounds = YES;  
     self.layer.cornerRadius = 10.0;  
    }  
    return self; 
} 
+2

Not: Bu belge, belge görünümü NSScrollView sınırlarını aşacak şekilde büyütülen bir NSScrollView köşesinin yuvarlanması özel durumu için işe yaramaz (belge sınırları değiştiğinde katman kırpma yolunu sıfırlamak için görünür). Ancak, belge görünümü kaydırma görünümü boyutuna eşit veya daha küçük bir statik boyut ise çalışır. – Dalmazio

+2

Aramadan önce self.wantsLayer = YES; katmanı ayarlamanız gerekir: self.layer = layer; http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/ApplicationKit/Classes/NSView_Class/Reference/NSView.html#//apple_ref/doc/uid/20000014-SW61 –

+1

@JasonFuerstenberg 'kendini. wantsLayer = YES; 'otomatik olarak bir 'CALayer' oluşturacak ve 'layer' özelliği görünümüne atayacaktır. Bunu yapmak için hiçbir sebep yok. – NSAddict

10

Sen Kullanıcı Tanımlı Runtime eklemeden sınıflara olmadan arayüz oluşturucu bunu yapabilir "

enter image description here

+0

Bu, yalnızca Görünüm Efektleri denetçisinde CALayer'i etkinleştirmediyseniz çalışır; ayarlarının özel nitelikleri geçersiz kıldığı anlaşılıyor. – ThatsJustCheesy

İlgili konular