使用自动布局时,UITextView 与 pushViewController 一起奇怪地滚动
UITextView scrolls strangely with pushViewController when use autolayout
我在代码中创建了一个带有 UIToolbar
的 UITextView
,并将其添加到我的 MainViewController
使用 Autolayout
的 View
中。但我发现当我的 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
恢复正常。那么如何解决这个问题,PushViewController
、Autolayout
和 UITextView
有什么问题?
最后我从here.
中找到了解决方案
3 种不同的方式:
设置EdgesForExtendedLayout = UIRectEdge.None
.
AutomaticallyAdjustsScrollViewInsets = false
.
创建一个新视图并将其添加到 View
,然后再添加我的 toolbar
。
我在代码中创建了一个带有 UIToolbar
的 UITextView
,并将其添加到我的 MainViewController
使用 Autolayout
的 View
中。但我发现当我的 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
恢复正常。那么如何解决这个问题,PushViewController
、Autolayout
和 UITextView
有什么问题?
最后我从here.
中找到了解决方案3 种不同的方式:
设置
EdgesForExtendedLayout = UIRectEdge.None
.AutomaticallyAdjustsScrollViewInsets = false
.创建一个新视图并将其添加到
View
,然后再添加我的toolbar
。