2012-02-09 17 views
11

Chciałbym stworzyć wewnętrzny cień na mojej UIView na iPada tak:Tworzenie wewnętrzny cień w UIView

UIView with shadow

Ten UIView może zmienić rozmiar, więc nie mogę użyć prostego obrazu do stworzenia tego rodzaju cienia.

Testowałem z setShadow itp., Ale jest to tylko utworzony cień.

Każdy pomysł, jak stworzyć ten rodzaj cienia?

Odpowiedz

6

Tworzenie cienia jako przezroczystą warstwą o określonej wielkości, a następnie utworzyć rozciągliwej obraz tak:

UIImage *shadowImage = [UIImage imageNamed:@"shadow.png"]; 
shadowImage = [shadowImage stretchableImageWithLeftCapWidth:floorf(shadowImage.size.width/2) topCapHeight:floorf(shadowImage.size.height/2)]; 

Następnie można umieścić, że jako obrazu w UIImageView ze skalą contentMode dopasować i go będzie działać tak, jak chcesz.

Powiedzmy, że widok nazywa się "myView". Możesz dodać cień tak:

UIImageView *shadowImageView = [[UIImageView alloc] initWithImage:shadowImage]; 
shadowImageView.contentMode = UIViewContentModeScaleToFill; 
shadowImageView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; 
shadowImageView.frame = myView.bounds; 
[myView addSubview:shadowImageView]; 
[shadowImageView release]; // only needed if you aren't using ARC 

Można również zrobić to w większości interfejsu konstruktora, jeśli wolisz, tak długo, jak utworzyć obraz rozciągliwej sam w kodzie.

+0

będę testować to teraz. – alexmngn

+0

Jak mogę zrobić, aby dodać ten obraz rozciągnięcia w tle mojego UIView? W metodzie 'backgroundColor' to nie działa. – alexmngn

+0

Czy widzisz drugą część mojej odpowiedzi na temat korzystania z UIImageView i dodawania go jako wyekspozycji do głównego widoku? –

1

To pytanie zostało już częściowo odpowiedział SO

view.layer.masksToBounds = NO; 
view.layer.cornerRadius = 8; // if you like rounded corners 
view.layer.shadowRadius = 5; 
view.layer.shadowOpacity = 0.5; 
CGFloat indent = 10; 
CGRect innerRect = CGRectMake(indent,indent,view.frame.size.width-2*indent,view.frame.size.height-2*indent); 
view.layer.shadowPath = [UIBezierPath bezierPathWithRect:innerRect].CGPath; 

Pobaw się ze zmiennymi aż swojego stylu cień.

UPDATE

Zamiast tego można wyciągnąć zewnętrzną cień na mniejszą środku widoku, który leży na wierzchu istniejącego widoku.

CGFloat indent = 10; 
CGRect innerRect = CGRectMake(indent,indent,view.frame.size.width-2*indent,view.frame.size.height-2*indent); 
UIView * shadowView = [[UIView alloc] initWithFrame:innerRect]; 
shadowView.backgroundColor = [UIColor clearColor]; 
shadowView.layer.masksToBounds = NO; 
shadowView.layer.cornerRadius = 8; // if you like rounded corners 
shadowView.layer.shadowRadius = 5; 
shadowView.layer.shadowOpacity = 0.5; 
shadowView.layer.shadowPath = [UIBezierPath bezierPathWithRect:shadowView.bounds].CGPath; 
[view addSubview:shadowView]; 
[shadowView release]; 
+0

To świetny sposób na narysowanie * zewnętrznego * cienia - ale nie jestem pewien, jak łatwo to zaadaptować, aby narysować * wewnętrzny * cień. –

+0

Umieszczając wyraźnie mniejszy widok na istniejącym widoku i rysując cień zewnętrzny na mniejszym wyraźnym wyglądzie. Dopóki mniejszy widok jest wyśrodkowany, powinieneś być w porządku. –

+3

To nie zadziała, cień zniknie na zewnątrz, zamiast ciemnieć. Nie sądzę też, aby przezroczyste widoki rzucały cienie. –