你如何让背景图像快速缩放到屏幕大小?

Posted

技术标签:

【中文标题】你如何让背景图像快速缩放到屏幕大小?【英文标题】:How do you make a background image scale to screen size in swift? 【发布时间】:2014-11-26 15:39:44 【问题描述】:

我正在尝试使用模式图像快速为我的背景制作 UIView 图像。除了我希望图像占据整个屏幕之外,我的代码运行良好。我的代码如下所示:self.view.backgroundColor = UIColor(patternImage: UIImage(named: "backgroundImage")!)

有谁知道如何使背景成为占据整个屏幕的图像,并且在出现在不同的 iPhone 屏幕尺寸时会缩放?

【问题讨论】:

【参考方案1】:

注意:

我从我的旧帐户发布了这个答案(对我来说已弃用,我无法再访问它),这是我的improved answer。


您可以通过编程来完成,而不是在每个视图中创建一个 IBOutlet。 只需创建一个 UIView extension (File -> New -> File -> Swift File -> 随便命名) 并添加:

extension UIView 
func addBackground() 
    // screen width and height:
    let width = UIScreen.mainScreen().bounds.size.width
    let height = UIScreen.mainScreen().bounds.size.height

    let imageViewBackground = UIImageView(frame: CGRectMake(0, 0, width, height))
    imageViewBackground.image = UIImage(named: "YOUR IMAGE NAME GOES HERE")

    // you can change the content mode:
    imageViewBackground.contentMode = UIViewContentMode.ScaleAspectFill

    self.addSubview(imageViewBackground)
    self.sendSubviewToBack(imageViewBackground)

现在,您可以在视图中使用此方法,例如:

override func viewDidLoad() 
    super.viewDidLoad()

    self.view.addBackground()

【讨论】:

让 imageViewBackground = UIImageView(frame: UIScreen.mainScreen().bounds) 一段很棒的代码,但我有一个小问题,背景的大小应该是多少才能适合不同比例的所有屏幕 @MinaFawzy 谢谢你的提问,你可能想检查我改进的答案,它应该包含你的答案:)【参考方案2】:

只需添加您的 UIImageView 定位 居中并且所有边缘都与边缘对齐。把它留在那里 点击右下角,如下图所示,现在继续 为顶部、底部、左侧和右侧边缘添加 4 个约束。

现在只需选择您的图像视图并使用 IB 检查器选择如何 您想要您的图像:填充或适合,如下所示:

【讨论】:

【参考方案3】:

这是我previous one 的更新答案。

和我之前的回答一样,你可以创建一个 UIView 的扩展,并在其中添加addBackground() 方法,如下:

记住:如果你将它添加到一个新的 .swift 文件中,记得添加import UIKit

extension UIView 
    func addBackground(imageName: String = "YOUR DEFAULT IMAGE NAME", contentMode: UIView.ContentMode = .scaleToFill) 
        // setup the UIImageView
        let backgroundImageView = UIImageView(frame: UIScreen.main.bounds)
        backgroundImageView.image = UIImage(named: imageName)
        backgroundImageView.contentMode = contentMode
        backgroundImageView.translatesAutoresizingMaskIntoConstraints = false

        addSubview(backgroundImageView)
        sendSubviewToBack(backgroundImageView)

        // adding NSLayoutConstraints
        let leadingConstraint = NSLayoutConstraint(item: backgroundImageView, attribute: .leading, relatedBy: .equal, toItem: self, attribute: .leading, multiplier: 1.0, constant: 0.0)
        let trailingConstraint = NSLayoutConstraint(item: backgroundImageView, attribute: .trailing, relatedBy: .equal, toItem: self, attribute: .trailing, multiplier: 1.0, constant: 0.0)
        let topConstraint = NSLayoutConstraint(item: backgroundImageView, attribute: .top, relatedBy: .equal, toItem: self, attribute: .top, multiplier: 1.0, constant: 0.0)
        let bottomConstraint = NSLayoutConstraint(item: backgroundImageView, attribute: .bottom, relatedBy: .equal, toItem: self, attribute: .bottom, multiplier: 1.0, constant: 0.0)

        NSLayoutConstraint.activate([leadingConstraint, trailingConstraint, topConstraint, bottomConstraint])
    

请注意,此答案的更新是:

Swift 4 代码? 以编程方式添加- NSLayoutConstraints:这是因为在应用我之前的回答中提到的内容时,它适用于当前设备方向,但当应用程序不支持时纵向/横向两种模式,如果设备方向已经改变,背景imageView的大小将相同(相同大小)并且不适应设备屏幕的新宽度/高度,因此添加约束应该可以解决这个问题。 添加默认参数:为了获得更大的灵活性,您可能 - 有时 - 想要更改默认图像甚至是背景的上下文模式:

