UINavigationBar personalizado en MonoTouch

Actualmente estoy tratando de crear una barra de navigation personalizada para mi controller de navigation en iOS usando MonoTouch. La aplicación que estoy desarrollando tiene la necesidad de tener una sola cadena disponible en la pantalla sin importar dónde se encuentre en la aplicación, y no quería lograr algo como esto (sé que esto es un poco fuera de proporción, pero tú debería ser capaz de get el punto):

+-----------------------------------------+ | /---------| +---+ | | / Back | Controller Name |btn| | | \---------| +---+ | +-----------------------------------------+ | Current building <- global string | +-----------------------------------------+ 

La barra inferior debe ser lo más pequeña posible (aunque no sea difícil de leer), y la barra de navigation original debería ser un poco más pequeña de lo normal.

Además, he intentado no usar el diseñador, sino escribir todo el código UI yo mismo, pero si eso es imposible para lograrlo, entonces tendré que usar el diseñador. Actualmente he encontrado un proyecto para crear un UINavigationBar personalizado en MonoTouch, pero no tengo idea de cómo aplicarlo a mi NavigationController (ver como la propiedad NavigationBar-propiedad es de solo lectura). El proyecto del que estaba hablando se puede encontrar aquí: https://github.com/mafis/Monotouch-Custom-Control/tree/master/CustomControls . Además, me gustaría que el layout de la barra de navigation real (la parte superior) fuera un layout estándar de iOS, y que funcionaría como lo haría normalmente una barra de navigation.

Cualquier sugerencia, o sugerencias sobre cómo hacer esto sería apreciada.

Así es como terminé resolviendo este problema. Subclasé UIViewController así:

 using System; using MonoTouch.UIKit; using MonoTouch.CoreGraphics; using System.Drawing; using System.Collections.Generic; using FdvWeb.Core; namespace FdvWeb { [MonoTouch.Foundation.Preserve(AllMembers=true)] public class MainNavigationController : UINavigationController { private const float NAV_BAR_HEIGHT = 44; private readonly float buildingBarTop = 44; private readonly float buildingBarHeight = 17; private readonly float viewOffset; private readonly HashSet<UIViewController> modifiedViewControllers = new HashSet<UIViewController>(); UITextView buildingTextView; [MonoTouch.Foundation.Preserve] public MainNavigationController () { viewOffset = buildingBarTop + buildingBarHeight - NAV_BAR_HEIGHT; var tt = new UITextView (new RectangleF (0, buildingBarTop, 320, buildingBarHeight)); NavigationBarHidden = false; NavigationBar.AddSubview (tt); tt.Font = UIFont.BoldSystemFontOfSize (12); tt.TextAlignment = UITextAlignment.Center; tt.TextColor = UIColor.LightTextColor; tt.BackgroundColor = UIColor.ViewFlipsideBackgroundColor; tt.Editable = false; tt.ContentInset = new UIEdgeInsets (-9, 0, 0, 0); buildingTextView = tt; } public override void ViewDidLoad () { base.ViewDidLoad (); } public override void ViewWillAppear (bool animated) { base.ViewWillAppear (animated); } public string BuildingText { get { return buildingTextView.Text; } set { container.Resolve<IUIThreadDispatcher> ().DispatchOnUIThread (delegate { // Run on UI thread buildingTextView.Text = value; }); } } public override void PushViewController (UIViewController viewController, bool animated) { if (!modifiedViewControllers.Contains (viewController)) { viewController.View = new PaddedView (viewController.View, new InnsetF (0, viewOffset, 0, 0)); modifiedViewControllers.Add (viewController); } viewController.NavigationItem.RightBarButtonItem = pickBuildingItem; base.PushViewController (viewController, animated); } private class PaddedView : UIView { private UIView view; private InnsetF innsets; public PaddedView (UIView view, InnsetF innsets) : base(view.Frame) { this.view = view; this.innsets = innsets; this.AutoresizingMask = UIViewAutoresizing.FlexibleWidth | UIViewAutoresizing.FlexibleHeight; this.AddSubview (view); } public override void LayoutSubviews () { //apply the insets to the subview view.Frame = new RectangleF (innsets.Left, innsets.Top, Frame.Size.Width - innsets.Left - innsets.Right, Frame.Size.Height - innsets.Top - innsets.Bottom); } } private class InnsetF { private float top, bottom, left, right; public InnsetF (float left, float top, float right, float bottom) { this.top = top; this.left = left; this.bottom = bottom; this.right = right; } public float Top { get { return top; } set { top = value; } } public float Bottom { get { return bottom; } set { bottom = value; } } public float Right { get { return right; } set { right = value; } } public float Left { get { return left; } set { left = value; } } } } } 

Así que quieres lo contrario de lo que hace Spotify cuando está fuera de línea (el post de cadena al que te refieres aparece arriba del UINavigationController).

introduzca la descripción de la imagen aquí

No creo que el enfoque que tomas funcione, por lo que yo sé, la barra de navigation solo puede tener 44 píxeles de alto. ¿Podrías tener un enfoque similar a Spotify y moverlo por encima de la barra de navigation? De esta manera, podrías dejar el NavigationController, etc., tal como está y simplemente hacer que su vista sea más pequeña, luego agregar la cadena al object de la window, de esa manera persistirá mientras navegas por tu aplicación.