UIButton不会去iPhone的Aspect Fit

我有一对夫妇UIButtons,在IB他们被设置为Aspect Fit,但由于某种原因,他们总是伸展。 还有什么你必须设置? 我尝试了所有不同的视图模式,没有一个工作,他们都伸展。

我以前有过这个问题。 我解决了这个问题,把我的图像放在一个UIImageView ,其中的contentMode设置实际上工作,并把一个透明的自定义UIButton放在上面。

编辑:这个答案已经过时了。 请参阅@Werner Altewischer在现代iOS版本中的正确答案。

解决方法是在UIButtonimageView属性上设置contentModeUIButton必须使用自定义types来创build,我相信(否则为此属性返回nil )。

这个方法对我很有效。

Xib中selectbutton并设置user defined runtime attributes

  • 关键path: self.imageView.contentMode
  • types: Number
  • 价值: 1

点击这里查看更清楚的解决scheme

我们使用数字,因为你不能在那里使用枚举。 但是UIViewContentModeScaleAspectFit等于1。

如果在Interface Builder中这样做,可以使用运行时属性检查器直接设置它,而不需要任何代码。

将button设置为“imageView.contentMode”,其types为“Number”,值为“1”(或者您希望的模式)。

imageview.contentMode = 1

如果将图像放在button后面的UIImageView ,将会失去UIButton类的内置function,例如adjustsImageWhenHighlightedadjustsImageWhenDisabled ,当然也可以为不同的状态设置不同的图像这自己)。

如果我们想要为所有控件状态创build一个图像,一个approuch是使用imageWithCGImage:scale:orientation获取图像,如下面的方法:

 - (UIImage *) getScaledImage:(UIImage *)img insideButton:(UIButton *)btn { // Check which dimension (width or height) to pay respect to and // calculate the scale factor CGFloat imgRatio = img.size.width / img.size.height, btnRatio = btn.frame.size.width / btn.frame.size.height, scaleFactor = (imgRatio > btnRatio ? img.size.width / btn.frame.size.width : img.size.height / btn.frame.size.height; // Create image using scale factor UIImage *scaledImg = [UIImage imageWithCGImage:[img CGImage] scale:scaleFactor orientation:UIImageOrientationUp]; return scaledImg; } 

为了实现这一点,我们会写:

 UIImage *scaledImg = [self getScaledImage:myBtnImg insideButton:myBtn]; [myBtn setImage:scaledImg forState:UIControlStateNormal]; 

这应该防止图像在所有控制状态下伸展。 它为我工作,但让我知道,如果没有!

注意:这里我们解决一个与UIButton相关的问题,但是insideButton:也可能是insideView:或者任何想要适合图像的东西。

我曾经有过这个问题。 我遇到的问题是我试图应用这个效果的背景UIButton是有限的,因此意味着你不能调整它很容易。

诀窍是把它设置为一个图像,然后应用@ ayreguitar的技术,应该修复它!

 UIButton *myButton = [UIButton buttonWithType:UIButtonTypeCustom]; [myButton setContentMode:UIViewContentModeScaleAspectFill]; [myButton setImage:@"myImage.png" forState:UIControlStateNormal]; 

这对我有效

 [button.imageView setContentMode:UIViewContentModeScaleAspectFit]; 

感谢@ayreguitar的评论

使用button的imageView for contentMode。 不直接在button本身。

 homeButton.imageView.contentMode = UIViewContentModeScaleAspectFit; homeButton.contentHorizontalAlignment = UIControlContentHorizontalAlignmentFill; homeButton.contentVerticalAlignment = UIControlContentVerticalAlignmentFill; [homeButton setImage:[UIImage imageNamed:kPNGLogo] forState:UIControlStateNormal]; 

这里有一个快速的替代答案:

 myButton.imageView?.contentMode = .ScaleAspectFit 

这个答案是基于@ WernerAltewischer的答案 。

为了避免连接我的button到一个IBOutlet来执行它的代码,我分类了UIButton的类:

 // .h @interface UIButtonWithImageAspectFit : UIButton @end // .m @implementation UIButtonWithImageAspectFit - (void) awakeFromNib { [self.imageView setContentMode:UIViewContentModeScaleAspectFit]; } @end 

现在在xib中创build一个自定义button,并设置它的图像(不是背景图像):

UIButtonWithImageAspectFit:创建和设置图像

然后,设置其类:

UIButtonWithImageAspectFit:设置自定义类

你完成了!
代替
没有图像方面适合的UIButton
button的图像方面适合现在正如所料:
与图像方面适合的UIButton

 btn.imageView.contentMode = UIViewContentModeScaleAspectFit; 

我有问题的图像没有按比例调整,所以我修正它的方式是使用边缘插入。

 fooButton.contentEdgeInsets = UIEdgeInsetsMake(10, 15, 10, 15); 

UIView内容模式适用于相应的CALayer的“内容”。 这适用于UIImageView因为它们将CALayer内容设置为相应的CGImage

drawRect:最终呈现给图层内容。

一个自定义的UIButton (据我所知)没有内容(圆angular矩形button可能使用内容呈现)。 该button具有子视图:背景UIImageView ,图像UIImageView和标题UILabel 。 在子视图上设置contentMode可以做你想做的事情,但是在UIButton视图层次结构中进行混乱是有点难的。

你可以像上面那样使用imageWithCGImage(但没有缺less括号)。

另外…数以百万计的非4.0手机将无法使用该代码。

[button sizeToFit]为我工作。

一个hacky解决scheme,不需要额外的uiviews:

添加你的背景图片并运行这个代码

  for (UIView * view in self.imageButton.subviews) { if ([view isKindOfClass:[UIImageView class]]) { ((UIImageView *)view).contentMode = UIViewContentModeScaleAspectFit; } } 

改变UIButton.imageView.contentMode不适合我。
我通过将图像设置为“背景”属性来解决问题。
如果需要,您可以添加比例约束

这与其他许多答案重叠,但对我来说,解决scheme是

  • 将button的UIImageViewcontentMode设置为.ScaleAspectFit – 可以在Interface Builder中的“User Defined Runtime Attributes”(即self.imageView.contentMode ,Number,1)或UIButton子类中完成。
  • 禁用“Autoresize子视图”;
  • 设置“边缘”为“图像”和适当的“顶部”和“底部”值为“插入”(可能只有当你像我一样,需要使用PDF作为图像)。

和@Guillaume类似,我创build了一个UIButton的子类作为Swift-File。 然后在Interface Builder中设置我的自定义类:

界面生成器

这里的Swift文件:

 import UIKit class TRAspectButton : UIButton { required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) self.imageView?.contentMode = .ScaleAspectFit } } 

将一些不同的答案组合成一个解决scheme – 创build一个自定义types的button,设置button的imageView contentMode属性,并设置button的图像(不是背景图像,它仍然会缩放填充)。

 //Objective-C: UIImage *image = [UIImage imageNamed:"myImageName.png"]; UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom]; [button setImage:image forState:UIControlStateNormal]; button.imageView.contentMode = UIViewContentModeScaleAspectFit; //Swift: let image = UIImage(named: "myImageName.png") let button = UIButton(type: .custom) button.imageView?.contentMode = .scaleAspectFit button.setImage(image, for: .normal) 

我有同样的问题,但我不能得到它的工作(也许这是与SDK的错误)。

最终,作为一种解决方法,我将UIImageView放置在button后面,然后设置我想要的选项,然后在其上放置一个空白的UIButton