uiviewcontentmode fit content iphone uiview uitextview scaling

iphone - fit - Escalar UITextView utilizando la propiedad contentScaleFactor



content mode xcode (3)

Asegúrese de aplicar el contentScaleFactor a todas las subvistas de UITextView. Acabo de probar lo siguiente con una UITextView y encontré que funciona:

- (void)applyScale:(CGFloat)scale toView:(UIView *)view { view.contentScaleFactor = scale; view.layer.contentsScale = scale; for (UIView *subview in view.subviews) { [self applyScale:scale toView:subview]; } }

Estoy intentando crear una imagen de mayor resolución de una UIView, específicamente UITextView.

Esta pregunta y respuesta es exactamente lo que trato de entender:

desbordamiento de pila

Pero, cuando hago lo mismo, mi texto sigue borroso:

self.view.transform = CGAffineTransformMakeScale(2.f, 2.f); [myText setContentScaleFactor:2.f]; // myText is a subview of self.view object

También he intentado lo mismo en el proyecto de muestra de Apple "UICatalog" a UILabel y también es borroso.

No puedo entender por qué funcionaría para Warrior la otra pregunta y no para mí. Hubiera preguntado allí, pero no puedo dejar un comentario o una pregunta allí.

Cualquier sugerencia sería muy apreciada, gracias.


El ajuste del contentScaleFactor y contentsScale es, de hecho, la clave, como señaló @dbotha, sin embargo, tiene que recorrer la vista y jerarquías de capa por separado para llegar a cada CATiledLayer interno que realmente hace la representación del texto. Agregar la escala de pantalla también podría tener sentido.

Entonces, la implementación correcta sería algo como esto:

- (void)updateForZoomScale:(CGFloat)zoomScale { CGFloat screenAndZoomScale = zoomScale * [UIScreen mainScreen].scale; // Walk the layer and view hierarchies separately. We need to reach all tiled layers. [self applyScale:(zoomScale * [UIScreen mainScreen].scale) toView:self.textView]; [self applyScale:(zoomScale * [UIScreen mainScreen].scale) toLayer:self.textView.layer]; } - (void)applyScale:(CGFloat)scale toView:(UIView *)view { view.contentScaleFactor = scale; for (UIView *subview in view.subviews) { [self applyScale:scale toView:subview]; } } - (void)applyScale:(CGFloat)scale toLayer:(CALayer *)layer { layer.contentsScale = scale; for (CALayer *sublayer in layer.sublayers) { [self applyScale:scale toLayer:sublayer]; } }


UITextView tiene la propiedad textInputView , que "dibuja el texto y proporciona un sistema de coordenadas" ( https://developer.apple.com/reference/uikit/uitextinput/1614564-textinputview )

Así que estoy usando el siguiente código para escalar UITextView, sin ningún cambio de fuente, sin usar ninguna propiedad "CALayer" y manteniendo la alta calidad:

float screenScaleFactor = [[UIScreen mainScreen] scale]; float scale = 5.0; textView.transform = CGAffineTransformMakeScale(scale, scale); textView.textInputView.contentScaleFactor = screenScaleFactor * scale;

Comente la última línea si necesita escalamiento de baja calidad (pero de mejor rendimiento).

Transform usa view.center como punto central de escalado, por lo que es necesario agregar una "transformación de traducción" para escalar la esquina de la vista.