Estou tentando obter o seguinte efeito usando um UITextView:
Basicamente, quero inserir uma imagem entre o texto. A imagem pode simplesmente ocupar 1 linha de espaço, então não há necessidade de empacotamento.
Tentei apenas adicionar um UIView à subvisualização:
UIView *pictureView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 25, 25)];
[pictureView setBackgroundColor:[UIColor redColor]];
[self.textView addSubview:pictureView];
Mas parece flutuar sobre o texto e cobri-lo.
Eu li um pouco sobre caminhos de exclusão, o que parece ser uma forma de implementar isso. No entanto, não quero posicionar absolutamente a imagem - em vez disso, ela deve fluir com o texto (semelhante ao <span>
comportamento em HTML).
Respostas:
Você precisará usar uma string atribuída e adicionar a imagem como instância de
NSTextAttachment
:fonte
replaceCharactersInRange
Código de @bilobatum convertido em Swift para quem precisa:
fonte
Você pode tentar usar NSAttributedString e NSTextAttachment. Dê uma olhada no link a seguir para obter mais detalhes sobre como personalizar o NSTextAttachment para redimensionar a imagem. http://ossh.com.au/design-and-technology/software-development/implementing-rich-text-with-images-on-os-x-and-ios/
No meu exemplo, eu redimensiono a imagem para caber na largura; no seu caso, você pode redimensionar a imagem para corresponder à altura da linha.
fonte
UIView
em aUIImage
e adicioná-lo como umNSTextAttachment
. Para renderizar a visualização de uma imagem, verifique esta pergunta: http://stackoverflow.com/questions/4334233/how-to-capture-uiview-to-uiimage-without-loss-of-quality-on-retina- display? lq = 1Expandindo a resposta de @ bilobatum e usando esta categoria de outra pergunta. Eu cozinhei isso:
Uso:
Implementação:
.
fonte
UIFont *fontForRange = [attributesForRange valueForKey:NSFontAttributeName];
paraUIFont *fontForRange = [attributesForRange valueForKey:NSFontAttributeName] ?: [UIFont fontWithName:@"HelveticaNeue" size:12.0];
deve ser melhor, porque [attributeForRange valueForKey: NSFontAttributeName] pode ser nulo se não estiver definido no dicionárioA solução do problema em um exemplo simples é
fonte