代码之家  ›  专栏  ›  技术社区  ›  ali

在iScrollView中以编程方式添加一些UITextView和其他元素

  •  1
  • ali  · 技术社区  · 7 年前

    我有一个ViewController,它包含一个UIImageView,然后是一些UILabel和两个或多个UITextView。由于文本很长,我必须添加一个UIScrollView来滚动ViewController。因此,我编写了以下代码:

    public class PostViewController : UIViewController
        {
            UIScrollView scrollView;
    
            private UIImageView _postHeaderImage;
    
            private UILabel _postTopTag;
            private UILabel _postTitle;
    
            private UILabel _sourceAndpublicationDate;
    
            private UITextView _postSummary;
            private UITextView _postText;
    
            private UIImage image;
    
            public PostViewController()
            {
                View.BackgroundColor = UIColor.White;
            }
    
            public override void DidReceiveMemoryWarning()
            {
                base.DidReceiveMemoryWarning();
            }
            public override void ViewDidLoad()
            {
                base.ViewDidLoad();
    
    
    
                // ScrollView
                scrollView = new UIScrollView();
    
                image = UIImage.FromFile("Article1.jpg");
                _postHeaderImage = new UIImageView(UIImage.FromBundle("Article1.jpg"));
    
    
                _postTopTag = InitUILabel("Santé", fontSize: 12, color: Colors.TextGrayColor, alignment: UITextAlignment.Left, bold: true);
                _postTopTag.AttributedText = new NSAttributedString("Santé", underlineStyle: NSUnderlineStyle.Single);
    
                _postTitle = InitUILabel("Alaska - Une «éponge miracle» contre le cancer ", fontSize: 26, bold: true, alignment: UITextAlignment.Left);
    
    
                _sourceAndpublicationDate = InitUILabel("www.letelegramme.fr" + " - " + "Depuis 23 Heure(s)", fontSize: 13, alignment: UITextAlignment.Left);
    
                _postSummary = new UITextView();
                _postSummary.Editable = false;
                _postSummary.ScrollEnabled = false;
                _postSummary.Text = "La « Latrunculia austini » vit à une profondeur variant de 70 à 220 m, dans des zones difficiles d'accès.";
    
    
    
                image = UIImage.FromFile("Article1.jpg");
                _postHeaderImage = new UIImageView(UIImage.FromBundle("Article1.jpg"));
    
    
                _postText = new UITextView();
                _postText.Editable = false;
                _postText.ScrollEnabled = false;
                _postText.Text = @"«La molécule la plus active contre le cancer du pancréas».
    Des chercheurs ont découvert, en Alaska (États-Unis), qu'une petite éponge des profondeurs possède une composition chimique capable de traiter cette tumeur parmi les plus agressives.
    Une petite éponge verte, découverte dans les eaux glacées et sombres au large de l'Alaska, pourrait offrir la première arme efficace contre le cancer du pancréas, une tumeur agressive face à laquelle la médecine a peu de recours.
    
    « Personne ne regarde cette éponge en se disant c'est une éponge miracle, mais elle pourrait l'être », s'exclame Bob Stone, chercheur au Centre scientifique de la pêche d'Alaska de l'Agence américaine océanique et atmosphérique (NOAA). Il a été le premier à découvrir cette éponge de la taille d'une balle de golfe, baptisée « Latrunculia austini », en 2005, lors d'une expédition d'exploration des écosystèmes sous-marins.
    
    Des tests en laboratoire ont révélé que plusieurs de ses molécules détruisent sélectivement les cellules cancéreuses pancréatiques, a indiqué Mark Hamann, un chercheur de la faculté de médecine de l'Université de Caroline du Sud, en collaboration avec Fred Valeriote, de l'Institut Henry Ford du cancer, à Detroit. « C'est sans aucun doute la molécule la plus active contre le cancer du pancréas que nous voyons », se réjouit Mark Hamman.";
    
                scrollView.AddSubviews(_postHeaderImage, _postTopTag, _postTitle, _sourceAndpublicationDate, _postSummary, _postText);
    
                View.AddSubview(scrollView);
            }
    
            public override void ViewDidLayoutSubviews()
            {
                var frameWidth = View.Frame.Width ;
    
                scrollView.Frame = new CoreGraphics.CGRect(0, 0, this.View.Bounds.Size.Width, 5000);
                scrollView.ContentSize = scrollView.Frame.Size; // This may not be what you actually want, but what you had before was certainly wrong.
    
                _postHeaderImage.Frame = new CoreGraphics.CGRect(0, 0, View.Frame.Width, (View.Frame.Width * image.Size.Height / image.Size.Width));
    
                float width = (float)(View.Frame.Size.Width - 40);
    
    
    
    
                _postTopTag.Frame = new CGRect(10, _postHeaderImage.Frame.Size.Height, frameWidth, 20);
    
                _postTitle.Frame = new CGRect(10, _postTopTag.Frame.Y + _postTopTag.Frame.Size.Height, frameWidth, 80);
    
                _sourceAndpublicationDate.Frame = new CGRect(10,_postTitle.Frame.Y + _postTitle.Frame.Size.Height, frameWidth, 20);
    
    
                SizeF size = (SizeF)((NSString)_postSummary.Text).StringSize(_postSummary.Font, constrainedToSize: new SizeF(width, (float)View.Frame.Size.Height),
                        lineBreakMode: UILineBreakMode.WordWrap);
                _postSummary.Frame = new CGRect(10, _sourceAndpublicationDate.Frame.Y + _sourceAndpublicationDate.Frame.Size.Height, size.Width, size.Height);
    
    
                size = (SizeF)((NSString)_postText.Text).StringSize(_postText.Font, constrainedToSize: new SizeF(width, (float)View.Frame.Size.Height),
                        lineBreakMode: UILineBreakMode.WordWrap);
    
                _postText.Frame = new CGRect(10, _postSummary.Frame.Y + _postSummary.Frame.Size.Height, size.Width, size.Height);
    
    
            }
    
    
            public static UILabel InitUILabel(string text, int? color = null, UITextAlignment? alignment = null, nfloat? fontSize = null, bool? bold = false)
            {
                UILabel _label = new UILabel();
                _label.Text = text;
                _label.TextColor = Colors.FromHex(color == null ? Colors.MainColor : color.Value);
                _label.TextAlignment = (alignment == null ? UITextAlignment.Center : alignment.Value);
                _label.LineBreakMode = UILineBreakMode.WordWrap;
                _label.Lines = 0;
                if (fontSize != null && !bold.Value)
                    _label.Font = UIFont.SystemFontOfSize(fontSize.Value);
                else if (fontSize != null && bold.Value)
                    _label.Font = UIFont.BoldSystemFontOfSize(fontSize.Value);
                else if (bold.Value)
                    _label.Font = UIFont.BoldSystemFontOfSize(14f);
    
                return _label;
    
            }
    
        }
    

    如果你运行这个控制器,你会发现我对UIScrollView的大小和UITextView的大小有很多问题。

    在你看来,我用了一种很好的方法来显示我的控制器,还是你有其他方法来推荐我?

    谢谢

    编辑:

    我用过Cirrian,但没用! 代码如下:

    public override void ViewDidLayoutSubviews()
            {
                base.ViewDidLayoutSubviews ();
                View.SubviewsDoNotTranslateAutoresizingMaskIntoConstraints ();
    
                View.AddConstraints (
    
                    scrollView.AtTopOf (View, 50),
                    scrollView.WithSameWidth (View)
                );
    
                scrollView.AddConstraints (
                    _postTopTag.Below (_postHeaderImage, 15),
                    _postTopTag.AtLeftOf (View, 10),
                    _postTopTag.WithSameWidth (View).Minus (40)
                    //...
                );
            }
    
    2 回复  |  直到 7 年前
        1
  •  2
  •   ColeX    7 年前

    在解释之前,我认为你需要理解 Frame ConentSize 在UIScrollview上。

    • 框架:要在屏幕上显示的区域。

    • ContentSize:可以滚动查看的区域。

    上的解决方案 框架 AutoLayout

    • 框架

      首先设置帧。

      scrollView.Frame = new CGRect(0, 0, this.View.Bounds.Size.Width, this.View.Bounds.Size.Height);
      

      设置所有控件后设置contentSize(根据最后一个控件计算高度)

      _postText.Frame = new CGRect(10, _postSummary.Frame.Y + _postSummary.Frame.Size.Height, size.Width, size.Height);
      //insert here ,at the end of method ViewDidLayoutSubviews
      scrollView.ContentSize = new CGSize(View.Frame.Width, _postText.Frame.Y + _postText.Frame.Height);
      
    • 自动布局

      这在方式上很复杂。

      关于如何在UIScrollview上自动布局,请参阅我最近的帖子 here here

      Programmatic Layout Constraints

      自动布局的简单方式: Cirrious.FluentLayout

      Autolayouts in UIScrollView using Cirrious.FluentLayouts.Touch

        2
  •  0
  •   MilanG    7 年前

    这可以使用AutoLayout约束作为最佳方法来实现,但如果使用代码隐藏来实现这一点,那么也可以通过设置适当的scrollview高度和宽度以及适当的ContentSize来实现。

    scrollview的高度和宽度应该和您案例中的父视图相同。

    ContentSize应该根据scrollview中的实际内容而定。 例如,ContentSize高度参数需要设置为scrollview内部内容的总高度。

    ContentSize宽度参数将与scrollview宽度相同。

    还要确保将scrollview的bounce verticall属性设置为true。