我想在 UIScrollView 中添加一个 UIWebView(和一些其他元素)。
首先,我的 UIWebView 没有固定文本,可以更改。
所以,正如我在示例和教程中看到的那样,我可以这样做:
public class testArticleViewController : UIViewController
{
private UIScrollView _scrollView;
//Post elements
UIWebView _artcileTextWeb;
public testArticleViewController()
{
Title = "test";
View.BackgroundColor = UIColor.White;
}
public override void ViewDidLoad()
{
string text = @"L'un des deux meilleurs du monde, Lionel Messi, va-t-il manquer la Coupe du monde ? L'Argentine se retrouve dans une situation extrêmement délicate dans la course à la qualification au Mondial 2018 en faisant match nul (0-0) jeudi face au Pérou.<br />
<div>
<div>
<div>
<article>
<div>
<div>
<p ><br />Le risque de voir une Coupe du Monde en Russie sans Lionel Messi est bien réel : sixième et en dehors de la zone de qualification à une journée de la fin, l'Albiceleste doit impérativement s'imposer mardi face à l'Équateur, déjà éliminé.<br /><br />Cinq équipes se tiennent en deux points, entre le Chili (3e, 26 points) et le Paraguay (7e, 24 points) qui garde un mince espoir de qualification grâce à son succès de jeudi (2-1) face à la Colombie (4e, 26 points).<br /><br />L'Argentine ne pointe qu'en sixième position, avec le même nombre de points que les Péruviens (5e, 25), qui occupent pour le moment une place de barragiste et rêvent à une première participation au Mondial depuis 1982.</p>
<h3>Sampaoli est «très confiant»</h3>
<p>Même s'il admet que la position de l'Argentine <em>«n'est pas très confortable»</em>, le sélectionneur Jorge Sampaoli se veut <em>«très confiant dans le fait que nous allons être au Mondial»</em>. Pour le match crucial de jeudi face au Pérou, la Fédération argentine avait misé sur l'ambiance bouillante du mythique stade de la Bombonera.<br /><br />Poussés par quelque 50 000 supporters, les locaux ont eu beaucoup de mal à trouver des espaces face à des Péruviens bien regroupés derrière. Messi a cru ouvrir le score dès la 13e minute, sur une belle combinaison sur corner, mais un défenseur s'est jeté in extremis pour dévier un ballon qui semblait prendre la direction des filets. La Bombonera a soupiré une nouvelle fois dix minutes plus tard, quand Di Maria - remplacé à la pause - a manqué une belle occasion en tirant au-dessus.<br /><br />Les nerfs à vif, les supporters ont retenu leur souffle à la 33e, en voyant Farfan manquer le cadre de peu sur un centre à ras de terre Trauco. Messi bien touché le poteau au retour des vestiaires, mais l'Albiceleste a livré une nouvelle fois une copie bien pâle. <em>«On ne peut pas en demander plus à Leo Messi. Il a eu des opportunités, les a créées, a eu des balles de but. On a eu un Messi très intense, celui dont l'Argentine a besoin»</em>, a considéré Sampaoli.<br /><br />La dernière fois que l'Albiceleste a raté un Mondial (celui de 1970, au Mexique), elle avait été condamnée par un match nul (2-2) face au Pérou, dans ce même stade de la Bombonera. Cette fois, il reste encore un match, un seul, pour tout changer.</p>
</div>
</div>
</article>
</div>
</div>
</div>";
var padding = 10;
View.BackgroundColor = UIColor.White;
_scrollView = new UIScrollView()
{ ShowsHorizontalScrollIndicator = false, AutoresizingMask = UIViewAutoresizing.FlexibleHeight };
//Text article
_artcileTextWeb = new UIWebView();
_artcileTextWeb.LoadHtmlString(text, null);
_artcileTextWeb.ScrollView.ScrollEnabled = false;
var view1 = new UIView { BackgroundColor = UIColor.Blue };
var view3 = new UIView { BackgroundColor = UIColor.Green };
Add(_scrollView);
View.SubviewsDoNotTranslateAutoresizingMaskIntoConstraints();
View.AddConstraints(
_scrollView.AtLeftOf(View),
_scrollView.AtTopOf(View),
_scrollView.WithSameWidth(View),
_scrollView.WithSameHeight(View));
_scrollView.Add(view1);
_scrollView.Add(_artcileTextWeb);
_scrollView.Add(view3);
_scrollView.SubviewsDoNotTranslateAutoresizingMaskIntoConstraints();
var basicwidth = (UIScreen.MainScreen.Bounds.Width - 3 * padding) / 2;
var basicheight = basicwidth / 2;
_scrollView.AddConstraints(
view1.AtTopOf(_scrollView, UIApplication.SharedApplication.StatusBarFrame.Height),
view1.AtLeftOf(_scrollView, padding),
view1.Width().EqualTo(basicwidth),
view1.Height().EqualTo(basicheight),
view3.WithSameTop(view1),
view3.Left().EqualTo().RightOf(view1).Plus(padding),
view3.WithSameHeight(view1),
view3.WithSameWidth(view1),
_artcileTextWeb.Below(view1, padding),
_artcileTextWeb.WithSameLeft(view1),
_artcileTextWeb.WithSameRight(view3),
_artcileTextWeb.WithSameHeight(_scrollView)
);
}
}
如果你运行它,你会看到 UIScrollView 具有相同的屏幕高度并且它不是动态的!
所以,也许 UIWebView 的高度似乎不正确(没有更正的框架大小)!如果是这样,我如何预测 UIWebView 的高度?
即使我使用 CGRect 创建将 UIWebView 的框架添加到我的 UIScrollView,我也需要一个高度!
亲爱的开发者,您有什么想法吗?
最佳答案
回复:Autolayouts in UIScrollView using Cirrious.FluentLayouts.Touch
正确的解决方案:
设置UIWebView
的contentSize
,然后让它AtBottomOf Scrollview
。
第一轮
_artcileTextWeb.Below(view1, padding),
_artcileTextWeb.WithSameLeft(view1),
_artcileTextWeb.WithSameRight(view3),
_artcileTextWeb.Height().EqualTo(_artcileTextWeb.ScrollView.ContentSize.Height),
_artcileTextWeb.AtBottomOf(_scrollView)
但是它不起作用,ScrollView.ContentSize.Height
返回了不正确的结果。
第二轮
_artcileTextWeb = new UIWebView(UIScreen.MainScreen.Bounds);
_artcileTextWeb.LoadHtmlString(text, null);
_artcileTextWeb.ScrollView.ScrollEnabled = false;
string result = _artcileTextWeb.EvaluateJavascript("document.body.offsetHeight;");
int height = Convert.ToInt32(result);
_scrollView.AddConstraints(
//xxxx
_artcileTextWeb.Below(view1, padding),
_artcileTextWeb.WithSameLeft(view1),
_artcileTextWeb.WithSameRight(view3),
_artcileTextWeb.Height().EqualTo(height),
_artcileTextWeb.AtBottomOf(_scrollView)
);
结果总是返回667(屏幕高度),所以我将计算移至方法LoadingFinished
,设置webview加载完成后的内容高度。
第三轮
新建一个 UIWebViewDelegate 的子类
class MyDelegate : UIWebViewDelegate
{
UIScrollView mainView;
public MyDelegate(UIScrollView view) {
mainView = view;
}
public override void LoadingFinished(UIWebView webView)
{
string result = webView.EvaluateJavascript("document.body.offsetHeight;");
mainView.AddConstraints(webView.Height().EqualTo(Convert.ToInt64(result)));
}
}
在 View Controller 中
_artcileTextWeb = new UIWebView(UIScreen.MainScreen.Bounds);
_artcileTextWeb.Delegate = new MyDelegate(_scrollView);
_artcileTextWeb.LoadHtmlString(text, null);
_artcileTextWeb.ScrollView.ScrollEnabled = false;
_artcileTextWeb.Below(view1, padding),
_artcileTextWeb.AtLeftOf(_scrollView), //modify this line
_artcileTextWeb.WithSameWidth(_scrollView), //modify this line
_artcileTextWeb.AtBottomOf(_scrollView)
终于成功了。
关于c# - 在 UIScrollView XAMARIN.IOS C# 中添加 UIWebView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47046146/