28 votes

clipsToBounds empêche l'affichage de l'UIImage dans iOS10 et XCode 8

J'ai basculé mon projet vers les nouvelles versions bêta d'iOS 10 et de XCode 8. Dans les trois zones de mon application où j'utilise :

imageView.layer.cornerRadius = imageView.frame.size.width/2
imageView.clipsToBounds = true

Les images associées ne s'affichent pas du tout. J'ai essayé de nettoyer le projet ainsi que le dossier de construction, de redémarrer l'appareil, d'essayer sur différents simulateurs, de réajuster l'imageView, de définir par programme les images associées à l'appareil. UIImage au lieu d'en choisir un parmi les actifs.

Retirer le clipsToBounds montre l'image rectangulaire indépendamment du fait que masksToBounds es true o false . Comment faire une image circulaire dans XCode8 / iOS10 ?

Edit : Le projet est Swift 2.x et n'a pas encore été mis à jour vers la syntaxe Swift 3.0.

44voto

Pranoy C Points 4120

J'ai eu le même problème et j'ai appelé layoutIfNeeded avant tous les coins arrondis / clipsToBounds a réglé le problème. iOS 10 GM avec xcode 8 GM provoque la disparition des vues à cause des roundedCorners & clipsToBounds

6voto

VictorJi Points 104

Ce problème m'est également arrivé.

J'ai déplacé ces codes imageView.layer.cornerRadius = imageView.frame.size.width/2 de - (void)awakeFromNib a - (void)drawRect:(CGRect)rect et ce problème a disparu.

Mon imageView est dimensionnée par autolayout. Je pense que la hauteur et la largeur ne sont pas décidées au réveil de la nib sous iOS 10.

2voto

Trever123 Points 21

Il semble que cela puisse être dû à un nouveau bogue depuis iOS 10 et Xcode 8, dans lequel les vues sont initialisées à la taille 1000x1000 et lorsque vous essayez de définir le rayon d'angle à la moitié de votre cadre, il le définit à 500 à la place. Ce problème est documenté plus en détail dans cette question ici : Depuis Xcode 8 et iOS10, les vues ne sont pas dimensionnées correctement sur viewDidLayoutSubviews . La raison pour laquelle je pense que c'est la solution au problème du 1000x1000 est d'appeler les sous-vues de mise en page avant de faire quoi que ce soit qui nécessite des tailles pour quelque chose qui a été construit sur le constructeur d'interface.

1voto

Livio Points 465

J'ai eu le même problème. Il ne s'affiche pas sur le téléphone, mais il est parfait sur Storyboard et le débogueur d'interface utilisateur. Cela fonctionnait aussi quand je mettais le projet "Ouvre avec Xcode 7" au lieu de 8 mais ce n'était pas une solution satisfaisante. J'ai donc creusé et trouvé le problème. Le problème était avec une classe ressemblant à ceci :

@IBDesignable public class MyButton: UIButton {

   @IBInspectable var styleName: String = "" {
        didSet {
            switch styleName {
            case "RoundedLight":
                tintColor = UIColor.lightPinkColor()
                layer.borderColor = UIColor.whiteColor().CGColor
                layer.borderWidth = 1
                layer.masksToBounds = true
            default:
                break
            }
        }
    }

    override public func layoutSubviews() {
        super.layoutSubviews()

        switch styleName {
            case "RoundedLight":
                layer.cornerRadius = frame.height / 2
            default:
                break
        }
    }
}

Je l'ai changé en ceci et cela fonctionne maintenant :

@IBDesignable public class MyButton: UIButton {

   @IBInspectable var styleName: String = "" {
        didSet {
            layoutIfNeeded()
        }
    }

    override public func layoutSubviews() {
        super.layoutSubviews()

        switch styleName {
        case "RoundedLight":
            tintColor = UIColor.lightPinkColor()
            layer.borderColor = UIColor.whiteColor().CGColor
            layer.borderWidth = 1
            layer.cornerRadius = frame.height / 2
            layer.masksToBounds = true
        default:
            break
        }
    }
}

Notez qu'aucune des solutions ci-dessus n'a fonctionné pour moi, et je veux dire :

  • Appel à layoutIfNeeded dans le layoutSubviews()
  • Appel à layoutIfNeeded dans le awakeFromNib de mon bouton (ou de ma cellule contenant le bouton)
  • Appel à layoutIfNeeded dans le layoutSubview de ma cellule
  • Appel à contentView.layoutIfNeeded() dans le awakeFromNib de ma cellule
  • Appel à view.layoutIfNeeded() dans mon contrôleur de vue

1voto

Jayprakash Dubey Points 1194

J'ai un ImageView qui est de forme entièrement circulaire. Voici le code :

//MARK:- Misc functions
func setProfileImage() {
    imgProfile.layer.masksToBounds = false
    imgProfile.layer.cornerRadius = imgProfile.frame.size.height/2
    imgProfile.clipsToBounds = true
    imgProfile.contentMode = UIViewContentMode.ScaleToFill
} 

Cela fonctionne bien dans iOS 9. Cependant, in iOS 10 Xcode 8 the ImageView disappears. Après le débogage, j'ai trouvé que ClipsToBound est le coupable.

J'ai donc placé le code dans viewDidLayoutSubviews() a résolu le problème.

override func viewDidLayoutSubviews() {
    setProfileImage()
}

Vous pouvez également utiliser self.view.layoutIfNeeded()

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X