Gradienty na UIView i UILabels na iPhone [duplikat]

Możliwy duplikat:
ręczne rysowanie gradientu w aplikacjach na iPhone ' a?

Moja aplikacja musi wyświetlać tekst w UIView LUB UILabel, ale podłoże musi być gradientem w przeciwieństwie do prawdziwego UIColor. Używanie programu graficznego do tworzenia pożądanego wyglądu nie jest dobre, ponieważ tekst może się różnić w zależności od danych zwracanych z serwera.

Czy ktoś zna najszybszy sposób na rozwiązanie tego problemu? Twoje myśli są bardzo mile widziane.
Author: Community, 2009-01-07

7 answers

Możesz również użyć graficznego obrazu o szerokości jednego piksela jako gradientu i ustawić właściwość view, Aby rozszerzyć grafikę w celu wypełnienia widoku(zakładając, że myślisz o prostym gradiencie liniowym, a nie jakiejś radialnej grafice).

 44
Author: Kendall Helmstetter Gelner,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-08 00:59:40

Zdaję sobie sprawę, że jest to starszy wątek, ale na przyszłość:

[[2]}począwszy od iPhone SDK 3.0, niestandardowe gradienty mogą być zaimplementowane bardzo łatwo, bez podklasowania lub obrazów, za pomocą nowego CAGradientLayer:
 UIView *view = [[[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 100)] autorelease];
 CAGradientLayer *gradient = [CAGradientLayer layer];
 gradient.frame = view.bounds;
 gradient.colors = [NSArray arrayWithObjects:(id)[[UIColor blackColor] CGColor], (id)[[UIColor whiteColor] CGColor], nil];
 [view.layer insertSublayer:gradient atIndex:0];
Spójrz na dokumenty CAGradientLayer. Opcjonalnie można określić punkty początkowe i końcowe (w przypadku, gdy nie chcesz liniowego gradientu przechodzącego od góry do dołu), a nawet określone lokalizacje, które odwzorowują każdy z kolorów.
 778
Author: Mirko Froehlich,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-14 23:06:16

Możesz użyć Grafiki rdzeniowej do narysowania gradientu, jak wskazano w odpowiedzi Mike ' a. Jako bardziej szczegółowy przykład, możesz utworzyć podklasę UIView, która będzie używana jako tło dla twojego UILabel. W podklasie UIView należy zastąpić metodę drawRect: i wstawić kod podobny do następującego:

- (void)drawRect:(CGRect)rect 
{
    CGContextRef currentContext = UIGraphicsGetCurrentContext();

    CGGradientRef glossGradient;
    CGColorSpaceRef rgbColorspace;
    size_t num_locations = 2;
    CGFloat locations[2] = { 0.0, 1.0 };
    CGFloat components[8] = { 1.0, 1.0, 1.0, 0.35,  // Start color
         1.0, 1.0, 1.0, 0.06 }; // End color

    rgbColorspace = CGColorSpaceCreateDeviceRGB();
    glossGradient = CGGradientCreateWithColorComponents(rgbColorspace, components, locations, num_locations);

    CGRect currentBounds = self.bounds;
    CGPoint topCenter = CGPointMake(CGRectGetMidX(currentBounds), 0.0f);
    CGPoint midCenter = CGPointMake(CGRectGetMidX(currentBounds), CGRectGetMidY(currentBounds));
    CGContextDrawLinearGradient(currentContext, glossGradient, topCenter, midCenter, 0);

    CGGradientRelease(glossGradient);
    CGColorSpaceRelease(rgbColorspace); 
}

Ten szczególny przykład tworzy biały, błyszczący gradient, który jest rysowany od góry UIView do jego pionowego środka. Możesz ustawić UIView ' s backgroundColor na co chcesz i ten połysk zostanie narysowany na wierzchu tego koloru. Można również narysować gradient promieniowy za pomocą funkcji CGContextDrawRadialGradient.

Musisz tylko odpowiednio Rozmiar UIView i dodać UILabel jako podgląd tego, aby uzyskać pożądany efekt.

EDIT (4/23/2009): zgodnie z sugestią St3fana, zastąpiłem ramkę widoku jego granicami w kodzie. Jest to poprawne w przypadku, gdy pochodzenie widoku nie jest (0,0).

 120
Author: Brad Larson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-19 00:43:54

Przy użyciu CAGradientLayer, w przeciwieństwie do CGGradient, gradient nie jest gładki, ale ma zauważalne Stopniowanie do niego. Zobacz ten przykład:

Aby uzyskać bardziej atrakcyjne wyniki, lepiej użyć CGGradient.

 71
Author: ThomasW,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-19 00:45:03

ODPOWIEDŹ Mirko Froehlicha zadziałała dla mnie, z wyjątkiem sytuacji, gdy chciałem użyć niestandardowych kolorów. Sztuczka polega na określeniu koloru interfejsu użytkownika z odcieniem, nasyceniem i jasnością zamiast RGB.

CAGradientLayer *gradient = [CAGradientLayer layer];
gradient.frame = myView.bounds;
UIColor *startColour = [UIColor colorWithHue:.580555 saturation:0.31 brightness:0.90 alpha:1.0];
UIColor *endColour = [UIColor colorWithHue:.58333 saturation:0.50 brightness:0.62 alpha:1.0];
gradient.colors = [NSArray arrayWithObjects:(id)[startColour CGColor], (id)[endColour CGColor], nil];
[myView.layer insertSublayer:gradient atIndex:0];

Aby uzyskać odcień, nasycenie i jasność koloru, użyj wbudowanego próbnika kolorów xcode i przejdź do karty HSB. W tym widoku barwa jest mierzona w stopniach, więc podziel wartość przez 360, aby uzyskać wartość, którą chcesz wprowadzić w kodzie.

 24
Author: Robert Wagstaff,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-26 13:02:15

To jest to, co mam pracy-ustawić UIButton w Xcode IB przezroczysty / jasny,i bez obrazu bg.

UIColor *pinkDarkOp = [UIColor colorWithRed:0.9f green:0.53f blue:0.69f alpha:1.0];
UIColor *pinkLightOp = [UIColor colorWithRed:0.79f green:0.45f blue:0.57f alpha:1.0];

CAGradientLayer *gradient = [CAGradientLayer layer];
gradient.frame = [[shareWordButton layer] bounds];
gradient.cornerRadius = 7;
gradient.colors = [NSArray arrayWithObjects:
                   (id)pinkDarkOp.CGColor,
                   (id)pinkLightOp.CGColor,
                   nil];
gradient.locations = [NSArray arrayWithObjects:
                      [NSNumber numberWithFloat:0.0f],
                      [NSNumber numberWithFloat:0.7],
                      nil];

[[recordButton layer] insertSublayer:gradient atIndex:0];
 15
Author: Anna Billstrom,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-05-25 03:54:01

Osiągam to w widoku z subview, który jest UIImageView. Obraz, na który wskazuje ImageView, jest gradientem. Następnie ustawiam kolor tła w widoku UIView i mam kolorowy gradientowy widok. Następnie używam widoku tak, jak muszę i wszystko, co narysuję, będzie pod tym gradientowym widokiem. Dodając drugi widok na górze ImageView, możesz mieć kilka opcji, Czy twój rysunek będzie poniżej lub powyżej gradientu...

 3
Author: mahboudz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-05-12 06:35:45