J'essaie de créer une image UIView pour mon arrière-plan dans Swift à l'aide d'une image de motif. Le code que je possède fonctionne bien, sauf que je veux que l’image occupe tout l’écran. Mon code ressemble à ceci: self.view.backgroundColor = UIColor(patternImage: UIImage(named: "backgroundImage")!)
Est-ce que quelqu'un sait comment faire de l’arrière-plan une image qui occupera tout l’écran, et qui pourrait changer d’échelle lorsqu’il apparaît sur différentes tailles d’écran d’iPhone?
J'ai posté cette réponse à partir de mon ancien compte (ce qui est obsolète pour moi et je ne peux plus y accéder), ceci est ma meilleure réponse .
Vous pouvez le faire par programme au lieu de créer un IBOutlet dans chaque vue . Créez simplement un UIView extension (Fichier -> Nouveau -> Fichier -> Swift Fichier -> nommez-le comme vous voulez) et ajoutez:
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)
}}
Maintenant, vous pouvez utiliser cette méthode avec vos vues, par exemple:
override func viewDidLoad() {
super.viewDidLoad()
self.view.addBackground()
}
Ajoutez simplement votre UIImageView positionné centré et avec toutes les arêtes se caler sur les arêtes. Laissez-le là et Cliquez sur le coin en bas à droite, comme indiqué ci-dessous, et continuez avec ajoutez 4 contraintes aux bords supérieur, inférieur, gauche et droit.
Maintenant, sélectionnez votre vue et utilisez l'inspecteur de l'IB pour sélectionner .___. vous souhaitez que votre image: remplisse ou s'adapte comme vous pouvez le voir comme suit:
Ceci est la réponse mise à jour de mon précédent .
Comme dans la même approche que dans ma réponse précédente, vous pouvez créer une extension de UIView et y ajouter la méthode addBackground()
, comme suit:
Souvenez-vous: si vous l'ajoutez dans un nouveau fichier .Swift, n'oubliez pas d'ajouter 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])
}
}
Notez que les mises à jour pour cette réponse sont:
Utilisation:
En supposant que vous souhaitiez l'appeler dans 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)
}
Solution Ahmad Fayyas dans Swift 3.0 :
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)
}
Voici vos options pour la mise à l'échelle!
Pour la propriété .contentMode:
ScaleToFill Ceci redimensionnera l'image à l'intérieur de la vue d'image pour remplir toutes les limites de la vue d'image.
ScaleAspectFit Ceci garantira que l’image dans la vue d’image aura le bon format d’aspect et s’intégrera dans les limites de la vue.
ScaleAspectFill Cela garantira que l'image dans la vue d'image aura le bon rapport d'aspect et remplira toutes les limites de la vue d'image. Pour que cette valeur fonctionne correctement, assurez-vous que vous avez défini la propriété clipsToBounds de la vue image sur 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)
Ceci utilise PureLayout . Vous pouvez simplement utiliser AutoLayout avec quelques lignes supplémentaires.
UIImageView* imgView = UIImageView(image: myUIImage)
imgView.setTranslatesAutoresizingMaskIntoConstraints(false)
self.view.addSubview(imgView)
self.view.addConstraints(imgView.autoPinEdgesToSuperviewEdgesWithInsets(UIEdgeInsetsMake(0,0,0,0))
J'ai utilisé des contraintes pour rendre l'image "autoLayout". J'ai créé une vue pour afficher un indicateur d'activité (avec une image d'arrière-plan complète) pendant le chargement de la vue en séquence. Le code est comme suit.
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()
}
C'est le code de la fonction "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])
}
Dans la fonction indiquée ci-dessus, j'ai "lié" les contraintes de conteneurView aux contraintes de vue principales, rendant ainsi la vue "à la taille normale". J'ai fait la même chose pour UIImageView et ai également défini le contentMode sur AspectFill - c'est essentiel, car nous voulons que l'image remplisse le contenu sans l'étirer.
Pour supprimer la vue, après le chargement différé, utilisez simplement le code ci-dessous.
private func hideActivityIndicator() {
actionIndicator.stopAnimating()
containerView.removeFromSuperview()
}
`
CGRect screenRect = [[UIScreen mainScreen] bounds];
CGFloat screenWidth = screenRect.size.width;
CGFloat screenHeight = screenRect.size.height;
_imgBackGround.frame = CGRectMake(0, 0, screenWidth, screenHeight);`
Pour cela, je pense que vous devrez créer un UIImageView qui sera épinglé aux vues parent haut/bas/gauche/droite. UIImageView sera alors toujours la même que la taille de l’affichage. Assurez-vous simplement que vous définissez le mode contenu de la vue image sur 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]];