用法:

假设你想在viewDidLoad()中调用它:

override func viewDidLoad() 
    //...

    // you can call 4 versions of addBackground() method

    // 1- this will add it with the default imageName and default contextMode
    view.addBackground()

    // 2- this will add it with the edited imageName and default contextMode
    view.addBackground(imageName: "NEW IMAGE NAME")

    // 3- this will add it with the default imageName and edited contextMode
    view.addBackground(contentMode: .scaleAspectFit)

    // 4- this will add it with the default imageName and edited contextMode
    view.addBackground(imageName: "NEW IMAGE NAME", contextMode: .scaleAspectFit)

【讨论】:

伟大的贡献!但是,有一个错误:内部名称应该是 contentMode 而不是 ContextMode。所以函数应该是这样的:func addBackground(imageName: String = "YOUR DEFAULT IMAGE NAME", contentMode: UIViewContentMode = .scaleToFill) 而之前你有这个:func addBackground(imageName: String = "YOUR DEFAULT IMAGE NAME", contextMode: UIViewContentMode = .scaleToFill)【参考方案4】:

这是您的缩放选项!

对于 .contentMode 属性:

缩放填充 这将缩放图像视图内的图像以填充图像视图的整个边界。

ScaleAspectFit 这将确保图像视图内的图像具有正确的纵横比并适合图像视图的边界。

ScaleAspectFill 这将确保图像视图内的图像具有正确的纵横比并填充图像视图的整个边界。 要使该值正常工作,请确保您已将 imageview 的 clipsToBounds 属性设置为 true。

class SecondViewController : UIViewController 

    let backgroundImage = UIImage(named: "centralPark")
    var imageView: UIImageView!

    override func viewDidLoad() 
        super.viewDidLoad()
        self.thirdChoiceField.delegate = self
        self.datePicker.minimumDate = NSDate()
        imageView = UIImageView(frame: view.bounds)
        imageView.contentMode = .ScaleAspectFill
        imageView.clipsToBounds = true
        imageView.image = backgroundImage
        imageView.center = view.center
        view.addSubview(imageView)
        self.view.sendSubviewToBack(imageView)

【讨论】:

【参考方案5】:

Swift 3.0 中的 Ahmad Fayyas 解决方案

func addBackground() 
    let width = UIScreen.main.bounds.size.width
    let height = UIScreen.main.bounds.size.height

    let imageViewBackground = UIImageView(frame: CGRect(x:0, y:0, width: width, height: height))
    imageViewBackground.image = UIImage(named: "YOUR IMAGE NAME GOES HERE")

    // you can change the content mode:
    imageViewBackground.contentMode = UIViewContentMode.scaleAspectFill

    self.view.addSubview(imageViewBackground)
    self.view.sendSubview(toBack: imageViewBackground)

【讨论】:

感谢您的努力!请检查我的improved answer :)【参考方案6】:

我将我的答案显示为哪些代码行对我有帮助...

扩展文件代码....

    extension UIView 
        func addBackground() 
            let width = UIScreen.main.bounds.size.width
            let height = UIScreen.main.bounds.size.height

            let imageViewBackground = UIImageView(frame: CGRect(x: 0, y: 0, width: width, height: height))
            imageViewBackground.image = UIImage(named: "Your Background Image Name")

            imageViewBackground.contentMode = .scaleAspectFill

            self.addSubview(imageViewBackground)
            self.sendSubviewToBack(imageViewBackground)
        
    

在视图控制器文件中......

    override func viewDidLoad() 
        super.viewDidLoad()
        view.addBackground()
    
    

谢谢你们!

【讨论】:

【参考方案7】:

这使用PureLayout。您可以使用 AutoLayout 多几行。

