对于更长的选项字符串,我有哪些选项?

时间:2017-01-10 13:16:39

标签: ios objective-c swift xamarin.ios

正如我们在屏幕底部看到的那样,有一些选项可供选择。 这个菜单有哪些其他选项可以让我完全显示更长的字符串?

optionmenu

1 个答案:

答案 0 :(得分:1)

根据您的要求,您必须自定义一个:

尝试使用此代码:

using System;
using System.Collections.Generic;
using CoreGraphics;
using UIKit;

namespace CusActionSheet
{
    public delegate void OneParameterEventHandler<T>(T data);

    public class ALActionSheet : UIView
    {
        private nfloat maximumProportion = 0.8f;

        public event OneParameterEventHandler<string> RowClicked;

        //You also can use this if you don't know the generic(but remeber also change it for source):
        //public delegate void OneParameterEventHandler(string data);
        //public event OneParameterEventHandler SelectedPhoneNumber;

        private UIView backgroundContainer;
        private UIView topContainer;
        private UILabel topContainerTitleView;
        private UITableView topContainerTable;
        private ALActionSheetSource topContainerTableSource;

        private UIButton btnCancel;

        private nfloat itemPadding = 10;
        private nfloat itemHeight = 60;
        private nfloat cornerRadius = 10;

        private List<string> dataList;

        private CGRect backContainerShownFrame;
        private CGRect backContainerHiddenFrame;

        private string selectedNumber;

        public CGRect BackContainerShownFrame
        {
            get
            {
                return backContainerShownFrame;
            }

            set
            {
                backContainerShownFrame = value;
            }
        }

        public ALActionSheet(List<string> _dataList)
        {
            this.BackgroundColor = UIColor.Clear;
            this.dataList = _dataList;

            backgroundContainer = new UIView();
            backgroundContainer.Layer.CornerRadius = cornerRadius;
            backgroundContainer.Layer.MasksToBounds = true;

            topContainer = new UIView();
            topContainer.BackgroundColor = UIColor.White;
            topContainer.Layer.CornerRadius = cornerRadius;
            topContainer.Layer.MasksToBounds = true;

            topContainerTitleView = new UILabel();
            topContainerTitleView.Text = "Select a number";
            topContainerTitleView.TextAlignment = UITextAlignment.Center;
            topContainerTitleView.BackgroundColor = UIColor.FromRGB(230, 230, 230);
            topContainer.AddSubview(topContainerTitleView);

            topContainerTableSource = new ALActionSheetSource(dataList);
            topContainerTableSource.RowClicked += (data) =>
            {
                selectedNumber = data;
                Close();
            };

            topContainerTable = new UITableView();
            topContainerTable.RowHeight = itemHeight;
            topContainerTable.Layer.CornerRadius = cornerRadius;
            topContainerTable.Layer.MasksToBounds = true;
            topContainerTable.BackgroundColor = UIColor.White;
            topContainerTable.Source = topContainerTableSource;
            topContainer.AddSubview(topContainerTable);

            btnCancel = new UIButton(UIButtonType.System);
            btnCancel.SetTitle("Cancel", UIControlState.Normal);
            btnCancel.TitleLabel.Font = UIFont.SystemFontOfSize(18);
            btnCancel.BackgroundColor = UIColor.White;
            btnCancel.Layer.CornerRadius = cornerRadius;
            btnCancel.Layer.MasksToBounds = true;
            btnCancel.TouchUpInside += delegate
            {
                Close();
            };

            backgroundContainer.AddSubview(topContainer);
            backgroundContainer.AddSubview(btnCancel);

            Layout();
        }

