UIButton不会去iPhone中的Aspect Fit

时间:2010-08-11 16:40:36

标签: ios iphone uibutton aspect-fit

我有几个UIButtons,在IB中他们设置为Aspect Fit,但由于某种原因,他们总是拉伸。还有别的东西要设置吗?我尝试了所有不同的视图模式,但没有一个能够工作,它们都可以延伸。

21 个答案:

答案 0 :(得分:218)

解决方案是在contentMode的{​​{1}}属性上设置imageView。必须使用自定义类型创建UIButton才能使用此工作我相信(否则会为此属性返回UIButton。)

答案 1 :(得分:47)

这种方法非常适合我。

Xib 中选择按钮并设置legendScrollView

  • 关键路径:user defined runtime attributes
  • 输入:self.imageView.contentMode
  • 价值:Number

Click here to see more clearly the solution

  

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

答案 2 :(得分:42)

我以前遇到过这个问题。我通过将我的图片放在UIImageView中来解决这个问题,其中contentMode设置实际上有效,并将透明的自定义UIButton置于其上方。

编辑:这个答案已经过时了。有关现代版iOS中的正确答案,请参阅@Werner Altewischer's answer

答案 3 :(得分:20)

如果您在Interface Builder中执行此操作,则可以使用运行时属性检查器直接设置它而无需任何代码。

将按钮上的键路径设置为“imageView.contentMode”,类型为“Number”,值为“1”(或者您想要的模式)。

imageview.contentMode = 1

答案 4 :(得分:12)

使用按钮的imageView for contentMode。不是直接在按钮上。

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

答案 5 :(得分:6)

如果您将图片放在按钮后面的UIImageView,则会失去UIButton类的内置功能,例如adjustsImageWhenHighlighted和{{ 1}},当然还有为不同状态设置不同图像的能力(没有自己动手做的事情)。

如果我们想要为所有控制状态取消保存图像,一个approuch是使用adjustsImageWhenDisabled获取图像,如下面的方法:

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:,或者是任何想要适合的问题图像进入。

答案 6 :(得分:6)

我有一段时间没遇到这个问题。我遇到的问题是我试图将此效果应用于背景UIButton,这是有限的,因此意味着你无法轻松调整它。

诀窍是将其设置为图像然后应用@ ayreguitar的技术,这应该解决它!

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

答案 7 :(得分:4)

将一些不同的答案组合成一个解决方案 - 创建一个自定义类型的按钮,设置按钮的imageView contentMode属性,并设置按钮的图像(不是背景图像,它仍然会缩放填补)。

//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)

答案 8 :(得分:4)

这对我有用

[button.imageView setContentMode:UIViewContentModeScaleAspectFit];

感谢@ayreguitar的评论

答案 9 :(得分:4)

这里是swift的替代答案:

myButton.imageView?.contentMode = .ScaleAspectFit

答案 10 :(得分:3)

btn.imageView.contentMode = UIViewContentModeScaleAspectFit;

答案 11 :(得分:2)

此答案基于@WernerAltewischer's answer

为了避免将我的按钮连接到IBOutlet以执行其上的代码,我将UIButton的类子类化:

// .h
@interface UIButtonWithImageAspectFit : UIButton
@end

// .m
@implementation UIButtonWithImageAspectFit

- (void) awakeFromNib {
    [self.imageView setContentMode:UIViewContentModeScaleAspectFit];
}

@end



现在在xib中创建一个自定义按钮,并设置其图像(而不是背景图像):

UIButtonWithImageAspectFit: create and set image


然后,设置其类:

UIButtonWithImageAspectFit: set custom class

你已经完成了!
而不是 UIButton without image aspect fit
按钮的图像宽高比现在符合预期:
UIButton with image aspect fit

答案 12 :(得分:1)

ios 12。 您还需要添加内容对齐

class FitButton: UIButton {

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)


    }

    override func layoutSubviews() {
        self.imageView?.contentMode = .scaleAspectFill
        self.contentHorizontalAlignment = .fill
        self.contentVerticalAlignment = .fill
        super.layoutSubviews()


    }

}

答案 13 :(得分:1)

这与许多其他答案重叠,但我的解决方案是

  • 将按钮的contentMode的{​​{1}}设置为UIImageView - 这可以在Interface Builder中的“用户定义的运行时属性”中完成(即{{1}。 },Number,1)或.ScaleAspectFit子类;
  • 禁用“自动调整子视图”;
  • 将“Edge”设置为“Image”,并为“Inset”设置相应的“Top”和“Bottom”值(如果您像我一样使用PDF作为图像,则可能只需要这些值。)

答案 14 :(得分:1)

我的图像没有按比例调整大小的问题所以我修复它的方法是使用边缘插入。

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

答案 15 :(得分:1)

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

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

自定义UIButton(据我所知)没有内容(圆角矩形样式按钮可能使用内容呈现)。该按钮包含子视图:背景UIImageView,图片UIImageView和标题UILabel。在子视图上设置contentMode可能会做你想要的,但是弄乱UIButton视图层次结构有点不可能。

答案 16 :(得分:0)

更改UIButton.imageView.contentMode对我不起作用。
我通过将图片设置为“背景”属性来解决问题。
如果需要,可以添加比率约束

答案 17 :(得分:0)

[button sizeToFit]为我工作。

答案 18 :(得分:0)

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

interface builder

这里是Swift文件:

import UIKit

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

答案 19 :(得分:0)

您可以使用如上所示的imageWithCGImage(但没有丢失的括号)。

此外......数以百万计的非4.0手机根本无法使用该代码。

答案 20 :(得分:-1)

我有同样的问题,但我无法让它工作(也许这是SDK的一个错误)。

最后,作为解决方法,我在我的按钮后面添加了UIImageView并在其上设置了我想要的选项,然后只需在其上放置一个空白UIButton