如何防止button的背景图像拉伸?

我将一个UIButtonTypeCustom UIButton分配给一个背景图像小于button的框架的UIView。 为什么图像更小的原因是因为我试图为UIButton添加更多的“目标区域”。 然而,图像正在缩放到框架的整个大小,而不仅仅是图像的大小。

我试图将UIButton和UIButton的imageView contentMode属性设置为“UIViewContentModeScaleAspectFit”,但没有运气,图像仍然伸出。

有没有办法做我想要以编程方式做?

提前致谢!

很多人在button图像方面犯了同样的错误,然后跳过箍环,试图使button按照预期行事。 让我们一劳永逸的澄清:

一个UIButton有两种types的图像可以显示 – 前景图像和背景图像 。 预计button的背景图像将replacebutton的背景纹理。 因此, 延伸到整个背景是有道理的。 但是, 该button的前景图像应该是一个图标,可能会或可能不会显示旁边的文字; 它不会伸展。 如果画面小于图像,则可能会缩小,但不会拉伸。 您甚至可以使用Interface Builder中的“控件”alignment属性来设置前景图像的alignment方式。

一个button的前景和背景图像可以像这样设置代码:

 // stretchy [self setBackgroundImage:backgroundImage forState:UIControlStateNormal]; // not stretchy [self setImage:forgroundImage forState:UIControlStateNormal]; 

您无权访问背景图像视图, 但是完全有效的解决方法:

编辑 :有一个更好的解决方法,然后我最初发布。 你可以用任何颜色创build一个UIImage,并调用-setBackgroundImage:forState.

请参阅bradley's答案,在这里: https : //stackoverflow.com/a/20303841/1147286


原始答案:

而不是调用-setBackgroundImage:forState:创build一个新的UIImageView并将其添加为button的子视图。

 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]; 
  1. 创buildimageview
  2. 设置内容模式和框架
  3. 我还设置了一个可识别的标签,以便当屏幕旋转时,我可以轻松地在button的子视图中find我自定义的imageView并重置其框架
  4. 将它作为子视图添加到button
  5. 把button的正面imageView到前面,所以我们自定义的imageView不会重叠

当button需要旋转只是findimageView的标签,并重置其框架:

 UIImageView *bgImageView = (UIImageView *)[button viewWithTag:99]; [bgImageView setFrame:CGRectMake(0, 0, newWidth, newHeight)]; 

最简洁的方法可能是使用button的标题插入。

将图像设置为button图像,然后更改左侧标题插图以匹配图像的宽度减去:

 myButton.titleEdgeInsets = UIEdgeInsetsMake(0, -myImage.width, 0, 0) 

这会将文本移回到图像添加到其左侧之前的位置。 你也可以使用这个值来为你添加一些填充button。

另一个考虑因素是BaseLine约束。 如果您的button具有此约束集(通过布局上的多个控件描绘为水平或垂直线),则会导致您的图像拉伸,而不会拉伸底层的button控件。 如果您的button被正确约束(前导/尾随和顶部/底部空间等),删除BaseLine约束应该不会影响布局,同时允许前景图像正确缩放到底层的button形状。

我想最简单的解决scheme是使用UIImage的resizableImageWithCapInsets方法。 使用UIEdgeInsetsMake来configuration空闲空间。

也偶然发现了这个问题。

以编程方式添加图像,作为彻底解释的记事,没有帮助:(

我有一个button100x40和图像100×100,它会出现挤压,不适合,从“方面适合”选项可以推断。 实际上,这些视图选项都没有效果。

我只是不得不重新调整它,所以它适合一个button,然后使用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]; 

这很简单:

  ImageBn.imageView?.contentMode = .scaleAspectFit ImageBn.setImage(chosenImage, for: .normal) 

Answerbot回答这个问题是正确的和正确的。 不要打击操作系统,并按照预期使用的东西总是很好的build议。 但是,有时你需要打破规则。

我能够掩盖放大的背景图像(不能阻止它)与黑色CAlayer覆盖,然后再次与适当resize的图像CAlayer覆盖。 这一切都是通过创buildUIButton的子类并覆盖setHighlighted方法来完成的。

需要的代码?

 - (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; } } 

对这项工作的启示来自这里

你需要做的是添加你的形象作为UIImageView。

在它的顶部添加一个带有透明背景(UIColor ClearColor)的button,并使用所需的宽度和高度。