Placing a SearchBar in the top/navigation bar

前端 未结 1 1889
名媛妹妹
名媛妹妹 2020-12-30 14:58

In a Forms project, is it possible to place a SearchBar such that it appears in the top/navigation bar of the app? What I want to achieve is something along the lines of the

相关标签:
1条回答
  • 2020-12-30 15:28

    To do this, you should write a renderer for your Page

    There is my implementation for iOS (with custom 'searchField')

    using CoreGraphics;
    using Foundation;
    using MyControls;
    using MyRenderer;
    using UIKit;
    using Xamarin.Forms;
    
    [assembly: ExportRenderer(typeof(MySearchContentPage), typeof(MySearchContentPageRenderer))]
    
    namespace IOS.Renderer
    {
        using Xamarin.Forms.Platform.iOS;
    
        public class MySearchContentPageRenderer : PageRenderer
        {
            public override void ViewWillAppear(bool animated)
            {
                base.ViewWillAppear(animated);
    
                SetSearchToolbar();
            }
    
            public override void WillMoveToParentViewController(UIKit.UIViewController parent)
            {
                base.WillMoveToParentViewController(parent);
    
                if (parent != null)
                {
                    parent.NavigationItem.RightBarButtonItem = NavigationItem.RightBarButtonItem;
                    parent.NavigationItem.TitleView = NavigationItem.TitleView;
                }
            }
    
            private void SetSearchToolbar()
            {
                var element = Element as MySearchContentPage;
                if (element == null)
                {
                    return;
                }
    
                var width = NavigationController.NavigationBar.Frame.Width;
                var height = NavigationController.NavigationBar.Frame.Height;
                var searchBar = new UIStackView(new CGRect(0, 0, width * 0.85, height));
    
                searchBar.Alignment = UIStackViewAlignment.Center;
                searchBar.Axis = UILayoutConstraintAxis.Horizontal;
                searchBar.Spacing = 3;
    
                var searchTextField = new MyUITextField();
                searchTextField.BackgroundColor = UIColor.FromRGB(239, 239, 239);
                NSAttributedString strAttr = new NSAttributedString("Search", foregroundColor: UIColor.FromRGB(146, 146, 146));
                searchTextField.AttributedPlaceholder = strAttr;
                searchTextField.SizeToFit();
    
                // Delete button
                UIButton textDeleteButton = new UIButton(new CGRect(0, 0, searchTextField.Frame.Size.Height + 5, searchTextField.Frame.Height));
                textDeleteButton.Font = UIFont.FromName("FontAwesome", 18f);
                textDeleteButton.BackgroundColor = UIColor.Clear;
                textDeleteButton.SetTitleColor(UIColor.FromRGB(146, 146, 146), UIControlState.Normal);
                textDeleteButton.SetTitle("\uf057", UIControlState.Normal);
                textDeleteButton.TouchUpInside += (sender, e) => 
                {
                    searchTextField.Text = string.Empty;
                };
    
                searchTextField.RightView = textDeleteButton;
                searchTextField.RightViewMode = UITextFieldViewMode.Always;
    
                // Border
                searchTextField.BorderStyle = UITextBorderStyle.RoundedRect;
                searchTextField.Layer.BorderColor = UIColor.FromRGB(239, 239, 239).CGColor;
                searchTextField.Layer.BorderWidth = 1;
                searchTextField.Layer.CornerRadius = 5;
                searchTextField.EditingChanged += (sender, e) => 
                { 
                    element.SetValue(MySearchContentPage.SearchTextProperty, searchTextField.Text);
                };
    
                searchBar.AddArrangedSubview(searchTextField);
    
                var searchbarButtonItem = new UIBarButtonItem(searchBar);
                NavigationItem.SetRightBarButtonItem(searchbarButtonItem, true);
    
                NavigationItem.TitleView = new UIView();
    
                if (ParentViewController != null)
                {
                    ParentViewController.NavigationItem.RightBarButtonItem = NavigationItem.RightBarButtonItem;
                    ParentViewController.NavigationItem.TitleView = NavigationItem.TitleView;
                }
            }
        }
    }
    

    Also, there is some discussion:How to include view in NavigationBar of Xamarin Forms?

    I hope, you understood the main idea.

    0 讨论(0)
提交回复
热议问题