0

Я использую MonoTouch.Dialog для создания страницы в приложении Xamarin iOS.Monotouch Dialog - Multi line RootElement

Я пытаюсь создать многострочный RootElement, используя метод GetCell. Это нормально работает при загрузке, но если вы нажмете на другую вкладку и верните элемент, то сбрасывается обратно до размера по умолчанию (также когда вы нажимаете на элемент, который вы видите, он сжимается до перехода).

Я пробовал возиться с UnevenRows без успеха.

public partial class TestController : UITabBarController 
{ 
    public TestController() 
     : base("TestController", null) 
    { 
    } 

    public override void ViewDidLoad() 
    { 
     base.ViewDidLoad(); 

     var navController = new UINavigationController 
     { 
      Title = "Test1" 
     }; 
     navController.PushViewController(new TestDialogViewController(), false); 

     ViewControllers = new[] 
     { 
      navController, 
      new UIViewController 
      { 
       Title = "Test2" 
      }, 
     }; 
    } 
} 

public class TestDialogViewController : DialogViewController 
{ 
    public TestDialogViewController() : base(new RootElement("Test")) 
    { 
     Root.UnevenRows = true; // has no effect 

     var testSection = new Section("Test section"); 
     var testChildRootElement = new CustomRootElement("Multi\nLine\nElement") 
     { 
      UnevenRows = true // has no effect 
     }; 

     var testChildSection = new Section("Test child section"); 
     var testEntryElement = new EntryElement(string.Empty, string.Empty, "Test entry element"); 

     testChildSection.Add(testEntryElement); 
     testChildRootElement.Add(testChildSection); 
     testSection.Add(testChildRootElement); 

     Root.Add(testSection); 
    } 
} 

public class CustomRootElement : RootElement 
{ 
    public CustomRootElement(string caption) : base(caption) {} 

    public override UITableViewCell GetCell(UITableView tv) 
    { 
     var cell = base.GetCell(tv); 

     // Setup Multi-line Element 
     cell.TextLabel.LineBreakMode = UILineBreakMode.WordWrap; 
     cell.TextLabel.Lines = 0; 
     return cell; 
    } 
} 

ответ

1

Нашли обходной путь, который, кажется, сделать трюк

Добавьте к этому DialogViewController:

public override void ViewWillLayoutSubviews() 
    { 
     if (TableView != null && TableView.VisibleCells.Any()) 
     { 
      foreach (var cell in TableView.VisibleCells) 
      { 
       cell.SizeToFit(); 
      } 
     } 
     base.ViewWillLayoutSubviews(); 
    } 

ОБНОВЛЕНО:

выше решение не работать с несколькими элементами, а при вычислении таблицы высоты не вычислялись.

Лучшим решением было использовать пользовательский UITableViewSource (наследовать от MonoTouch.Dialog. DialogViewController.SizingSource, который используется по умолчанию имеет все дополнительные функциональные возможности).

Ниже приведена базовая реализация для ясности, но вы, вероятно, не захотите вызывать GetCell() каждый раз, когда GetHeight() вызывается в производственной версии.

public partial class TestController : UITabBarController 
{ 
    public TestController() : base("TestController", null) {} 

    public override void ViewDidLoad() 
    { 
     base.ViewDidLoad(); 

     var navController = new UINavigationController(); 
     navController.PushViewController(new TestDialogViewController(), false); 
     navController.TopViewController.Title = "Tab 1"; 

     ViewControllers = new[] 
     { 
      navController, 
      new UIViewController { Title = "Test2" } 
     }; 
    } 
} 

public class TestDialogViewController : DialogViewController 
{ 
    public TestDialogViewController() : base(new RootElement("Test")) 
    { 
     Root.Add(new Section("Test section") 
     { 
      new CustomRootElement("Multi\nLine\nElement") 
      { 
       new Section("Test child section") 
       { 
        new EntryElement("Test element", string.Empty, "value") 
       }, 
      }, 
      new EntryElement("Test element", string.Empty, "value") 
     }); 
    } 

    public override void ViewDidLoad() 
    { 
     base.ViewDidLoad(); 
     TableView.Source = new CustomTableViewSource(this); 
    } 

} 

public class CustomTableViewSource : DialogViewController.SizingSource 
{ 
    public CustomTableViewSource(DialogViewController controller) : base(controller) {} 

    public override float GetHeightForRow(UITableView tableView, NSIndexPath indexPath) 
    { 
     // Recommend storing these values, as is appropriate for your usage 
     var cell = GetCell(tableView, indexPath); 
     cell.SizeToFit(); 
     return cell.Frame.Height; 
    } 
} 


public class CustomRootElement : RootElement 
{ 
    public CustomRootElement(string caption) : base(caption) {} 

    public override UITableViewCell GetCell(UITableView tv) 
    { 
     var cell = base.GetCell(tv); 

     // Setup Multi-line Element 
     cell.TextLabel.LineBreakMode = UILineBreakMode.WordWrap; 
     cell.TextLabel.Lines = 0; 

     return cell; 
    } 
} 
Смежные вопросы