2015-03-18 16 views
8

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.

enter image description here

Oto ten sam widok, bez dodawania howManyIconView do mojego ograniczeń.

enter image description here

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).

Odpowiedz

2

Istnieją 2 ewentualne błędy widać:

  1. nie widzę ograniczenie dla contentView lewo i prawo. Obaj powinni być zero, jak sądzę. W przeciwnym razie pozycja contentView będzie losowa w scrollView. To powinno być ustalone poprzez zastąpienie H:[contentView(contentWidth)] z H:|[contentView(contentWidth)]|

  2. Korzystanie self.view.bounds.width dla contentView szerokości może być nieco ryzykowne - w zależności od metody jaką są nazywając ją. Jesteś pewien, że jest równy rozmiarowi ekranu?

Należy zauważyć, że generalnie łatwiej jest ustawić ograniczenia w Konstruktorze interfejsów, ponieważ zawsze ostrzega o brakujących ograniczeniach.

+0

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). –

+0

@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

Powiązane problemy