Я пытаюсь получить версию iOS для гибридного веб-приложения, чтобы отобразить некоторые элементы управления прогрессом, когда я занимаюсь более длинными операциями, но не знаю, как настроить его. В моей Android версии, я в основном создать контроль прогресса в Main.axml изначально скрыты, а затем просто отобразите их, когда они нужны мне:Как настроить индикатор выполнения в гибридном приложении с помощью WebView в Xamarin ios
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:minWidth="25px"
android:minHeight="25px">
<ProgressBar
android:id="@+id/ProgressSpinner"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
style="@android:style/Widget.ProgressBar.Small"
android:visibility="gone"
android:layout_marginRight="5dp" />
<ProgressBar
android:id="@+id/ProgressBar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
style="@android:style/Widget.ProgressBar.Horizontal"
android:visibility="gone"
android:layout_marginRight="5dp" />
<TextView
android:id="@+id/ProgressText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="" />
<WebView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/webView" />
</LinearLayout>
Как я могу сделать эквивалент в ИО? Вот storyboard.main, что мастер проект создан для меня с приложением WebView:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="6211" systemVersion="14A298i" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" initialViewController="BYZ-38-t0r">
<dependencies>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="6204"/>
</dependencies>
<scenes>
<!--View Controller-->
<scene sceneID="tne-QT-ifu">
<objects>
<viewController id="BYZ-38-t0r" customModuleProvider="" customClass="WebViewController" sceneMemberID="viewController">
<layoutGuides>
<viewControllerLayoutGuide type="top" id="3"/>
<viewControllerLayoutGuide type="bottom" id="4"/>
</layoutGuides>
<webView key="view" contentMode="scaleToFill" id="2BG-WL-JVn">
<rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
</webView>
<connections>
<outlet property="WebView" destination="2BG-WL-JVn" id="name-outlet-2BG-WL-JVn"/>
</connections>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="dkx-z0-nzr" sceneMemberID="firstResponder"/>
</objects>
</scene>
</scenes>
</document>
Если я пытаюсь использовать редактор раскадровки и уронить индикатор, он просто заменяет WebView.
Я также попытался сделать это программно в WebViewController. Сначала установить:
public static UIWebView webView;
public static UIActivityIndicatorView progressSpinner;
public static UIProgressView progressBar;
public static UILabel progressText;
// ...
// Get web view from storyboard backing code.
webView = WebView;
// Set up activity indicator.
progressSpinner = new UIActivityIndicatorView(UIActivityIndicatorViewStyle.Gray);
CGRect bounds = UIScreen.MainScreen.Bounds;
nfloat centerX = bounds.Width/2;
nfloat centerY = bounds.Height/2;
progressSpinner.Frame = new CGRect(
centerX - (progressSpinner.Frame.Width/2),
bounds.Top,
progressSpinner.Frame.Width,
progressSpinner.Frame.Height);
progressSpinner.AutoresizingMask = UIViewAutoresizing.All;
progressSpinner.Hidden = false;
View.InsertSubviewAbove(progressSpinner, webView);
// Set up progress bar.
progressBar = new UIProgressView(UIProgressViewStyle.Bar);
progressBar.Frame = new CGRect(
bounds.Left,
progressSpinner.Frame.Bottom,
bounds.Width,
progressSpinner.Frame.Height);
progressBar.AutoresizingMask = UIViewAutoresizing.All;
progressBar.Hidden = false;
View.InsertSubviewAbove(progressBar, webView);
// Set up progress text message.
progressText = new UILabel();
progressText.Frame = new CGRect(
bounds.Left,
progressBar.Frame.Bottom,
bounds.Width,
progressText.Frame.Height);
progressText.AutoresizingMask = UIViewAutoresizing.All;
progressText.Hidden = false;
View.InsertSubviewAbove(progressText, webView);
Затем, используя его:
public override void ProgressOperation(ProgressMode mode, int value, string message)
{
UIActivityIndicatorView progressSpinner = WebViewController.progressSpinner;
UIProgressView progressBar = WebViewController.progressBar;
UILabel progressText = WebViewController.progressText;
if (progressBar == null)
return;
switch (mode)
{
case ProgressMode.Start:
InProgress = true;
ProgressMax = value;
if (value <= 0)
ProgressMax = 1.0f;
progressBar.Hidden = false;
progressBar.Progress = 0.0f;
if (!String.IsNullOrEmpty(message))
{
progressText.Text = message;
progressText.Hidden = false;
HaveMessage = true;
}
break;
case ProgressMode.Update:
if (InProgress)
{
progressBar.Progress = value/ProgressMax;
if (HaveMessage)
{
if (!String.IsNullOrEmpty(message))
progressText.Text = message;
}
}
break;
case ProgressMode.Stop:
progressBar.Hidden = true;
progressText.Text = String.Empty;
progressText.Hidden = true;
InProgress = false;
HaveMessage = false;
break;
case ProgressMode.Hide:
progressSpinner.StopAnimating();
progressSpinner.Hidden = true;
break;
case ProgressMode.Show:
progressSpinner.Hidden = false;
progressSpinner.StartAnimating();
break;
case ProgressMode.DelayedShow:
if (InDelayedProgress)
{
progressSpinner.Hidden = false;
progressSpinner.StartAnimating();
}
break;
default:
throw new Exception("ProgressOperation: Need mode support for: " + mode.ToString());
}
}
Хотя код отображения и скрытия блесну или другие элементы управления выполняется, элементы управления никогда не видны. Если кто-то может помочь этому новичку, полностью потерявшемуся в конкретной платформе, я буду признателен. Благодарю.
-John