使用自动布局时,UITextView 与 pushViewController 一起奇怪地滚动

UITextView scrolls strangely with pushViewController when use autolayout

我在代码中创建了一个带有 UIToolbarUITextView,并将其添加到我的 MainViewController 使用 AutolayoutView 中。但我发现当我的 MainViewController 第一个屏幕 时,如果我将 MainViewController 放在 UITableViewController 之后,UITextView 确实可以正常工作],现在是副屏,效果不佳

截图第二屏:

当我输入第一个 t 时,UITextView 会向下滚动。

当我输入第二个t时,UITextView会向上滚动,显示tt.

AppDelegate:

public override bool FinishedLaunching(UIApplication application, NSDictionary launchOptions)
{
    Window  = new UIWindow(UIScreen.MainScreen.Bounds);

    // work well
    //var navigation = new UINavigationController(new ChatViewController());

    // not work well
    var navigation = new UINavigationController(new MainViewController());

    Window.RootViewController = navigation;
    Window.MakeKeyAndVisible();

    return true;
}

ChatViewController:

public class ChatViewController:UIViewController
{
    public ChatViewController()
    {
    }

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

        // toolbar
        var toolbar = new UIToolbar(){TranslatesAutoresizingMaskIntoConstraints = false};
        toolbar.Layer.BorderColor = UIColor.LightGray.CGColor;
        toolbar.Layer.BorderWidth = 1;

        View.AddSubview(toolbar);

        toolbar.AddConstraints(NSLayoutConstraint.FromVisualFormat("V:[toolbar(==42)]", 0, "toolbar", toolbar));
        View.AddConstraints(NSLayoutConstraint.FromVisualFormat("H:|[toolbar]|", 0, "toolbar", toolbar));
        View.AddConstraints(NSLayoutConstraint.FromVisualFormat("V:[toolbar]|", 0, "toolbar", toolbar));

        // inputTextView

        var inputTextView = new UITextView(){ TranslatesAutoresizingMaskIntoConstraints = false };
        inputTextView.Font = UIFont.SystemFontOfSize(16f);
        inputTextView.Layer.BorderColor = UIColor.LightGray.CGColor;
        inputTextView.Layer.BorderWidth = 1;
        toolbar.AddSubview(inputTextView);

        toolbar.AddConstraints(NSLayoutConstraint.FromVisualFormat("V:|-[textview]-|", 0, "textview",inputTextView));
        toolbar.AddConstraints(NSLayoutConstraint.FromVisualFormat("H:|-[textview]-|", 0, "textview",inputTextView));
    }
}

主视图控制器:

public class MainViewController:UITableViewController
{
    private List<string> strs;

    public MainViewController()
    {
        strs = new List<string>
        {
            "one", "two", "three"
        };
    }

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

    public override UITableViewCell GetCell(UITableView tableView, NSIndexPath indexPath)
    {
        var cell = tableView.DequeueReusableCell("cellId");
        cell = cell ?? new UITableViewCell(UITableViewCellStyle.Default, "cellId");
        cell.TextLabel.Text = strs[indexPath.Row];
        return cell;
    }

    public override void RowSelected(UITableView tableView, NSIndexPath indexPath)
    {
        var chatController = new ChatViewController();
        chatController.View.BackgroundColor = UIColor.White;
        NavigationController.PushViewController(chatController, true);
    }
}

更新 1

最后我发现NavigationController.PushViewController方法导致错误,如果我使用PresentViewController方法,UITextView恢复正常。那么如何解决这个问题,PushViewControllerAutolayoutUITextView 有什么问题?

最后我从here.

中找到了解决方案

3 种不同的方式:

  1. 设置EdgesForExtendedLayout = UIRectEdge.None.

  2. AutomaticallyAdjustsScrollViewInsets = false.

  3. 创建一个新视图并将其添加到 View,然后再添加我的 toolbar