iOS代码创建视图:UIImageView与UIButton不显示及导航栏尺寸问题
解决iOS代码创建视图的三个问题
1. 精准获取导航栏的位置与尺寸
不要直接读取NavigationBar.Bounds,ViewDidLoad阶段导航栏布局尚未完成,数据不准确。应该依赖视图控制器的安全区域(Safe Area)或顶部布局参考线来确定内容起始位置:
- iOS 11及以上版本,直接取
View.SafeAreaInsets.Top,该值已包含状态栏+导航栏的总高度 - 如需兼容旧版本,用
TopLayoutGuide.Length获取导航栏底部到视图顶部的距离
如果要单独获取导航栏自身尺寸,建议在ViewWillLayoutSubviews方法中读取,此时布局已稳定:
public override void ViewWillLayoutSubviews() { base.ViewWillLayoutSubviews(); if (NavigationController != null) { var navBarHeight = NavigationController.NavigationBar.Frame.Height; var navBarWidth = NavigationController.NavigationBar.Frame.Width; } }
布局时直接绑定到安全区域,无需手动计算:
banner.Top().EqualTo(View.SafeAreaLayoutGuide.Top)
2. UIImageView加载图片失败解决
你的代码里文件名存在错误:Banner2,jpg用了逗号,正确格式应为Banner2.jpg。同时注意iOS文件名大小写敏感,需与实际文件完全匹配。
正确加载方式:
// 方式1:带完整扩展名 banner.Image = UIImage.FromBundle("Banner2.jpg"); // 方式2:不带扩展名,系统自动匹配 banner.Image = UIImage.FromBundle("Banner2");
另外确认图片的Build Action设置为BundleResource:在Visual Studio右键图片文件→属性→Build Action选择BundleResource,确保图片被打包进应用Bundle。
3. UIButton无法显示的解决
按钮看不见主要有两个原因:
- 默认标题颜色为白色,若背景为浅色会完全透明
- 仅设置位置约束,未定义宽高,按钮无实际尺寸
修改代码如下:
// 用System类型按钮自带基础样式,或手动设置标题颜色 UIButton btnSendText = new UIButton(UIButtonType.System); btnSendText.SetTitle("Send Text", UIControlState.Normal); btnSendText.SetTitleColor(UIColor.Black, UIControlState.Normal); // 添加宽高约束(必须,否则按钮无尺寸) View.AddConstraints( // 原有位置约束... btnSendText.Width().EqualTo(200), btnSendText.Height().EqualTo(44) );
注:你之前设置的Frame会被SubviewsDoNotTranslateAutoresizingMaskIntoConstraints()覆盖,因此无效,必须通过约束明确宽高。
修改后的完整代码示例
public override void ViewDidLoad() { base.ViewDidLoad(); // 初始化控件 UIImageView banner = new UIImageView(); banner.Image = UIImage.FromBundle("Banner2.jpg"); banner.ContentMode = UIViewContentMode.ScaleToFill; UILabel lblTitle = new UILabel(); lblTitle.Text = theSelectedTeam + " Chat Room"; lblTitle.TextAlignment = UITextAlignment.Center; UILabel txtChatMessages = new UILabel(); txtChatMessages.Text = "Messages will appear here"; txtChatMessages.Lines = 0; UITextField txtSendingTextMessage = new UITextField(); txtSendingTextMessage.Placeholder = "Enter Message To Send Here"; txtSendingTextMessage.BorderStyle = UITextBorderStyle.RoundedRect; UIButton btnSendText = new UIButton(UIButtonType.System); btnSendText.SetTitle("Send Text", UIControlState.Normal); btnSendText.SetTitleColor(UIColor.Black, UIControlState.Normal); // 添加到视图 View.Add(banner); View.Add(lblTitle); View.Add(txtChatMessages); View.Add(txtSendingTextMessage); View.Add(btnSendText); // 禁用自动转换约束 View.SubviewsDoNotTranslateAutoresizingMaskIntoConstraints(); // 添加约束 View.AddConstraints( banner.Top().EqualTo(View.SafeAreaLayoutGuide.Top), banner.Leading().EqualTo(View.Leading()), banner.Trailing().EqualTo(View.Trailing()), banner.Height().EqualTo(73), lblTitle.Top().EqualTo(banner.Bottom()).Offset(5), lblTitle.CenterX().EqualTo(banner.CenterX()), txtChatMessages.Top().EqualTo(lblTitle.Bottom()).Offset(10), txtChatMessages.Leading().EqualTo(View.Leading()).Offset(10), txtChatMessages.Trailing().EqualTo(View.Trailing()).Offset(-10), txtSendingTextMessage.Top().EqualTo(txtChatMessages.Bottom()).Offset(10), txtSendingTextMessage.Leading().EqualTo(View.Leading()).Offset(10), txtSendingTextMessage.Trailing().EqualTo(View.Trailing()).Offset(-10), txtSendingTextMessage.Height().EqualTo(44), btnSendText.Top().EqualTo(txtSendingTextMessage.Bottom()).Offset(10), btnSendText.CenterX().EqualTo(txtSendingTextMessage.CenterX()), btnSendText.Width().EqualTo(200), btnSendText.Height().EqualTo(44) ); }
内容的提问来源于stack exchange,提问作者Prescott Chartier
相关产品推荐
相关产品推荐

