2016-09-26 4 views
1

В настоящее время я пытаюсь сделать это с помощью iOS 10.0Как заставить ScrollView поместить свой контент с помощью AutoLayout (iOS/Xamarin.iOS)?

Скажем, у меня есть ScrollView с одним дочерним подвью (который представляет собой представление, состоящее из трех других видов). схема выглядит следующим образом:

UIView 
->ScrollView 
-->View Container 
--->TopView 
--->MiddleView 
--->BottomView 

Оба TopView и MiddleView имеют динамическую высоту (это может быть меньше или больше, в зависимости от содержания).

Я считаю, что я установил ограничение правильно (я следовал этому учебник - https://spin.atomicobject.com/2014/03/05/uiscrollview-autolayout-ios/)

Here is my view heirarchy

Проблема сам по себе выглядит следующим образом: BottomView получает усеченный (или другие слова Безразлично» я хочу расти). Несмотря на то, что отображается содержимое BottomView, оно отображается ниже в разделе «Просмотр границ контейнера». Таким образом, невозможно увидеть все подпункты и элементы управления BottomView (причина в том, что эффект отскока прокрутки входит в игру)

Любые предложения, что происходит или где может быть проблема?

+0

«он отображается ниже« Просмотр границ контейнера »: Если я понимаю, что ваш« View Container не расширяет его высоту »? Следующая проблема: Таким образом, просмотр прокрутки не приведет к увеличению/вычислению правильного размера содержимого? – Alok

+0

он больше похож на «ViewContainer» не будет вычислять правильное содержание. Размер Кроме того, когда TopView и MiddleView имеют небольшую высоту контента, здесь есть «пустое» пространство под номерами –

ответ

0

решаемые

Следующая сделал трюк: я кладу Scrollview в представлении, так что теперь иерархия выглядит следующим образом (см изображение) Updated view hierarchy

Единственное, что мне нужно сделать выясняет, как правильно обрабатывать дополнительное пространство, которое остается после скрытия некоторых представлений от MiddleView и TopView (при установке этих ограничений высоты по умолчанию постоянное значение до 0 по какой-то причине недостаточно). Но это совершенно выходит за рамки моего вопроса :)

EDIT:

Для тех, кто хочет знать, как решить проблему с дополнительным пространством я описал выше, вот ссылка, которая помогла мне решить его - solution

0

О функции макета, используя кадр более ясно, что я написал образец согласно вашему описанию:

using System; 
using UIKit; 
using CoreGraphics; 

namespace LayoutSample 
{ 
    public class MainViewController : UIViewController 
    { 
     private MainView mainView; 

     public override void LoadView() 
     { 
      mainView = new MainView(); 
      this.View = mainView; 
     } 

     public override void ViewDidLoad() 
     { 
      //If you don't know what is this code meaning, try to comment it, then you will get what it is. 
      this.AutomaticallyAdjustsScrollViewInsets = false; 

      UIBarButtonItem left0 = new UIBarButtonItem("-Frame", UIBarButtonItemStyle.Done, delegate 
      { 
       mainView.DecreaseScrollViewFrame(); 
      }); 

      UIBarButtonItem left1 = new UIBarButtonItem("-CS", UIBarButtonItemStyle.Done, delegate 
      { 
       mainView.DecreaseScrollViewContentSize(); 
      }); 

      UIBarButtonItem right0 = new UIBarButtonItem("+Frame", UIBarButtonItemStyle.Done, delegate 
      { 
       mainView.IncreaseScrollViewFrame(); 
      }); 

      UIBarButtonItem right1 = new UIBarButtonItem("+CS", UIBarButtonItemStyle.Done, delegate 
      { 
       mainView.IncreaseScrollViewContentSize(); 
      }); 

      this.NavigationItem.SetLeftBarButtonItems(new UIBarButtonItem[] { left0,left1 }, true); 

      this.NavigationItem.SetRightBarButtonItems(new UIBarButtonItem[] { right0, right1 }, true); 

     } 
    } 

    class MainView : UIView 
    { 
     private UIScrollView scrollView; 
     private UIView containerView; 
     private UIView topView; 
     private UIView midView; 
     private UIView bottomView; 

