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

由于我是Xamarin IOS的​​初学者,我需要您在UIScrollView中添加一些元素的答案或建议。

我有一个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的大小方面有很多问题。

在你的心目中,我使用了一种很好的方法来显示我的控制器,或者你有另一种方式来推荐我?

*我在模拟器中使用IOS 10

谢谢

编辑:

我使用过Cirrious但它不起作用! 这是代码:

 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) //... ); } 

在解释之前,我认为您需要了解UIScrollview上FrameConentSize之间的区别。

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

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

FrameAutoLayout解决方案

  • 首先设置框架。

     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上自动布局,请参阅我在这里和这里的最新post

    官方API: 程序化布局约束

    使用AutoLayout的简单方法: Cirrious.FluentLayout

    使用Cirrious.FluentLayouts.Touch在UIScrollView中进行Autolayouts

这可以使用AutoLayout约束作为最佳方法来完成,但如果您使用后面的代码执行此操作,通过设置适当的scrollview高度和宽度以及正确设置ContentSize也是可行的。

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

ContentSize应该根据您在scrollview中的实际内容。 防爆。 ContentSize height参数需要设置为scrollview内部内容的总高度。

ContentSize width参数与scrollview width相同。

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

在您的代码中,您似乎以错误的方式设置了Scrollview大小和ContentSize。