W jaki sposób zaokrąglony widok rect z przezroczystością jest wykonywany na iPhonie?

Wiele aplikacji wyświetla przezroczysty widok z zaokrąglonymi rogami i wskaźnikiem aktywności podczas czasochłonnej operacji.

Jak to się robi i czy można to zrobić po prostu używając Interface Builder(ponieważ jest wiele miejsc, z których chciałbym skorzystać)? Czy powinienem użyć imageview z zaokrąglonym prostym obrazem lub rozciągliwym obrazem? Czy muszę sam rysować tło?

Do tej pory udało mi się uzyskać podstawowy widok o podobnej przezroczystości przez ustawienie alphaValue w Interface Builder jednak nie ma zaokrąglonych rogów, a także przezroczystość wydaje się mieć zastosowanie do wszystkich podwidywań(nie chcę, aby wskaźnik tekst i activityindicator był przezroczysty, jednak nawet jeśli ustawiłem alphaValue na tych w IB wydaje się być ignorowany).

Author: frankodwyer, 2009-06-23

5 answers

view.layer.cornerRadius = radius;

Trudnym sposobem (który był wymagany w pierwszym SDK iPhone ' a) jest utworzenie własnej UIView podklasy za pomocą metody drawRect::

 CGContextRef context = UIGraphicsGetCurrentContext();
 CGContextSetRGBFillColor(context, 0,0,0,0.75);

 CGContextMoveToPoint(context, rect.origin.x, rect.origin.y + radius);
 CGContextAddLineToPoint(context, rect.origin.x, rect.origin.y + rect.size.height - radius);
 CGContextAddArc(context, rect.origin.x + radius, rect.origin.y + rect.size.height - radius, 
                radius, M_PI, M_PI / 2, 1); //STS fixed
 CGContextAddLineToPoint(context, rect.origin.x + rect.size.width - radius, 
                        rect.origin.y + rect.size.height);
 CGContextAddArc(context, rect.origin.x + rect.size.width - radius, 
                rect.origin.y + rect.size.height - radius, radius, M_PI / 2, 0.0f, 1);
 CGContextAddLineToPoint(context, rect.origin.x + rect.size.width, rect.origin.y + radius);
 CGContextAddArc(context, rect.origin.x + rect.size.width - radius, rect.origin.y + radius, 
                radius, 0.0f, -M_PI / 2, 1);
 CGContextAddLineToPoint(context, rect.origin.x + radius, rect.origin.y);
 CGContextAddArc(context, rect.origin.x + radius, rect.origin.y + radius, radius, 
                -M_PI / 2, M_PI, 1);

 CGContextFillPath(context);

Uwaga: rect ten kod powinien być pobrany z [self bounds] (lub z dowolnego miejsca, w którym go chcesz), nie będzie to miało sensu z rect przekazanym do metody drawRect:.

 47
Author: Kornel,
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-08-19 11:07:58

[[3]}od iPhone SDK 3.0, możesz po prostu użyć właściwości cornerRadius warstwy. Np.:

view.layer.cornerRadius = 10.0;

Wzdłuż tych samych linii można zmienić kolor i szerokość obramowania widoku:

view.layer.borderColor = [[UIColor grayColor] CGColor];
view.layer.borderWidth = 1;
 78
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
2009-10-30 17:58:57

Wyodrębniłem odpowiedź @lostInTransit na tę funkcję:

static void ContextAddRoundedRect(CGContextRef c, CGRect rect, CGFloat radius) {
  CGFloat minX = CGRectGetMinX(rect);
  CGFloat maxX = CGRectGetMaxX(rect);
  CGFloat minY = CGRectGetMinY(rect);
  CGFloat maxY = CGRectGetMaxY(rect);

  CGContextMoveToPoint(c, minX + radius, minY);
  CGContextAddArcToPoint(c, maxX, minY, maxX, minY + radius, radius);
  CGContextAddArcToPoint(c, maxX, maxY, maxX - radius, maxY, radius);
  CGContextAddArcToPoint(c, minX, maxY, minX, maxY - radius, radius);
  CGContextAddArcToPoint(c, minX, minY, minX + radius, minY, radius);
}

Który umieszcza ścieżkę w kontekście, z którym możesz zrobić, co możesz

Trochę inne połączenia CoreGraphics i nie zamknąłem ścieżki, gdybyś chciał dodać, że

CGContextFillPath(c);
 8
Author: bshirley,
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-03 19:05:16

Twoim zdaniem zrób to metodą drawRect

float radius = 5.0f;

CGRect rect = self.bounds;
CGContextRef context = UIGraphicsGetCurrentContext();   
rect = CGRectInset(rect, 1.0f, 1.0f);

CGContextBeginPath(context);
CGContextSetGrayFillColor(context, 0.5, 0.7);
CGContextMoveToPoint(context, CGRectGetMinX(rect) + radius, CGRectGetMinY(rect));
CGContextAddArc(context, CGRectGetMaxX(rect) - radius, CGRectGetMinY(rect) + radius, radius, 3 * M_PI / 2, 0, 0);
CGContextAddArc(context, CGRectGetMaxX(rect) - radius, CGRectGetMaxY(rect) - radius, radius, 0, M_PI / 2, 0);
CGContextAddArc(context, CGRectGetMinX(rect) + radius, CGRectGetMaxY(rect) - radius, radius, M_PI / 2, M_PI, 0);
CGContextAddArc(context, CGRectGetMinX(rect) + radius, CGRectGetMinY(rect) + radius, radius, M_PI, 3 * M_PI / 2, 0);

CGContextClosePath(context);
CGContextFillPath(context);

To sprawi, że Twój Zaokrąglony prostokąt będzie twoim widokiem. Pełny przykład można znaleźć w próbce HeadsUpUI dołączonej do zestawu SDK. HTH

 7
Author: lostInTransit,
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-06-23 13:03:56
 6
Author: casey,
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-05-05 14:41:11