     public MainView() 
     { 
      scrollView = new UIScrollView(); 
      scrollView.BackgroundColor = UIColor.Red; 
      nfloat navigationBarHeight = 64; 
      scrollView.Frame = new CGRect(0, navigationBarHeight, UIScreen.MainScreen.Bounds.Width, UIScreen.MainScreen.Bounds.Height - 100 - navigationBarHeight); 
      scrollView.ContentSize = scrollView.Frame.Size; 
      this.AddSubview(scrollView); 

      containerView = new UIView(); 
      containerView.BackgroundColor = UIColor.Green; 
      scrollView.AddSubview(containerView); 

      topView = new UIView(); 
      topView.BackgroundColor = UIColor.Blue; 
      containerView.AddSubview(topView); 

      midView = new UIView(); 
      midView.BackgroundColor = UIColor.Purple; 
      containerView.AddSubview(midView); 

      bottomView = new UIView(); 
      bottomView.BackgroundColor = UIColor.Yellow; 
      containerView.AddSubview(bottomView); 
     } 

     //It will also be invoked when your view's Frame is changed, and of cause you can invoke it whenever you want 
     public override void LayoutSubviews() 
     { 
      Console.WriteLine("LayoutSubviews"); 

      nfloat padding = 10; 

      CGRect containerFrame = new CGRect(new CGPoint(0,0),scrollView.ContentSize); 
      containerFrame.X += padding; 
      containerFrame.Y += padding; 
      containerFrame.Width -= 2 * padding; 
      containerFrame.Height -= 2 * padding; 
      containerView.Frame = containerFrame; 

      nfloat bottomHeight = 100; 
      nfloat topHeight = 0.3f * containerView.Frame.Height; 
      nfloat midHeight = containerView.Frame.Height - topHeight - bottomHeight - 4 * padding; 

      nfloat containerSubviewWidth = containerView.Frame.Width - 2 * padding; 
      topView.Frame = new CGRect(padding, padding, containerSubviewWidth, topHeight); 
      midView.Frame = new CGRect(padding, padding + topView.Frame.Y + topView.Frame.Height, containerSubviewWidth, midHeight); 
      bottomView.Frame = new CGRect(padding, padding + midView.Frame.Y + midView.Frame.Height, containerSubviewWidth, bottomHeight); 
     } 

     public void IncreaseScrollViewContentSize() 
     { 
      CGSize tmpSize = scrollView.ContentSize; 
      tmpSize.Height += 100; 
      scrollView.ContentSize = tmpSize; 
      LayoutSubviews(); 
     } 

     public void DecreaseScrollViewContentSize() 
     { 
      CGSize tmpSize = scrollView.ContentSize; 
      tmpSize.Height -= 100; 
      scrollView.ContentSize = tmpSize; 
      LayoutSubviews(); 
     } 

     public void IncreaseScrollViewFrame() 
     { 
      CGRect tmpRect = scrollView.Frame; 
      tmpRect.Height += 10; 
      scrollView.ContentSize = new CGSize(tmpRect.Width, tmpRect.Height); 
      scrollView.Frame = tmpRect; 
     } 

     public void DecreaseScrollViewFrame() 
     { 
      CGRect tmpRect = scrollView.Frame; 
      tmpRect.Height -= 10; 
      scrollView.ContentSize = new CGSize(tmpRect.Width, tmpRect.Height); 
      scrollView.Frame = tmpRect; 
     } 
    } 
} 

Вы можете изменить параметр, чтобы получить то, что именно вы хотите, и это полное решение в мой GitHub:

lwnwowone/LayoutSample

Посмотрите, если вам нужно. Надеюсь, это может вам помочь.

+0

Спасибо за предоставленный код, но я боюсь, что это не то, что Я ищу. Я имею в виду, я использую автозапуск. Он должен разрешить любые изменения ограничений, не так ли?Я считаю, что есть гораздо более простое и элегантное решение без использования кода - чистое решение для ограничений xCode для дизайнеров. Но в любом случае спасибо за вашу работу! –

+0

Да, у нас должен быть способ закончить, просто используя графический дизайнер, но обсуждать его с трудностями сложно, потому что это очень сложно объяснить, если вы не можете поделиться всем решением. И если у вас есть несколько сотрудников и вы хотите использовать Git/SVN для управления вашим проектом, вы получите так много проблем слияния. Поэтому я предлагаю вам попробовать мой код, это очень просто. Если вы все еще хотите использовать конструктор, вы должны поделиться своим решением где-нибудь, тогда я или кто-то может вам помочь. –