2017-01-05 3 views
0

Я пытаюсь получить версию 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

ответ

0

То, что я, наконец, в конечном итоге это должно было пройти через первые пару частей одного из Xcode Interface Builder учебники от Apple (https://developer.apple.com/library/content/referencelibrary/GettingStarted/DevelopiOSAppsSwift/). Из этого я смог вывести, что мне нужно было начать с представления со встроенным вертикальным представлением стека со встроенным индикатором активности, индикатором выполнения, меткой и элементами управления веб-представлением, соответствующим образом настроить ограничения и даже экспериментировать с выходами и немного Быстрый код.

Я тогда попытался сделать то же самое с построителем интерфейса Xamarin, даже после одного из их руководств, но я не мог понять механизм ограничения, чтобы делать то, что я сделал в xcode, поэтому я сдался и просто скопировал источник раскадровки xcode. Мне пришлось немного взломать его, чтобы заставить его работать. Мне пришлось повторно использовать некоторые из тех же атрибутов из версии Xamarin, удалить выходы и переделать выходы с помощью построителя интерфейса Xamarin.

Я удивлен, что никто не мог занять пару минут, чтобы дать мне подсказку перейти от использования веб-представления в качестве основного вида вида view-> stack-> spinner + bar + label + web hierarchy , Но я думаю, что несколько часов, которые немного узнали о xcode, были, вероятно, потраченными на долгое время и интересными. Конструктор интерфейса xcode кажется единственной пригодной для использования версией тех немногих, которые я использовал до сих пор.