Oto alternatywa, która w ogóle nie wymaga odwrócenia ścieżki.
Masz fragment widoku, który zasadniczo ma być „clip out”:
Powiedzmy, że chcesz, aby biały obszar będzie [UIColor whiteColor]
z 75% alfa. Oto, jak szybko to zrobić:
- Tworzysz nową podklasę
UIView
.
Pogląd ten ma dwie właściwości:
@property (retain) UIColor *fillColor;
@property (retain) UIBezierPath *punchedOutPath;
przesłonić jego -drawRect:
sposób, aby to zrobić:
- (void)drawRect:(CGRect)rect {
[[self fillColor] set];
UIRectFill(rect);
CGContextRef ctx = UIGraphicsGetCurrentContext();
CGContextSetBlendMode(ctx, kCGBlendModeDestinationOut);
[[self punchedOutPath] fill];
CGContextSetBlendMode(ctx, kCGBlendModeNormal);
}
Jest pewien wyjątek tutaj: The fillColor
zdania muszą nie obejmują składnik alfa. Więc w twoim przypadku, chcesz, aby to było tylko [UIColor whiteColor]
. Następnie samodzielnie zastosuj bit alpha, dzwoniąc pod numer [myView setAlpha:0.75]
.
Co tu się dzieje: Jest to tryb mieszania o nazwie "Destination Out". Matematycznie jest zdefiniowany jako R = D*(1 - Sa)
, ale w kategoriach laika oznacza "Obraz docelowy wszędzie tam, gdzie obraz docelowy jest nieprzejrzysty, ale obraz źródłowy jest przezroczysty, a przezroczysty w innym miejscu".
Więc to będzie używać docelowego (czyli to, co już w kontekście) gdy nowy materiał jest przezroczysty (czyli na zewnątrz ścieżki Beziera), a następnie gdzie ścieżka Beziera będzie nieprzezroczysta, że materiał jest stanie się przezroczysty. Jednak obiekt docelowy musi już być nieprzejrzysty. Jeśli nie jest nieprzejrzysty, mieszanie nie robi tego, co chcesz. Dlatego musisz podać nieprzezroczysty UIColor
, a następnie wykonać dowolną przezroczystość bezpośrednio w widoku.
Pobiegłem ten sam, z tych okoliczności:
- okno ma
[UIColor greenColor]
tło
fillColor
jest biały
punchedOutPath
jest owalny to wkładce 10 punktów od krawędzi widoku.
- widok ma
alpha
z 0.75
Z powyższego kodu, otrzymuję to:
Wnętrze jest czyste zielone, a na zewnątrz ma półprzezroczystą nakładkę.
Aktualizacja
Jeśli pokrycie jest obraz, następnie trzeba utworzyć nowy obraz. Ale zasada jest ta sama:
UIImage* ImageByPunchingPathOutOfImage(UIImage *image, UIBezierPath *path) {
UIGraphicsBeginImageContextWithOptions([image size], YES, [image scale]);
[image drawAtPoint:CGPointZero];
CGContextRef ctx = UIGraphicsGetCurrentContext();
CGContextSetBlendMode(ctx, kCGBlendModeDestinationOut);
[path fill];
UIImage *final = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return final;
}
Można by następnie podjąć wynik tej funkcji i umieścić go w UIImageView
.
będzie to pełny okrąg lub otwarte okrągły kształt? Czy możesz podać obraz tego, czego oczekujesz? To nie musi być piękne, ale bardzo pomoże ludziom zrozumieć, co próbujesz zrobić, aby mogli ci pomóc. –
done..pracowałam nad dostarczeniem go dopiero odkąd dokonałem nagrody – Shubhank