        public void Layout()
        {
            this.Frame = UIScreen.MainScreen.Bounds;

            nfloat tableMaxHeight = UIScreen.MainScreen.Bounds.Height * maximumProportion - 2 * itemPadding - 2 * itemHeight;
            nfloat tableHeight = dataList.Count * itemHeight < tableMaxHeight ? dataList.Count * itemHeight : tableMaxHeight;

            nfloat itemWidth = UIScreen.MainScreen.Bounds.Width - 2 * itemPadding;

            nfloat backgroundContainerHeight = tableHeight + 2 * itemHeight + itemPadding;
            backgroundContainer.Frame = new CGRect(0, 0, itemWidth, backgroundContainerHeight);

            nfloat topContainerHeight = itemHeight + tableHeight;
            topContainer.Frame = new CGRect(0, 0, itemWidth, topContainerHeight);

            topContainerTitleView.Frame = new CGRect(0, 0, itemWidth, itemHeight);
            topContainerTable.Frame = new CGRect(0, itemHeight, itemWidth, tableHeight);

            btnCancel.Frame = new CGRect(0, topContainerHeight + itemPadding, itemWidth, itemHeight);

            BackContainerShownFrame = new CGRect(new CGPoint(itemPadding, UIScreen.MainScreen.Bounds.Height - backgroundContainerHeight - itemPadding), backgroundContainer.Bounds.Size);
            backContainerHiddenFrame = new CGRect(new CGPoint(itemPadding, UIScreen.MainScreen.Bounds.Height + itemPadding), backgroundContainer.Bounds.Size);
        }

        public void Show()
        {
            UIApplication.SharedApplication.KeyWindow.AddSubview(this);
            backgroundContainer.Frame = backContainerHiddenFrame;
            this.AddSubview(backgroundContainer);
            UIView.Animate(0.3, delegate
            {
                this.BackgroundColor = UIColor.FromRGBA(0, 0, 0, 0.5f);
                backgroundContainer.Frame = BackContainerShownFrame;
            });
        }

        public void Close()
        {
            UIView.Animate(0.3, delegate
            {
                backgroundContainer.Frame = backContainerHiddenFrame;
                this.BackgroundColor = UIColor.Clear;
            }, delegate
            {
                this.RemoveFromSuperview();
                if (null != RowClicked && null != selectedNumber)
                    RowClicked(selectedNumber);
            });
        }
    }

    class ALActionSheetSource : UITableViewSource
    {
        public event OneParameterEventHandler<string> RowClicked;

        private string cellID = "ALActionSheetCell";
        private List<string> dataList;

        public ALActionSheetSource(List<string> _dataList)
        {
            dataList = _dataList;
        }

        public override nint RowsInSection(UITableView tableview, nint section)
        {
            return dataList.Count;
        }

        public override UITableViewCell GetCell(UITableView tableView, Foundation.NSIndexPath indexPath)
        {
            UITableViewCell cell = tableView.DequeueReusableCell(cellID);
            if (null == cell)
            {
                cell = new UITableViewCell(UITableViewCellStyle.Default, cellID);
                cell.TextLabel.TextAlignment = UITextAlignment.Center;
                //cell.TextLabel.AdjustsFontSizeToFitWidth = true;//Auto resize by content
                cell.TextLabel.Lines = int.MaxValue;//Multiple lines
            }

            cell.TextLabel.Text = dataList[indexPath.Row];
            return cell;
        }

        public override void RowSelected(UITableView tableView, Foundation.NSIndexPath indexPath)
        {
            if (null != RowClicked)
                RowClicked(dataList[indexPath.Row]);
        }
    }
}

并像这样调用它:

public override void ViewDidLoad()
        {
            base.ViewDidLoad();
            // Perform any additional setup after loading the view, typically from a nib.

            List<string> testList = new List<string>();
            for (int i = 0; i < 10; i++) {
                testList.Add("Item " + i.ToString());
            }
            testList.Add("I'm a very very very very very very very very long text.");
            ALActionSheet actionSheet = new ALActionSheet(testList);
            actionSheet.RowClicked += (data) => {
                Console.WriteLine("data = "+data);
            };


            UIButton btnTest = new UIButton(UIButtonType.System);
            btnTest.SetTitle("Test", UIControlState.Normal);
            btnTest.Frame = new CoreGraphics.CGRect(50, 50, 80, 30);
            btnTest.TouchUpInside += delegate {
                actionSheet.Show();
            };
            this.Add(btnTest);
        }

希望它可以帮到你。