poner - teclado negro ios 11
¿Cómo evito que se estire la imagen de fondo de un botón? (9)
Lo que debes hacer es agregar tu imagen como UIImageView.
Luego agregue un botón con fondo transperent (UIColor ClearColor) encima con su ancho y alto deseados.
Estoy asignando un UIButtonTypeCustom UIButton a una UIView con una imagen de fondo que es más pequeña que el marco del botón. La razón por la cual la imagen es más pequeña es porque estoy tratando de agregar más de un "área objetivo" para el UIButton. Sin embargo, la imagen se está escalando al tamaño completo del marco, en lugar de solo ser el tamaño de la imagen.
He intentado configurar la propiedad imageView contentMode de UIButton y UIButton en "UIViewContentModeScaleAspectFit", pero no hay suerte, la imagen aún se alarga.
¿Hay alguna manera de hacer lo que estoy tratando de hacer programáticamente?
¡Gracias por adelantado!
Mucha gente comete el mismo error que tú en lo que respecta a las imágenes de los botones y luego salta por los aros tratando de hacer que el botón se comporte como lo esperaban. Vamos a aclarar esto de una vez por todas:
Un UIButton
tiene dos tipos de imágenes que puede mostrar: una imagen en primer plano y una imagen de fondo . Se espera que la imagen de fondo de un botón reemplace la textura de fondo del botón. Como tal, tiene sentido que se extienda para llenar todo el fondo . Sin embargo, se espera que la imagen de primer plano del botón sea un ícono que puede o no mostrarse junto con el texto; no se estirará Puede encogerse si el marco es más pequeño que la imagen, pero no se estirará. Incluso puede establecer la alineación de la imagen de primer plano utilizando las propiedades de alineación de control en el Generador de interfaces.
El primer plano y la imagen de fondo de un botón se pueden establecer en un código como este:
// stretchy
[self setBackgroundImage:backgroundImage forState:UIControlStateNormal];
// not stretchy
[self setImage:forgroundImage forState:UIControlStateNormal];
Otra consideración es la restricción BaseLine. Si sus botones tienen este conjunto de restricciones (representado como una línea horizontal o vertical a través de múltiples controles en su diseño), causará que sus imágenes se estiren sin estirar el control del botón subyacente. Si su botón está restringido adecuadamente (espacios inicial / final y superior / inferior, etc.) la eliminación de la restricción BaseLine no debería tener ningún impacto en el diseño, al tiempo que permite que la imagen de primer plano se adapte correctamente a la forma del botón subyacente.
Answerbot responde la pregunta con lo que es correcto y correcto hacer. No pelear contra el sistema operativo y usar las cosas como se espera siempre es un buen consejo. Sin embargo, a veces es necesario romper las reglas.
Pude enmascarar la imagen de fondo ampliada (no prevenirla) superponiéndola con un CAlayer negro y luego superponiéndolo con una imagen de tamaño correcto CAlayer. Todo esto se hizo creando una subclase de UIButton y sobrescribiendo el método setHighlighted.
¿NECESITA CÓDIGO?
- (void)setHighlighted:(BOOL)highlighted
{
super.highlighted = highlighted;
//
//Whenever an image needs to be highlighted, create a dimmed new image that is correctly sized. Below it is a englarged stretched image.
//
if (highlighted != _previousHighlightedSate)
{
_previousHighlightedSate = highlighted;
if (highlighted)
{
//Create a black layer so image can dim
_blackLayer = [CALayer layer];
_blackLayer.bounds = self.bounds;
CGRect rect = _blackLayer.bounds;
rect.size.width = rect.size.width*2;
rect.size.height = rect.size.height*2;
_blackLayer.bounds = rect;
_blackLayer.backgroundColor = [[UIColor blackColor] CGColor];
//create image layer
_nonStretchImageLayer = [CALayer layer];
_nonStretchImageLayer.backgroundColor = [UIColor blackColor].CGColor;
_nonStretchImageLayer.bounds = CGRectMake(0 , 0, self.bounds.size.width, self.bounds.size.height);
_nonStretchImageLayer.frame = CGRectMake(0 , 0, self.bounds.size.width, self.bounds.size.height);
_nonStretchImageLayer.contentsGravity = kCAGravityResizeAspect;//default is to resize
_nonStretchImageLayer.contents = (id)self.imageView.image.CGImage;
_nonStretchImageLayer.opacity = 0.5;
//add layers to image view
[self.imageView.layer addSublayer:_blackLayer];
[self.imageView.layer addSublayer:_nonStretchImageLayer];
}
else
{
//remove from image view
[_blackLayer removeFromSuperlayer];
[_nonStretchImageLayer removeFromSuperlayer];
//nil them out.
_blackLayer = nil;
_nonStretchImageLayer = nil;
}
}
La inspiración para este trabajo fue de aquí
Supongo que la solución más fácil es usar el método resizableImageWithCapInsets de UIImage. Use UIEdgeInsetsMake para configurar los espacios libres.
La manera más limpia y fácil es probablemente usar las inserciones del título del botón.
Establece su imagen como la imagen del botón, y luego cambia el recuadro izquierdo del título para que coincida menos el ancho de su imagen:
myButton.titleEdgeInsets = UIEdgeInsetsMake(0, -myImage.width, 0, 0)
Esto moverá el texto de regreso a donde estaba antes de que la imagen se agregara a su izquierda. También puede usar este valor para agregar algo de relleno a su botón.
Tropezó con este problema también.
Agregar imágenes mediante programación, como lo explicaron detalladamente los memmons, no ayudaron :(
Tenía un botón de 100x40 e imagen de 100x100, parecía comprimido, no ajustado, como se deduciría de la opción "Ajuste de aspecto". En realidad, ninguna de esas opciones de visualización tuvo un efecto.
Solo tuve que reescalarlo para que cupiera en un botón, luego use setImage:
UIImage *img=[UIImage imageNamed:@"myimage.png"];
CGImageRef imgRef = [img CGImage];
CGFloat imgW = CGImageGetWidth(imgRef);
CGFloat imgH = CGImageGetHeight(imgRef);
CGFloat btnW = myBttn.frame.size.width;
CGFloat btnH = myBttn.frame.size.height;
//get lesser button dimension
CGFloat minBtn=btnW;
if (btnW>btnH) {
minBtn=btnH;
}
//calculate scale using greater image dimension
CGFloat scl=imgH/minBtn;
if (imgW>imgH) {
scl=imgW/minBtn;
}
//scale image
UIImage *scaledImage = [UIImage imageWithCGImage:[img CGImage] scale:(img.scale * scl) orientation:(img.imageOrientation)];
//clean up
UIGraphicsEndImageContext();
//set it on a button
[myBttn setImage:scaledImage forState:UIControlStateNormal];
No tiene acceso a la imagen de fondo, pero hay una solución completamente operativa:
EDITAR : Hay una solución aún mejor que la que publiqué originalmente. Puede crear un UIImage de cualquier color y llamar a -setBackgroundImage:forState.
Vea bradley''s
respuesta bradley''s
, aquí: https://.com/a/20303841/1147286
Respuesta original:
En lugar de llamar a -setBackgroundImage:forState:
crea una nueva UIImageView y agrégala como una subvista del botón.
UIImageView *bgImageView = [[UIImageView alloc] initWithImage:img];
bgImageView.contentMode = UIViewContentModeScaleAspectFit;
[bgImageView setFrame:CGRectMake(0, 0, videoButton.frame.size.width, videoButton.frame.size.height)];
bgImageView.tag = 99;
[yourButton addSubview:bgImageView];
[yourButton bringSubviewToFront:yourButton.imageView];
- Crea la imagen
- Establecer el modo de contenido y el marco
- También establecí una etiqueta reconocible, de modo que cuando la pantalla gira puedo encontrar fácilmente mi imagen personalizada en las subvistas del botón y reiniciar su marco
- Agréguelo como una subvista al botón
- Lleva la imagen frontal frontal del botón al frente para que nuestro imageView personalizado no se superponga
Cuando el botón debe rotar, solo encuentra el imageView por su etiqueta y restablece su marco:
UIImageView *bgImageView = (UIImageView *)[button viewWithTag:99];
[bgImageView setFrame:CGRectMake(0, 0, newWidth, newHeight)];
Es simple como:
ImageBn.imageView?.contentMode = .scaleAspectFit
ImageBn.setImage(chosenImage, for: .normal)