Пользовательский UINavigationBar в MonoTouch - PullRequest
3 голосов
/ 19 августа 2011

В настоящее время я пытаюсь создать пользовательскую панель навигации для моего контроллера навигации в iOS, используя MonoTouch.В приложении, которое я разрабатываю, необходимо, чтобы на экране была доступна единственная строка, независимо от того, где вы находитесь, и я не хочу достигать чего-то подобного (я знаю, что это немного непропорционально, но выдолжно быть в состоянии понять суть):

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

Нижняя полоса должна быть как можно меньше (хотя ее нетрудно прочитать), а исходная панель навигации, возможно, должна быть чуть меньшечем обычно.

Кроме того, я пытался не использовать конструктор, а сам писать весь код пользовательского интерфейса, но если это невозможно сделать, то я буду вынужден использоватьдизайнер.В настоящее время я нашел проект для создания пользовательского UINavigationBar в MonoTouch, но я понятия не имею, как применить это к моему NavigationController (см., Поскольку свойство NavigationBar доступно только для чтения).Проект, о котором я говорил, можно найти здесь: https://github.com/mafis/Monotouch-Custom-Control/tree/master/CustomControls. Кроме того, я хотел бы, чтобы дизайн фактической панели навигации (верхняя часть) был стандартным дизайном iOS и работал бы так, как обычно работает панель навигации.

Будем благодарны за любые подсказки или указания, как это сделать.

Ответы [ 2 ]

4 голосов
/ 12 сентября 2011

Вот так я и решил эту проблему.Я подкласс UIViewController, как это:

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; }
            }
        }
    }
}
1 голос
/ 22 августа 2011

Таким образом, вы хотите сделать то, что делает Spotify в автономном режиме (строковое сообщение, на которое вы ссылаетесь, отображается над UINavigationController).

enter image description here

Не знаюдумаю, что подход, который вы выбираете, сработает - насколько я знаю, NavigationBar может иметь высоту всего 44 пикселя.Не могли бы вы применить аналогичный подход к Spotify и переместить его выше панели навигации?Таким образом, вы можете оставить NavigationController и т. Д. Как есть и просто сделать его вид меньше, а затем добавить строку в объект окна - таким образом, он будет сохраняться при навигации по приложению.

...