Chcę niestandardowego UIView
...: Chciałem tylko pusty biały widok z zaokrąglonymi narożnikami i jasnym cieniem (bez efektu świetlnego). Mogę zrobić każdy z tych jeden po drugim, ale zwykle clipToBounds
/ maskToBounds
występują konflikty.
iphone
ios
cocoa-touch
uiview
rounded-corners
Aditya Vaidyam
źródło
źródło
Odpowiedzi:
Poniższy fragment kodu dodaje obramowanie, promień granicy i cień do
v
, oUIView
:Możesz dostosować ustawienia do swoich potrzeb.
Dodaj także szkielet QuartzCore do swojego projektu i:
Zobacz moją drugą odpowiedź dotyczącą
masksToBounds
.Uwaga
To może nie działać we wszystkich przypadkach. Jeśli okaże się, że ta metoda zakłóca inne wykonywane operacje rysowania, zapoznaj się z tą odpowiedzią .
źródło
Szybki
Odkrywanie opcji
Problem 1: Cień zostaje odcięty
Co się stanie, jeśli istnieją podwarstwy lub podviewy (takie jak obraz), których treść chcemy przyciąć do granic naszego widoku?
Możemy to osiągnąć za pomocą
(Alternatywnie
blueView.clipsToBounds = true
daje ten sam wynik .)Ale nie! Cień również został odcięty, ponieważ znajduje się poza granicami! Co robić? Co robić?
Rozwiązanie
Użyj osobnych widoków dla cienia i ramki. Widok podstawowy jest przezroczysty i ma cień. Widok granicy przycina każdy inny subkontynent do swoich granic.
Daje to następujący wynik:
Problem 2: Niska wydajność
Dodanie zaokrąglonych narożników i cieni może być hitem wydajności. Możesz poprawić wydajność, korzystając ze wstępnie zdefiniowanej ścieżki dla cienia, a także określając, że będzie on rasteryzowany. Poniższy kod można dodać do powyższego przykładu.
Zobacz ten post, aby uzyskać więcej informacji. Zobacz tutaj i tutaj również.
Ta odpowiedź została przetestowana w Swift 4 i Xcode 9.
źródło
baseView.backgroundColor = UIColor.clear
usuwa cień. Tylko wtedy, gdy ustawisz kolor tła, zobaczysz go.Jednym ze sposobów jest umieszczenie widoku z zaokrąglonymi narożnikami w widoku z cieniem.
Następnie możesz dodać shadowView w dowolnym miejscu.
źródło
Sprawdź przykładowy projekt na GitHub, aby upewnić się, że używasz składnika poprawnie.
Proste rozwiązanie Swift 5 bez żadnych dodatkowych widoków podrzędnych lub podklas:
Pamiętaj, że przed wywołaniem należy skonfigurować widok z promieniem narożnika i innymi właściwościami
addShadow
.Następnie po prostu wywołaj to w
viewDidLoad
ten sposób:Ostateczny wynik:
Super łatwe i proste!
źródło
layer.shadowPath = UIBezierPath.init(roundedRect: layer.bounds, cornerRadius: layer.cornerRadius).cgPath
. Nie mogę wyjaśnić, dlaczego, czy ktoś ma na to wytłumaczenie?To zadziałało dla mnie. Sztuczka polegała na przeniesieniu koloru tła z widoku głównego na warstwę.
źródło
UIView extension
tutaj - stackoverflow.com/a/43295741/1313939 dzięki za inspirację!Rozwiązałem problem przy użyciu następującej sztuczki podczas przypisywania ścieżki cienia do widoku kontenera:
Zauważ, że ścieżka podana do cienia jest zaokrąglonym prostokątem o tym samym promieniu narożnika, co tło, które zawiera komórka:
źródło
Jeśli walczysz z powodu zaokrąglenia
corners
vs.subviews
vs.masksToBounds
, spróbuj użyć mojej funkcji:nazwij to swoim zdaniem. czy Twój widok ma zaokrąglone rogi, bez względu na jego rozmiar, kształt - zostanie narysowany ładny cień.
Zachowaj tylko wartość zwracaną przez funkcję, aby móc się do niej odwoływać, gdy chcesz usunąć tabelę (lub na przykład użyć
insertSubview:aboveView:
)źródło
shadow.userInteractionEnabled = NO; // Modify this if needed
linię? Tak jest w razie potrzeby.userInteractionEnabled
jest podstawową i popularną własnością, którą powinieneś już znać :-)Używając Swift 4 i Xcode 9 , jest to praktyczny przykład zaokrąglania za
ImageView
pomocą cienia i obramowania.Jeśli chcesz, aby obraz był okrągły: (i wyświetlany bez obramowania)
źródło
Stworzyłem pomocnika na UIView
możesz to tak nazwać
Oto implementacja
źródło
Po całodniowym badaniu widoku okrągłego rogu z cieniem, cieszę się, że mogę tutaj zamieścić moją niestandardową klasę uiview, mam nadzieję zakończyć to pytanie:
RoundCornerShadowView.h
RoundCornerShadowView.m
więc NIE trzeba dodawać widoku podrzędnego w widoku ani poniżej w widoku docelowym, wystarczy dodać jedną warstwę w bieżącym widoku i wykonać 3 kroki, aby go ukończyć!
przyjrzyj się komentarzom w kodzie, pomocne jest zrozumienie komponentu!
źródło
Coś sprawnego przetestowane w swift 4
Produkuje
Jeśli włączysz to w Inspektorze w następujący sposób:
Dodanie atrybutu środowiska wykonawczego zdefiniowanego przez użytkownika, co spowoduje:
(Wcześniej dodałem
cornerRadius = 8
):)
źródło
Musisz użyć użycia
shadowView
iroundView
shadowView
roundView
shadowView
trochę rozłożyć w środku, a cień musi się rozjaśnić. Ustawinsets
tak, abyshadowView
był całkowicie niewidoczny z tyłuroundView
roundView
Kod
Lub możesz po prostu zrobić poniżej bez określania
clipToBounds/maskToBounds
źródło
Swift 3 i IB Rozwiązanie sprawdzalne:
Zainspirowane rozwiązaniem Ade
Najpierw utwórz rozszerzenie UIView:
Następnie po prostu wybierz UIView w kreatorze interfejsów, ustawiając cień na i promień narożnika , jak poniżej:
Wynik!
źródło
Oto rozwiązanie problemu konfliktu masksToBounds, działa dla mnie.
Po ustawieniu corderRadius / borderColor / shadow itd. Ustaw masksToBounds jako NIE:
źródło
Shadow + Border + Corner Radius
źródło
Oto moja wersja w Swift 3 dla UIView
źródło
Swift 4: Utwórz podklasę UIView
Za pomocą..
źródło
Cóż, jeśli nie chcesz zmieniać końcówek i wyświetlać hierarchii zgodnie z sugestią Davida C., ta metoda zrobi to za Ciebie. Aby dodać zaokrąglone rogi i cień do swojego UIImageView, po prostu użyj tej metody, na przykład:
(!) Ze względu na wydajność nie sądzę, że dobrym pomysłem jest używanie tego kodu w czegoś takiego jak UITableView, ponieważ ten kod zmienia hierarchię widoku. Zasugeruję więc zmianę końcówki i dodanie widoku kontenera dla efektu cienia i użycie kodu Davica C.
źródło
Stary wątek wciąż aktualny ...
Zredagowałem metodę Daniela Gindi, aby umożliwić jej użycie również z przyciskami itp. Jeśli ktoś potrzebuje zaokrąglonych rogów lub chce połączyć zaokrąglone rogi z ramką, należy ustawić je na warstwie widoku, która jest przekazywana do tej metody. Ustawiłem także rasteryzację, aby nieco ją przyspieszyć.
źródło
Poniższe działało dla mnie najlepiej (ten kod znajduje się w rozszerzeniu UIView, więc self oznacza niektóre UIView, do których musimy dodać cień i okrągły narożnik)
Główną różnicą między tym a innymi przykładami kodu jest to, że dodaje widok cienia jako widok rodzeństwa (w porównaniu z dodawaniem bieżącego widoku jako widoku podrzędnego widoku cienia), eliminując w ten sposób potrzebę modyfikacji istniejącej hierarchii widoku w jakikolwiek sposób.
źródło
Powyższa odpowiedź daniel.gindi załatwiła sprawę! (+1 Daniel) Jednak musiałem dokonać drobnych korekt - zmień rozmiar shadowFrame, aby był taki sam jak rozmiar ramki widoku, i włącz interakcję użytkownika. Oto zaktualizowany kod:
Chciałbym dodać, że w moim przypadku próbowałem dodać to do kontrolera widoku innej firmy, tj. Nie miałem bezpośredniej kontroli nad kodem. Oto jak użyłem powyższej funkcji:
źródło
Wprowadzam pewne zmiany w kodzie daniel.gindi
To wszystko, czego potrzebujesz, aby działało.
źródło
Aby
UIViews
to osiągnąć, musisz użyć dwóch . JedenUIView
będzie działał jak cień, a drugi będzie działał dla zaokrąglonej granicy.Oto fragment kodu a
Class Method
z pomocąprotocol
:W powyższym kodzie
btnCompose_click:
stanie się@required
metodą delegowaną, która zostanie uruchomiona po kliknięciu przycisku.I tutaj dodałem przycisk do mojego w
UIViewController
ten sposób:Wynik będzie wyglądał następująco:
źródło
Próbowałem tak wielu rozwiązań z tego postu i skończyłem z poniższym rozwiązaniem. Jest to w pełni sprawdzone rozwiązanie, chyba że musisz rzucić cień na czysty widok kolorów .
źródło
Oto rozwiązanie, które na pewno zadziała!
Utworzyłem rozszerzenie UIView z wymaganymi krawędziami, aby zastosować cień jak poniżej
Na koniec możesz wywołać funkcję cienia, jak poniżej, dla dowolnej podklasy UIView, możesz także określić krawędź, dla której chcesz zastosować cień, wypróbować różne warianty, w zależności od potrzeb zmieniając parametry poniższego wywołania metody.
Obraz wynikowy
źródło
Odpowiedź udzielona przez Evana Mulawskiego będzie działać idealnie. Problem polega na tym, że musisz ustawić kolor tła dla widoku clearColor, a właściwość masksToBounds na NO.
Możesz ustawić dowolny kolor widoku, ustawić go w podobny sposób
Mam nadzieję że to pomoże..
źródło
W ten sposób robisz to z zaokrąglonymi narożnikami i zaokrąglonymi cieniami bez zawracania sobie głowy ścieżkami.
Widok z zawartością, w moim przypadku UIImageView, ma promień narożnika i dlatego musi być maskowany do granic.
Tworzymy kolejny równy widok dla cieni, ustawiamy jego maskToBounds na NIE, a następnie dodajemy widok zawartości do widoku kontenera (np. ShadowContainer).
źródło
Piszę tę metodę kategorii UIView, aby rozwiązać ten problem, używa osobnych widoków dla cienia i promienia narożnika.
źródło
Swift 4 Rozwiązanie do tworzenia okrągłego UICollectionViewCell i dodawania cieni , bez żadnych rozszerzeń i komplikacji :)
Uwaga: W przypadku prostych widoków, np. Przyciski. Zobacz odpowiedź @ suragch w tym poście. https://stackoverflow.com/a/34984063/7698092 . Przetestowano pomyślnie pod kątem przycisków
W przypadku, jeśli ktoś nadal zmaga się zaokrąglić narożniki i dodać cienie w tym samym czasie. Chociaż to rozwiązanie działa z UICollectionViewCell, można je uogólnić na dowolny widok.
Ta technika działała dla mnie bez żadnych rozszerzeń i wszystkich skomplikowanych rzeczy. Pracuję z storyBoard.
Technika
Musisz dodać UIView (powiedzmy, że jest to „containerView”) w UICollectionViewCell w storyBoard i dodać wszystkie wymagane widoki (przyciski, obrazy itp.) Wewnątrz tego pojemnikaViewView. Zobacz zrzut ekranu.
Podłącz wylot do pojemnikaViewView. Dodaj następujące wiersze kodu w funkcji delegowania CellforItemAtIndexPath.
Wynik
Zobacz zrzut ekranu symulatora
źródło
źródło