Szybkie wyjaśnienie.Ograniczenie horyzontalne nie działa poprawnie w widoku UIScrollView. (ograniczenia programowe)
Mam UIScrollView
, jest to pod-widok "self.view". My UIScrollview
, ma podrzędny o nazwie contentView
Wszystkie moje inne obiekty są subviews z contentView
czy to sub-views
mam wszystko patrząc poprawnie, z wyjątkiem 2 widoków.
Po dodaniu tych widoków w moich ograniczeniach. Cała contentView
przesuwa się w lewo i wszystko zepsuje.
Oto obraz ekranu z wywołanym kłopotliwym widokiem (howManyIconView), jest niebieski UIView
, z białą ikoną luzu na środku. (u dołu po lewej)
Aby wyjaśnić wszystkim, że jest to contentView
, które jest pomieszane, podałem contentView
czerwone tło.
Oto ten sam widok, bez dodawania howManyIconView
do mojego ograniczeń.
do rzeczywistego kodu związanego z problemem, zaczynając od góry.
contentView.setTranslatesAutoresizingMaskIntoConstraints(false)
scrollView.addSubview(contentView)
howManyContentView.setTranslatesAutoresizingMaskIntoConstraints(false)
contentView.addSubview(howManyContentView)
howManyIconView.setTranslatesAutoresizingMaskIntoConstraints(false)
howManyIconView.backgroundColor = UIColor.formulaBlueColor()
howManyContentView.addSubview(howManyIconView)
howManyIcon.setTranslatesAutoresizingMaskIntoConstraints(false)
howManyIcon.textColor = UIColor.formulaWhiteColor()
howManyIcon.font = UIFont(name: "fontAwesome", size: 20)
howManyIcon.text = ""
howManyIconView.addSubview(howManyIcon)
A oto ograniczeń:
var viewsDictionary = ["contentView":contentView,"howManyContentView":howManyContentView,
"howManyLabel":howManyLabel,
"howManyInputField":howManyInputField,
"howManyIconView":howManyIconView,
"howManyIcon":howManyIcon]
let metricsDictionary = ["topBarHeight":6,"numbersViewRowHeight":49,"numbersViewSeperatorHeight":1,"inputFieldHeight":75,"contentWidth":self.view.bounds.width,"grapViewHeight":175,"inputFieldWidth":100,"iconViewWidth":50]
scrollView.addConstraints(
NSLayoutConstraint.constraintsWithVisualFormat(
"H:[contentView(contentWidth)]", options: NSLayoutFormatOptions(0), metrics: metricsDictionary, views: viewsDictionary))
howManyContentView.addConstraints(
NSLayoutConstraint.constraintsWithVisualFormat(
"V:[howManyIconView(inputFieldHeight)]", options: NSLayoutFormatOptions(0), metrics: metricsDictionary, views: viewsDictionary))
howManyContentView.addConstraints(
NSLayoutConstraint.constraintsWithVisualFormat(
"V:[howManyInputField(inputFieldHeight)]", options: NSLayoutFormatOptions(0), metrics: metricsDictionary, views: viewsDictionary))
contentView.addConstraints(
NSLayoutConstraint.constraintsWithVisualFormat(
"H:|[howManyContentView]|", options: nil, metrics: nil, views: viewsDictionary))
howManyContentView.addConstraint(NSLayoutConstraint(item:howManyLabel, attribute:NSLayoutAttribute.CenterY, relatedBy:NSLayoutRelation.Equal, toItem:howManyContentView, attribute:NSLayoutAttribute.CenterY, multiplier:1.0, constant:0))
howManyContentView.addConstraint(NSLayoutConstraint(item:howManyInputField, attribute:NSLayoutAttribute.CenterY, relatedBy:NSLayoutRelation.Equal, toItem:howManyContentView, attribute:NSLayoutAttribute.CenterY, multiplier:1.0, constant:0))
howManyContentView.addConstraint(NSLayoutConstraint(item:howManyIconView, attribute:NSLayoutAttribute.CenterY, relatedBy:NSLayoutRelation.Equal, toItem:howManyContentView, attribute:NSLayoutAttribute.CenterY, multiplier:1.0, constant:0))
howManyIconView.addConstraint(NSLayoutConstraint(item:howManyIcon, attribute:NSLayoutAttribute.CenterY, relatedBy:NSLayoutRelation.Equal, toItem:howManyIconView, attribute:NSLayoutAttribute.CenterY, multiplier:1.0, constant:0))
howManyIconView.addConstraint(NSLayoutConstraint(item:howManyIcon, attribute:NSLayoutAttribute.CenterX, relatedBy:NSLayoutRelation.Equal, toItem:howManyIconView, attribute:NSLayoutAttribute.CenterX, multiplier:1.0, constant:0))
howManyContentView.addConstraints(
NSLayoutConstraint.constraintsWithVisualFormat(
"H:|-32-[howManyLabel]", options: nil, metrics: metricsDictionary, views: viewsDictionary))
Poniższa ograniczeniem, jest ten, który zadziera wszystkiego. Po usunięciu [howManyIconView(iconViewWidth)]
z tej 1 linii kodu wszystko jest w porządku.
howManyContentView.addConstraints(
NSLayoutConstraint.constraintsWithVisualFormat(
"H:[howManyIconView(iconViewWidth)][howManyInputField(inputFieldWidth)]-32-|", options: nil, metrics: metricsDictionary, views: viewsDictionary))
Mam potrójne sprawdzane że howManyContentView, howManyIconView i howManyIcon nie zostały wymienione w żadnym kodem nie pokazanego w tym poście.
Oto, co starałem się rozwiązać mój problem
pierwsze próbowałem dokonać innego widoku nazywane HowManyInputView
, gdzie mogę umieścić iconView
i UITextField
w. Wtedy oddanie że jako jedyne ograniczenie. (ten sam wynik)
Potem próbowałem usunąć wszystko, co miało związek z ikoną UILabel
wewnątrz ikonywidoku. Aby sprawdzić, czy ma to coś wspólnego z etykietą. (Ten sam wynik)
Potem próbowałem zrobić nowy widok. i podał podobne (ale nie takie same) ograniczenia pozycyjne (ten sam problem), ten widok nie zawierał też żadnych subskrybentów, co dodatkowo pokazuje, że jest to widok, a nie UILabel
powodując moje problemy.
Próbowałem więc podzielić moje ograniczenie horyzontalne na 2. Przedtem, jak widać w kodzie. Nadałem mu szerokość i horyzontalne ograniczenie w tym samym wierszu kodu. Zrobiłem więc 2 różne linie ograniczające, jeden do rozmiaru w poziomie, a drugi do ustawienia.(ten sam wynik)
W tym momencie zabrakło mi pomysłów. Usunąłem folder Derived Data i oczyściłem mój projekt. (nadal nie działa)
Następnie próbowałem wydrukować ograniczenia dla problematycznego widoku. Korzystanie constraintsAffectingLayoutForAxis
tak:
println("Horizontal: \(howManyIconView.constraintsAffectingLayoutForAxis(UILayoutConstraintAxis.Horizontal))")
println("Vertical: \(howManyIconView.constraintsAffectingLayoutForAxis(UILayoutConstraintAxis.Vertical))")
i to, co drukuje konsoli OUT:
Horizontal: [<NSLayoutConstraint:0x174299050 H:[UIView:0x17019df60(50)]>]
Vertical: [<NSLayoutConstraint:0x17429aae0 V:|-(0)-[UIView:0x17019df60] (Names: '|':UIView:0x17019ddc0)>, <NSLayoutConstraint:0x17429ab30 V:[UIView:0x17019df60]-(0)-| (Names: '|':UIView:0x17019ddc0)>]
ile Czytam to źle. Wygląda na to, że iconView otrzymuje tylko ograniczenie rozmiaru (50), a nie faktyczne pozycyjne ograniczenie pozycyjne. Pomimo, że został umieszczony poprawnie obok mojego UITextField
?
Dlaczego tak się dzieje, wciąż pozostaje tajemnicą, o ile widzę, moje horyzontalne ograniczenie pozycjonowania powinno być w porządku. Nie otrzymuję żadnych błędów. Ale miejmy nadzieję, że dostarczenie przyczyny mojego problemu, pomoże go rozwiązać.
Każda pomoc będzie bardzo ceniona! (Żaden z moich próbach spowodowały żadnych błędów w konsoli).
zmieniając moje treści Wyświetl do 'H: | [contentView (contentWidth)] | 'rozwiązał mój ból głowy w zeszłym tygodniu! Dziękuję bardzo niewiarygodnie. Nie masz pojęcia, jak bardzo to pomogło! Jeśli chodzi o self.view.bounds.width, wywołuję go w viewDidLoad, wydaje mi się, że zawsze pasuje do mojego ekranu. Jeśli chodzi o IB, nie używam scenorysów, a więc (ograniczeń programowych). –
@MarkL Nawet jeśli nie korzystasz z storyboardów, dobrym pomysłem jest użycie IB do stworzenia pojedynczego kontrolera Xibs. To jest po prostu szybsze i łatwiejsze do zrobienia. Mniej kodu = lepsza konserwacja. – Sulthan