You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在iOS中通过代码实现指定样式的文本框视图?

纯代码实现带边框的卡片式订单详情视图

你的现有代码存在几个核心问题:创建的viewTitle和descriptionLabel未添加到视图层级中,也没有设置任何布局约束,同时完全没实现卡片的样式效果。下面是完整的实现代码,包含卡片视图、正确布局和样式:

class SecondViewController: UIViewController {
    var items: ItemInfo!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = .white
        
        // 创建页面主标题
        let viewTitle: UILabel = {
            let vt = UILabel()
            vt.translatesAutoresizingMaskIntoConstraints = false
            vt.text = "View Order Details"
            vt.textColor = .black
            vt.font = UIFont.boldSystemFont(ofSize: 28)
            return vt
        }()
        
        // 创建卡片容器视图
        let cardView: UIView = {
            let view = UIView()
            view.translatesAutoresizingMaskIntoConstraints = false
            // 设置卡片样式:边框、圆角、阴影
            view.layer.borderWidth = 1
            view.layer.borderColor = UIColor.lightGray.cgColor
            view.layer.cornerRadius = 8
            view.layer.shadowColor = UIColor.black.cgColor
            view.layer.shadowOffset = CGSize(width: 0, height: 2)
            view.layer.shadowOpacity = 0.1
            view.layer.shadowRadius = 4
            view.backgroundColor = .white
            return view
        }()
        
        // 订单信息标签(用UILabel替代UITextView,避免默认内边距问题)
        let orderInfoLabel: UILabel = {
            let label = UILabel()
            label.translatesAutoresizingMaskIntoConstraints = false
            label.text = "Order Date: Sep 11, 2022   Order # 114   Order total $57.81"
            label.font = UIFont.systemFont(ofSize: 18)
            label.numberOfLines = 0 // 允许文本自动换行
            return label
        }()
        
        // 将控件添加到视图层级
        view.addSubview(viewTitle)
        view.addSubview(cardView)
        cardView.addSubview(orderInfoLabel)
        
        // 设置Auto Layout约束
        NSLayoutConstraint.activate([
            // 主标题约束:顶部距安全区20,水平居中
            viewTitle.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: 20),
            viewTitle.centerXAnchor.constraint(equalTo: view.centerXAnchor),
            
            // 卡片视图约束:顶部距标题20,左右距屏幕16,底部距安全区至少20
            cardView.topAnchor.constraint(equalTo: viewTitle.bottomAnchor, constant: 20),
            cardView.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 16),
            cardView.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -16),
            cardView.bottomAnchor.constraint(lessThanOrEqualTo: view.safeAreaLayoutGuide.bottomAnchor, constant: -20),
            
            // 订单信息标签约束:距卡片四边各16的内边距
            orderInfoLabel.topAnchor.constraint(equalTo: cardView.topAnchor, constant: 16),
            orderInfoLabel.leadingAnchor.constraint(equalTo: cardView.leadingAnchor, constant: 16),
            orderInfoLabel.trailingAnchor.constraint(equalTo: cardView.trailingAnchor, constant: -16),
            orderInfoLabel.bottomAnchor.constraint(equalTo: cardView.bottomAnchor, constant: -16)
        ])
    }
}

关键细节说明:

  • 卡片视图实现:用普通UIView作为容器,通过layer属性设置边框宽度、颜色、圆角,搭配阴影效果模拟卡片质感。
  • 控件层级:把订单信息标签嵌套在卡片视图内部,保证视觉上属于卡片的一部分。
  • 布局适配:使用Auto Layout设置所有控件的位置和尺寸,适配不同屏幕尺寸。
  • 替换UITextView:UITextView默认带有内边距和滚动特性,对于固定展示的订单信息,UILabel更简洁,设置numberOfLines = 0可支持自动换行。

如果需要扩展卡片内容(比如添加多行订单条目),可以在卡片视图中加入UITableView或多个标签来实现。

内容的提问来源于stack exchange,提问作者Swayam Shah

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 15:10:22