2015-05-21 2 views
0

Я сделать ViewController с авторазметками в Scrollview, но вот несколько проблем:авторазметки в UIScrollView с использованием Cirrious.FluentLayouts.Touch

public SomeVC() : UIViewController 
    { 
     _mainScrollView = new UIScrollView { 
      ShowsHorizontalScrollIndicator = false, 
      ShowsVerticalScrollIndicator = true, 
      BackgroundColor = UIColor.Clear, 
      ScrollEnabled = true, 
      AutoresizingMask = UIViewAutoresizing.FlexibleHeight, 
      TranslatesAutoresizingMaskIntoConstraints = true 
     }; 

     _userDataTableView = new UITableView(CGRect.Empty, UITableViewStyle.Grouped); 
     _userDataTableView.LayoutIfNeeded(); 

     _saveButton = new UIButton(); 

     _menuTableView = new UITableView(CGRect.Empty, UITableViewStyle.Grouped); 
     _menuTableView.LayoutIfNeeded(); 

     _logoutButton = new UIButton(); 
    } 

    public override void LoadView() 
    { 
     base.LoadView(); 
     View = _mainScrollView; 
    } 

    public override void ViewDidLoad() 
    { 
     base.ViewDidLoad(); 

     Add(_userDataTableView); 
     Add(_saveButton); 
     Add(_menuTableView); 
     Add(_logoutButton); 

     _mainScrollView.AddConstraints(
      _userDataTableView.AtTopOf(View), 
      _userDataTableView.AtLeftOf(View), 
      _userDataTableView.AtRightOf(View), 
      _userDataTableView.Height().EqualTo(_userDataTableView.ContentSize.Height), 

      _saveButton.Below(_userDataTableView, 20), 
      _saveButton.AtLeftOf(_mainScrollView, 10), 
      _saveButton.AtRightOf(_mainScrollView, 10), 
      _saveButton.Height().EqualTo(44), 

      _menuTableView.Below(_saveButton, 20), 
      _menuTableView.AtLeftOf(_mainScrollView), 
      _menuTableView.AtRightOf(_mainScrollView), 
      _menuTableView.Height().EqualTo(_menuTableView.ContentSize.Height), 

      _logoutButton.Below(_menuTableView, 20), 
      _logoutButton.AtLeftOf(_mainScrollView, 10), 
      _logoutButton.AtRightOf(_mainScrollView, 10), 
      _logoutButton.Height().EqualTo(44) 
     ); 
     _mainScrollView.SubviewsDoNotTranslateAutoresizingMaskIntoConstraints(); 
    } 

На самом деле, она работает, но содержание ширин составляют около половины ширина экрана и прокрутка не работают. Как это работает?

Насколько я понимаю, проблема в том, что проблема - _mainScrollView.ContentSize, но как и где ее установить, при использовании автозапуска?

ответ

0

Решение было найдено: Во-первых:

 _userDataTableView.AtLeftOf(View), 
     _userDataTableView.AtRightOf(View), 

не действует, вместо этого, мы должны использовать:

 _userDataTableView.AtLeftOf(View), 
     _userDataTableView.WithSameWidth(View), 

, если мы хотим, чтобы запас, мы просто добавим

 _userDataTableView.WithSameWidth(View).Minus(MARGIN) 

И последнее, что мы должны сделать:

 _logoutButton.Height().EqualTo(44), 
     _logoutButton.Bottom().EqualTo().BottomOf(_mainScrollView).Plus(10) 

последняя строка очень важна. Он говорит, чтобы прокручивать правильный размер содержимого.

+0

Итак, если Scrollview имеет 10 подзадач, как мне его прокрутить? Я просто помещаю 10 подзонов ниже других сверху без установки ограничения по отношению к дну? –

1

Если ваши представления не превышают экран, вы не сможете прокручивать. если у вас есть только что-то вроде этого:

// Create containers 
      contentView = new UIView(); 
      scrollView = new UIScrollView { contentView }; 
      Add(scrollView); 


      contentView.AddSubviews(logo, user, password, loginButton); 


      // Auto layout 
      View.SubviewsDoNotTranslateAutoresizingMaskIntoConstraints(); 
      View.AddConstraints(scrollView.FullWidthOf(View)); 
      View.AddConstraints(scrollView.FullHeightOf(View)); 
      View.AddConstraints(
       contentView.WithSameWidth(View), 
       contentView.WithSameHeight(View).SetPriority(UILayoutPriority.DefaultLow) 
      ); 

      scrollView.SubviewsDoNotTranslateAutoresizingMaskIntoConstraints(); 
      scrollView.AddConstraints(contentView.FullWidthOf(scrollView)); 
      scrollView.AddConstraints(contentView.FullHeightOf(scrollView)); 

      // very important to make scrolling work 
      var bottomViewConstraint = contentView.Subviews.Last() 
       .AtBottomOf(contentView).Minus(20); 

      contentView.SubviewsDoNotTranslateAutoresizingMaskIntoConstraints(); 

      contentView.AddConstraints(
        logo.AtTopOf(contentView), 
        logo.WithRelativeWidth(contentView, 0.8f), 

        logo.WithSameCenterX(contentView), 
        logo.WithRelativeHeight(contentView, 0.3f), 

        user.Below(logo, 50), 
        user.WithRelativeWidth(logo, 0.8f), 
        user.WithSameCenterX(logo), 

        password.Below(user), 
        password.WithSameWidth(user), 
        password.WithSameCenterX(user), 

        loginButton.Below(password, 50), 
        loginButton.WithRelativeWidth(password, 0.9f), 
        loginButton.Height().EqualTo(50), 
        loginButton.WithSameCenterX(password) 
       ); 

      contentView.AddConstraints(bottomViewConstraint); 

     } 

Я использую этот пакет, и он отлично работает, как если бы я использовал stackLayout внутри Scrollview в xamarin.forms Я думаю, что это идеальное поведение.

Xamarin.IQKeyboardManager from Nuget 

Кроме того, если вы хотите, чтобы центрирования представления содержимого внутри Scrollview вам нужно будет добавить следующее:

public override void ViewWillLayoutSubviews() 
     { 
      base.ViewWillLayoutSubviews(); 

      var scrollViewBounds = scrollView.Bounds; 
      var containerViewBounds = contentView.Bounds; 

      var scrollViewInsets = UIEdgeInsets.Zero; 
      scrollViewInsets.Top = scrollViewBounds.Size.Height/2.0f; 
      scrollViewInsets.Top -= contentView.Bounds.Size.Height/2.0f; 

      scrollViewInsets.Bottom = scrollViewBounds.Size.Height/2.0f; 
      scrollViewInsets.Bottom -= contentView.Bounds.Size.Height/2.0f; 
      scrollViewInsets.Bottom += 1; 

      scrollView.ContentInset = scrollViewInsets; 
     } 

И вот все, не имеет значения, как ваш contentView есть. У вас будет центрированный contetnview внутри scrollview и диспетчера для захвата событий клавиатуры и адаптации вашего представления к этому событию.

Смежные вопросы