Wdrażam widok tabeli wyboru kolorów, w którym użytkownik może wybrać, powiedzmy, 10 kolorów (w zależności od produktu). Użytkownik może również wybrać inne opcje (takie jak pojemność dysku twardego, ...).
Wszystkie opcje kolorów znajdują się w osobnej sekcji widoku tabeli.
Chcę wyświetlić mały kwadrat po lewej stronie textLabel pokazujący rzeczywisty kolor.
W tej chwili dodaję prosty kwadratowy UIView, nadaj mu poprawny kolor tła, taki jak ten:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:RMProductAttributesCellID];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:RMProductAttributesCellID] autorelease];
cell.indentationWidth = 44 - 8;
UIView *colorThumb = [[[UIView alloc] initWithFrame:CGRectMake(8, 8, 28, 28)] autorelease];
colorThumb.tag = RMProductAttributesCellColorThumbTag;
colorThumb.hidden = YES;
[cell.contentView addSubview:colorThumb];
}
RMProductAttribute *attr = (RMProductAttribute *)[_product.attributes objectAtIndex:indexPath.section];
RMProductAttributeValue *value = (RMProductAttributeValue *)[attr.values objectAtIndex:indexPath.row];
cell.textLabel.text = value.name;
cell.textLabel.backgroundColor = [UIColor clearColor];
UIView *colorThumb = [cell viewWithTag:RMProductAttributesCellColorThumbTag];
colorThumb.hidden = !attr.isColor;
cell.indentationLevel = (attr.isColor ? 1 : 0);
if (attr.isColor) {
colorThumb.layer.cornerRadius = 6.0;
colorThumb.backgroundColor = value.color;
}
[self updateCell:cell atIndexPath:indexPath];
return cell;
}
Wyświetla się dobrze bez problemów.
Moim jedynym problemem jest to, że kiedy wybieram wiersz „kolorowy”, podczas animacji wyboru przejścia do niebieskiego moje niestandardowe UIView (colorThumb) jest ukryte. Ponownie staje się widoczny tuż po zakończeniu animacji wyboru / odznaczenia, ale powoduje to brzydki artefakt.
Co powinienem zrobić, aby to naprawić? Czy nie wstawiam podview we właściwym miejscu?
(W didSelectRowAtIndexPath nie ma nic specjalnego, po prostu zmieniam akcesorium komórki na pole wyboru lub nic i odznaczam bieżącą ścieżkę indexPath).
źródło
Odpowiedzi:
UITableViewCell
zmienia kolor tła wszystkich widoków podrzędnych, gdy komórka jest zaznaczona lub podświetlone, można rozwiązać ten problem poprzez nadpisanie komórka Tableview użytkownikasetSelected:animated
isetHighlighted:animated
i resetowanie kolor tła widoku.W celu C:
W Swift 3.1:
źródło
if (highlighted)
iif (selected)
warunki? Myślę, że to zadziała, jeśli nie mamy takich warunków.Jest tak, ponieważ komórka widoku tabeli automatycznie zmienia kolor tła wszystkich widoków w widoku zawartości dla podświetlonego stanu. Możesz rozważyć podklasę,
UIView
aby narysować kolor lub użyćUIImageView
niestandardowego rozciągniętego obrazu 1x1 px.źródło
setHighlighted:animated:
setSelected:animated:
Znaleziono dość eleganckie rozwiązanie zamiast zadzierać z metodami wyboru / podświetlania tableViewCell. Możesz utworzyć podklasę UIView, która ignoruje ustawianie koloru tła na czysty kolor.
Swift 3/4:
Swift 2:
Wersja Obj-C:
źródło
Innym sposobem na rozwiązanie problemu jest wypełnienie widoku gradientem rdzenia-grafiki, takim jak:
źródło
W przypadku Swift 2.2 to działa
a powód wyjaśniono przez @ Andriy
źródło
Zainspirowany Yatheesha BL „s odpowiedzi I stworzył UITableViewCell kategoria / rozszerzenie, które pozwala na włączanie i wyłączanie tej funkcji«przejrzystości».
Szybki
Cel C
KeepBackgroundCell jest kompatybilny z CocoaPods. Możesz go znaleźć na GitHub
źródło
Możesz
cell.selectionStyle = UITableViewCellSelectionStyleNone;
, a następnie ustawić kolor tła na- (void)tableView:(UITableView *)tableView didHighlightRowAtIndexPath:(NSIndexPath *)indexPath
źródło
Zainspirowany odpowiedzią Yatheesha BL .
Wywołanie super.setSelected (wybrane, animowane: animowane) spowoduje wyczyszczenie wszystkich ustawionych kolorów tła . Nie będziemy więc wywoływać metody super.
W Swift:
źródło
W przypadku majowym jest to Septs, aby uniknąć uzyskania szarego koloru dla wszystkich elementów w komórce (w przypadku korzystania z niestandardowej komórki widoku tabeli):
Ustaw opcję selectionStyle na .none 👉
selectionStyle = .none
Zastąp tę metodę.
Zadzwoń do super, aby skorzystać z superkonfiguracji.
Rób, co chcesz, podkreślając logikę.
źródło
UITableViewCell z jakiegoś powodu zmienia kolor tła wszystkich widoków podrzędnych przy wyborze.
To może pomóc:
DVColorLockView
Użyj czegoś takiego, aby powstrzymać UITableView przed zmianą koloru widoku podczas wyboru.
źródło
Narysuj widok zamiast ustawiać kolor tła
źródło
NAJPROSTSZE rozwiązanie bez błędów z animacją (jak w najwyżej ocenianej odpowiedzi) oraz bez podklas i rysowania - ustaw kolor obramowania warstwy zamiast tła Kolor i ustaw bardzo dużą szerokość obramowania.
źródło
Wypróbuj następujący kod:
źródło
Nie zapomnij, aby zastąpić
setSelected
, jak równieżsetHighlighted
źródło
Jest to podobne do odpowiedzi Pavla Gurova, ale bardziej elastyczne, ponieważ pozwala na utrwalenie dowolnego koloru.
źródło
Chciałem zachować domyślne zachowanie zaznaczania, z wyjątkiem jednego widoku podrzędnego komórki, który chciałem zignorować automatyczną zmianę koloru tła. Ale musiałem też móc zmienić kolor tła w innym czasie.
Rozwiązaniem, które wymyśliłem, było podklasowanie,
UIView
więc ignoruje normalne ustawianie koloru tła i dodaje osobną funkcję, aby ominąć ochronę.Szybki 4
źródło
oto moje rozwiązanie, użyj contentView, aby pokazać wybórKolor, działa idealnie
źródło
Umieść ten kod w swojej podklasie
UITableViewCell
Składnia Swift 3
źródło
Dodanie innego rozwiązania, jeśli używasz scenariuszy. Utworzenie podklasy
UIView
tego nie pozwala nabackgroundColor
ustawienie po początkowym ustawieniu.źródło
Jeśli powyższe rozwiązanie w tle nie rozwiązuje problemu, problem może leżeć
datasource
po Twojej stronie tableView.Dla mnie
BoxDataSource
tworzyłem instancję obiektu DataSource (wywoływanego ) do obsługi metod delegowania i dataSource tableView, ponieważ:Powodowało to zwolnienie przydziału dataSource za każdym razem, gdy komórka została dotknięta, a zatem cała zawartość zniknęła. Powodem jest dealokacja / zbieranie śmieci przez ARC.
Aby to naprawić, musiałem przejść do niestandardowej komórki, dodać zmienną źródła danych:
Następnie musisz ustawić źródło danych na źródło danych komórki,
var
które właśnie utworzyłeś w cellForRow, aby nie zostało to zwolnione za pomocą ARC.Mam nadzieję, że to pomaga.
źródło