UIButton不会去iPhone的Aspect Fit
我有一对夫妇UIButtons,在IB他们被设置为Aspect Fit,但由于某种原因,他们总是伸展。 还有什么你必须设置? 我尝试了所有不同的视图模式,没有一个工作,他们都伸展。
我以前有过这个问题。 我解决了这个问题,把我的图像放在一个UIImageView
,其中的contentMode
设置实际上工作,并把一个透明的自定义UIButton
放在上面。
编辑:这个答案已经过时了。 请参阅@Werner Altewischer在现代iOS版本中的正确答案。
解决方法是在UIButton
的imageView
属性上设置contentMode
。 UIButton
必须使用自定义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”(或者您希望的模式)。
如果将图像放在button后面的UIImageView
,将会失去UIButton
类的内置function,例如adjustsImageWhenHighlighted
和adjustsImageWhenDisabled
,当然也可以为不同的状态设置不同的图像这自己)。
如果我们想要为所有控件状态创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,并设置它的图像(不是背景图像):
然后,设置其类:
你完成了!
代替
button的图像方面适合现在正如所料:
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的
UIImageView
的contentMode
设置为.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
。