J'ai quelques problèmes lors de l'utilisation de translatesAutoresizingMaskIntoConstraints. Je crée une vue de défilement dans laquelle vous pouvez faire glisser votre doigt vers la gauche ou la droite. Chaque fois que vous obtenez une autre image. Mais pour une raison quelconque, je ne peux pas faire glisser si translatesAutoresizingMaskIntoConstraints = false.
C'est avec translatesAutoresizingMaskIntoConstraints = false (dans ce cas, je ne peux pas glisser vers la gauche ou la droite)
Mais si je règle translatesAutoresizingMaskIntoConstraints = true, cela ressemble à ceci et je peux glisser vers la gauche et la droite. Le problème est que la mise en page est foirée.
Mon code:
var scrollView: UIScrollView = {
let scrollView = UIScrollView()
scrollView.showsHorizontalScrollIndicator = false
scrollView.showsVerticalScrollIndicator = false
scrollView.translatesAutoresizingMaskIntoConstraints = false
scrollView.alwaysBounceVertical = false
scrollView.alwaysBounceHorizontal = false
scrollView.isPagingEnabled = true
return scrollView
}()
override func viewDidLoad() {
super.viewDidLoad()
scrollView.frame = contentView.frame
contentView.addSubview(scrollView)
scrollView.leftAnchor.constraint(equalTo: contentView.leftAnchor, constant: 0).isActive = true
scrollView.topAnchor.constraint(equalTo: contentView.topAnchor, constant: 0).isActive = true
scrollView.rightAnchor.constraint(equalTo: contentView.rightAnchor, constant: 0).isActive = true
scrollView.bottomAnchor.constraint(equalTo: contentView.bottomAnchor, constant: 0).isActive = true
}
var frame = CGRect.zero
func viewTutorial() {
for i in 0..<arrayOfTutorilImages.count {
frame.origin.x = scrollView.frame.size.width * CGFloat((i))
frame.size = scrollView.frame.size
let imageView = UIImageView(frame: frame)
imageView.image = UIImage(named: arrayOfTutorilImages[i])
imageView.contentMode = .scaleAspectFit
imageView.backgroundColor = .red
imageView.translatesAutoresizingMaskIntoConstraints = false
self.scrollView.addSubview(imageView)
imageView.leftAnchor.constraint(equalTo: contentView.leftAnchor, constant: 0).isActive = true
imageView.topAnchor.constraint(equalTo: contentView.topAnchor, constant: 0).isActive = true
imageView.rightAnchor.constraint(equalTo: contentView.rightAnchor, constant: 0).isActive = true
imageView.bottomAnchor.constraint(equalTo: contentView.bottomAnchor, constant: 0).isActive = true
}
scrollView.contentSize = CGSize(width: (scrollView.frame.size.width * CGFloat(arrayOfTutorilImages.count)), height: scrollView.frame.size.height)
scrollView.delegate = self
}
extension TutorialViewController: UIScrollViewDelegate {
func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
let pageNumber = scrollView.contentOffset.x / scrollView.frame.size.width
pageControl.currentPage = Int(pageNumber)
}
}
3 Réponses :
Ajouter un cadre Scrollview lors de la création de
var scrollView: UIScrollView = {
let scrollView = UIScrollView(frame:.zero)
//other properties
return scrollView
}()
le même problème est toujours là après la modification de la propriété
pourquoi utilisez-vous cette configuration au lieu de UIcollectionView? Y a-t-il une exigence?
Ceci est issu d'un tutoriel, et je le prolonge un peu.
Contraintes ImageView identiques à celles de ScrollView. C'est la raison pour laquelle vous ne pouvez pas glisser, car toutes vos images ont les mêmes contraintes, et elles sont situées les unes sur les autres. Vous devriez faire comme:
imageView.translatesAutoresizingMaskIntoConstraints = true imageView.frame.size = contentView.frame.size imageView.frame.origin = CGPoint(x: imageIndex * contentView.frame.size.width, y: 0.0)
Erreur: CGRect n'a pas de taille de membre
Hmm ... CGRect a la propriété size, developer.apple.com/documentation/coregraphics/cgrect a>
Vous devez probablement ajouter des contraintes, vous pouvez essayer
class TutorialViewController: UIViewController {
var scrollView: UIScrollView = {
let scrollView = UIScrollView()
scrollView.showsHorizontalScrollIndicator = false
scrollView.showsVerticalScrollIndicator = false
scrollView.translatesAutoresizingMaskIntoConstraints = false
scrollView.alwaysBounceVertical = false
scrollView.alwaysBounceHorizontal = false
scrollView.isPagingEnabled = true
return scrollView
}()
override func viewDidLoad() {
super.viewDidLoad()
contentView.addSubview(scrollView)
scrollView.leftAnchor.constraint(equalTo: contentView.leftAnchor, constant: 0).isActive = true
scrollView.topAnchor.constraint(equalTo: contentView.topAnchor, constant: 0).isActive = true
scrollView.rightAnchor.constraint(equalTo: contentView.rightAnchor, constant: 0).isActive = true
scrollView.bottomAnchor.constraint(equalTo: contentView.bottomAnchor, constant: 0).isActive = true
viewTutorial()
}
func viewTutorial() {
var con:UIView = scrollView
for i in 0..<arrayOfTutorilImages.count {
let imageView = UIImageView(frame: CGRect.zero)
imageView.image = UIImage(named: arrayOfTutorilImages[i])
imageView.contentMode = .scaleAspectFit
imageView.backgroundColor = .red
imageView.translatesAutoresizingMaskIntoConstraints = false
self.scrollView.addSubview(imageView)
if con == scrollView {
imageView.leftAnchor.constraint(equalTo: con.leftAnchor, constant: 0).isActive = true
}
else {
imageView.leftAnchor.constraint(equalTo: con.rightAnchor, constant: 0).isActive = true
}
imageView.topAnchor.constraint(equalTo: scrollView.topAnchor, constant: 0).isActive = true
if i == arrayOfTutorilImages.count - 1 {
imageView.rightAnchor.constraint(equalTo: scrollView.rightAnchor, constant: 0).isActive = true
}
imageView.bottomAnchor.constraint(equalTo: scrollView.bottomAnchor, constant: 0).isActive = true
imageView.widthAnchor.constraint(equalTo: view.widthAnchor, constant: 0).isActive = true
con = imageView
}
scrollView.delegate = self
}
}
extension TutorialViewController: UIScrollViewDelegate {
func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
let pageNumber = scrollView.contentOffset.x / scrollView.frame.size.width
}
}
Ne définissez pas de cadres lorsque vous utilisez des constructions
les contrôles de la page fonctionnent, mais l'image est trop grande
a ajouté imageView.widthAnchor.constraint (equalTo: view.widthAnchor, constant: 0) .isActive = true lors de l'édition, réessayez
l'image a maintenant la bonne taille. Mais il y a encore un autre problème. Il y a un grand espace au-dessus et en dessous de l'image.
ok j'ai édité une heightAnchor et mis la contrainte equalTo: contentView
la vue de contenu est-elle créée à partir d'un point de vente?
oui, cela vient d'un point de vente