Chciałbym tylko dodać na odpowiedź Ramshad, w jaki sposób radzić sobie z poprawnym ramce.
W tym celu można rozważyć użycie UITextView zamiast UILabel, co nie daje dostępu do sposobu zarządzania układem tekstu. Po wyłączeniu edycji, wyboru i przewijania UITextView zachowuje się mniej więcej tak samo jak UILabel, z wyjątkiem niektórych dopełnień, które należy usunąć.
Dla wygody możesz dodać niewielką kategorię do UITextView, w której piszesz metodę sprawdzania, czy punkt dotyka dowolnego znaku w zakresie.
- (BOOL)point:(CGPoint)point touchesSomeCharacterInRange:(NSRange)range
{
NSRange glyphRange = [self.layoutManager glyphRangeForCharacterRange:range actualCharacterRange:NULL];
BOOL touches = NO;
for (NSUInteger index = glyphRange.location; index < glyphRange.location + glyphRange.length; index++) {
CGRect rectForGlyphInContainer = [self.layoutManager boundingRectForGlyphRange:NSMakeRange(index, 1) inTextContainer:self.textContainer];
CGRect rectForGlyphInTextView = CGRectOffset(rectForGlyphInContainer, self.textContainerInset.left, self.textContainerInset.top);
if (CGRectContainsPoint(rectForGlyphInTextView, point)) {
touches = YES;
break;
}
}
return touches;
}
Będzie to również działać w przypadku fragmentu tekstu zawierającego wiele wyrazów rozprzestrzeniających się w wielu wierszach z powodu zawijania wyrazów. Będzie również działać na zlokalizowanych tekstach, ponieważ mamy do czynienia z drukowanymi glifami.
Witaj Li, czy przetestowałeś ten kod? – Zeb