Chciałbym dołączyć NSTextAttachment
obraz do mojego przypisanego ciągu i ustawić go w pionie.
Użyłem następującego kodu, aby utworzyć mój ciąg:
NSMutableAttributedString *str = [[NSMutableAttributedString alloc] initWithString:DDLocalizedString(@"title.upcomingHotspots") attributes:attrs];
NSTextAttachment *attachment = [[NSTextAttachment alloc] init];
attachment.image = [[UIImage imageNamed:@"help.png"] imageScaledToFitSize:CGSizeMake(14.f, 14.f)];
cell.textLabel.attributedText = [str copy];
Jednak obraz wydaje się być wyrównany do górnej części komórki textLabel
.
Jak mogę zmienić prostotę, w której jest narysowany załącznik?
ios
objective-c
swift
uilabel
nstextattachment
Sean Danzeiser
źródło
źródło
Odpowiedzi:
Możesz zmienić prostokąt przez podklasę
NSTextAttachment
i nadpisanieattachmentBoundsForTextContainer:proposedLineFragment:glyphPosition:characterIndex:
. Przykład:To nie jest idealne rozwiązanie. Musisz znaleźć punkt początkowy Y „na oko”, a jeśli zmienisz czcionkę lub rozmiar ikony, prawdopodobnie będziesz chciał zmienić początek Y. Ale nie mogłem znaleźć lepszego sposobu, poza umieszczeniem ikony w osobnym widoku obrazu (który ma swoje wady).
źródło
Możesz użyć capHeight czcionki.
Cel C
Szybki
Obraz załącznika jest renderowany na linii bazowej tekstu. Jego oś y jest odwrócona, podobnie jak układ współrzędnych grafiki rdzenia. Jeśli chcesz przesunąć obraz w górę, ustaw
bounds.origin.y
pozytyw.Obraz powinien być wyrównany w pionie do środka z górną wysokością tekstu. Więc musimy ustawić
bounds.origin.y
to(capHeight - imageHeight)/2
.Unikając efektu postrzępienia na obrazie, powinniśmy zaokrąglić część ułamkową y. Ale czcionki i obrazy są zwykle małe, nawet różnica 1 piksela sprawia, że obraz wygląda na źle wyrównany. Więc zastosowałem funkcję zaokrąglania przed podzieleniem. Sprawia, że ułamek jest częścią wartości y na .0 lub .5
W twoim przypadku wysokość obrazu jest większa niż capHeight czcionki. Ale możesz użyć tego samego sposobu. Wartość przesunięcia y będzie ujemna. I zostanie to ułożone od dołu linii bazowej.
źródło
Spróbuj
- [NSTextAttachment bounds]
. Nie jest wymagana żadna podklasa.Dla kontekstu renderuję a
UILabel
do użycia jako obraz załącznika, a następnie ustawiam granice w ten sposób:attachment.bounds = CGRectMake(0, self.font.descender, attachment.image.size.width, attachment.image.size.height)
i linie bazowe tekstu w obrazie etykiety i tekstu w przypisanej linii ciągów zgodnie z potrzebami.źródło
attachment.bounds = CGRect(x: 0.0, y: self.font.descender, width: attachment.image!.size.width, height: attachment.image!.size.height)
descender
własności UIFont!Znalazłem na to idealne rozwiązanie, dla mnie działa jak urok, jednak trzeba to wypróbować samemu (pewnie stała zależy od rozdzielczości urządzenia i może cokolwiek;)
Powinien działać i nie powinien być w żaden sposób rozmyty (dzięki
CGRectIntegral
)źródło
Co powiesz na:
Brak konieczności tworzenia podklas
źródło
@Travis ma rację, że przesunięcie jest zmniejszeniem czcionki. Jeśli chcesz również przeskalować obraz, będziesz musiał użyć podklasy NSTextAttachment. Poniżej znajduje się kod, którego inspiracją był ten artykuł . Opublikowałem to również jako sedno .
Użyj w następujący sposób:
źródło
Jeśli masz bardzo dużą ascendencję i chcesz wyśrodkować obraz (środek wysokości kapelusza), tak jak ja, spróbuj tego
Obliczenie y jest takie, jak na poniższym obrazku
Zwróć uwagę, że wartość y wynosi 0, ponieważ chcemy, aby obraz przesunął się w dół od początku
Jeśli chcesz, aby znajdował się pośrodku całej etykiety, użyj tej wartości y:
źródło
W Swift 4 możemy zrobić rozszerzenie, które generuje załącznik z wyśrodkowanym obrazem, takim jak ten:
Następnie możesz nawiązać połączenie, wysyłając nazwę obrazu i czcionkę:
Następnie dołącz atrybut imageAttachment do atrybutu attributeString
źródło
W moim przypadku pomogło wywołanie sizeToFit (). W szybkim 5.1
Wewnątrz Twojej etykiety niestandardowej:
źródło
Proszę użyć -lineFrag.size.height / 5.0 dla wysokości granic. Powoduje to dokładne wyśrodkowanie obrazu i wyrównanie z tekstem dla wszystkich rozmiarów czcionek
źródło
-lineFrag.size.height/5.0
nie jest poprawne. Zamiast tego jest to descender czcionki.