UIImageView* imgView = UIImageView(image: myUIImage)
imgView.setTranslatesAutoresizingMaskIntoConstraints(false)
self.view.addSubview(imgView)
self.view.addConstraints(imgView.autoPinEdgesToSuperviewEdgesWithInsets(UIEdgeInsetsMake(0,0,0,0))

【讨论】:

仅供参考 - 您无需使用 PureLayout 调用 addConstraints - 默认情况下会自动安装(激活)约束。上面的代码实际上会双重添加约束。 感谢您的信息!这使得 API 更加简洁。【参考方案8】:

我使用约束使图像“自动布局”。我做了一个视图来显示一个活动指示器(带有完整的背景图像),而 segue 上的视图正在加载。代码如下。

var containerView: UIView = UIView()
var actionIndicator: UIActivityIndicatorView = UIActivityIndicatorView()

private func showActivityIndicator() 
    ///first I set the containerView and the background image
    containerView.translatesAutoresizingMaskIntoConstraints = false
    self.view.addSubview(containerView)
    adjustConstFullSize(containerView, parentView: self.view)
    let backImage = UIImageView(image: UIImage(named: "AppBackImage"))
    backImage.contentMode = UIViewContentMode.ScaleAspectFill
    backImage.translatesAutoresizingMaskIntoConstraints = false
    containerView.addSubview(backImage)
    adjustConstFullSize(backImage, parentView: containerView)

    ////setting the spinner (activity indicator)
    actionIndicator.frame = CGRectMake(0.0, 0.0, 40.0, 40.0)
    actionIndicator.center = CGPointMake(containerView.bounds.size.width / 2, containerView.bounds.size.height / 2)
    actionIndicator.hidesWhenStopped = true
    actionIndicator.activityIndicatorViewStyle = UIActivityIndicatorViewStyle.WhiteLarge
    containerView.insertSubview(actionIndicator, aboveSubview: backImage)

    ///throw the container to the main view
    view.addSubview(containerView)
    actionIndicator.startAnimating()

这是“adjustConstFullSize”函数的代码。

func adjustConstFullSize(adjustedView: UIView!, parentView: UIView!) 
    let topConstraint = NSLayoutConstraint(item: adjustedView,
        attribute: .Top,
        relatedBy: .Equal,
        toItem: parentView,
        attribute: .Top,
        multiplier: 1.0,
        constant: 0.0)

    let leftConstraint = NSLayoutConstraint(item: adjustedView,
        attribute: .Leading,
        relatedBy: .Equal,
        toItem: parentView,
        attribute: .Leading,
        multiplier: 1.0,
        constant: 0.0)

    let rightConstraint = NSLayoutConstraint(item: adjustedView,
        attribute: .Trailing,
        relatedBy: .Equal,
        toItem: parentView,
        attribute: .Trailing,
        multiplier: 1.0,
        constant: 0.0)


    let bottomConstraint = NSLayoutConstraint(item: adjustedView,
        attribute: .Bottom,
        relatedBy: .Equal,
        toItem: parentView,
        attribute: .Bottom,
        multiplier: 1.0,
        constant: 0.0)

    parentView.addConstraints([topConstraint, leftConstraint, rightConstraint, bottomConstraint])

在上面显示的函数中,我将 containerView 约束“绑定”到主视图约束,使视图“全尺寸”。我对 UIImageView 做了同样的事情,并将 contentMode 设置为 AspectFill - 这很重要,因为我们希望图像在不拉伸的情况下填充内容。

要删除视图,延迟加载后,只需使用下面的代码。

private func hideActivityIndicator() 
    actionIndicator.stopAnimating()
    containerView.removeFromSuperview()

【讨论】:

【参考方案9】:

为此,我认为您需要创建一个固定到父视图顶部/底部/左侧/右侧的 UIImageView。这将使 UIImageView 始终与显示的大小相匹配。只需确保将图像视图上的内容模式设置为 AspectFit

var newImgThumb : UIImageView
newImgThumb = UIImageView(view.bounds)
newImgThumb.contentMode = .ScaleAspectFit
view.addSubview(newImgThumb)

//Don't forget this line
newImgThumb.setTranslatesAutoresizingMaskIntoConstraints(false)

NSDictionary *views =NSDictionaryOfVariableBindings(newImgThumb);


// imageview fills the width of its superview
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"|[newImgThumb]|" options:0 metrics:metrics views:views]];
// imageview fills the height of its superview
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[newImgThumb]|" options:0 metrics:metrics views:views]];

【讨论】:

【参考方案10】:

`

CGRect screenRect = [[UIScreen mainScreen] bounds];

CGFloat screenWidth = screenRect.size.width;

CGFloat screenHeight = screenRect.size.height;

_imgBackGround.frame = CGRectMake(0, 0, screenWidth, screenHeight);` 

【讨论】:

请解释一下你的答案

以上是关于你如何让背景图像快速缩放到屏幕大小?的主要内容,如果未能解决你的问题,请参考以下文章

Andengine,缩放图像以填充屏幕大小,而不保持纵横比

android ImageView图片缩放至屏幕大小

根据屏幕大小缩放图像按钮

无法让 UIImageView 调整大小以适应屏幕

如何在图像视图中将图像设置为适合屏幕

在静态背景图像上调整按钮大小和位置