为啥在 subView 中添加 UILabel 会使其像素化

Posted

技术标签:

【中文标题】为啥在 subView 中添加 UILabel 会使其像素化【英文标题】:Why does adding UILabel in subView makes it pixelated为什么在 subView 中添加 UILabel 会使其像素化 【发布时间】:2017-03-12 04:26:16 【问题描述】:

我正在制作一条消息,当 tableView 为空并且我在 subView 中添加了一个标签并且它似乎被像素化时显示。但是当我在我的 tableView 中添加一些东西并删除它时,显示的消息(UILabel)就很好了。想不通为什么。

self.tableView.backgroundView = emptyLabel 中添加标签可以解决问题,但我想添加两个标签,所以我在subView 中添加一个标签,使其像素化。

这是我的代码:

class ReminderTableViewController: UITableViewController


@IBOutlet var myTableView: UITableView!
@IBOutlet weak var dateLabel: UIView!
@IBAction func back(_ sender: Any) 
    dismiss(animated: true, completion: nil)



override func viewDidLoad() 
    super.viewDidLoad()

    self.tableView.separatorColor = UIColor.clear
    tableView.separatorStyle = .none
    

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 
   performSegue(withIdentifier: "details", sender: self)


 public func buttonImageForEmptyStateView() -> UIImage? 
    return UIImage.init(named: "Exclamation Mark Filled-100-2")




override func viewDidAppear(_ animated: Bool) 
    tableView.reloadData()
     self.reloadEmptyState(forTableView: self.tableView)




override func didReceiveMemoryWarning() 
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.



override func numberOfSections(in tableView: UITableView) -> Int 

    return 1


override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 


    if list.count==0
        let emptyLabel=UILabel(frame: CGRect(x: 0,y: 0, width: self.view.bounds.width, height: self.view.bounds.height))
        let emptyLabel2=UILabel(frame: CGRect(x: 0.0,y: 20.0, width: self.view.bounds.width, height: self.view.bounds.height))


        self.view.addSubview(emptyLabel2)
        self.view.addSubview(emptyLabel)

        let emptyImage = UIImageView(image: UIImage(named: "Quote Right Filled-100 (3)"))
        emptyImage.translatesAutoresizingMaskIntoConstraints = false 
        self.view.addSubview(emptyImage)
        emptyImage.alpha=0.1
        NSLayoutConstraint.activate([
            emptyImage.centerXAnchor.constraint(equalTo: self.view.centerXAnchor),
            emptyImage.centerYAnchor.constraint(equalTo: self.view.centerYAnchor),
            emptyImage.heightAnchor.constraint(equalToConstant: 90),
            emptyImage.widthAnchor.constraint(equalToConstant: 90)
            ])


        emptyLabel.text = "no present reminders"
        emptyLabel.textColor=UIColor.darkGray
        emptyLabel.font=UIFont(name: "HelveticaNeue-Light", size: 18)
        emptyLabel.textAlignment = NSTextAlignment.center

        emptyLabel2.text = "you add by going back to the homescreen"
        emptyLabel2.textColor=UIColor.gray
        emptyLabel2.font=UIFont(name: "HelveticaNeue-Light", size: 11)
        emptyLabel2.textAlignment = NSTextAlignment.center


        self.tableView.separatorStyle = UITableViewCellSeparatorStyle.none

        return 0
    
    else
         return (list.count)
    



override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 

    let cell=UITableViewCell(style: UITableViewCellStyle.default, reuseIdentifier: "cell")
    cell.textLabel?.text=list[indexPath.row]
    cell.contentView.backgroundColor = UIColor(red:0.89, green:0.89, blue:0.89, alpha:0.7)
    cell.textLabel?.textColor=UIColor.black
    cell.textLabel?.font=UIFont(name: "HelveticaNeue-Light", size: 16)
    return (cell)






override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) 
    if editingStyle==UITableViewCellEditingStyle.delete
        list.remove(at: indexPath.row)
        tableView.reloadData()
    


【问题讨论】:

标签的父级(或父级的父级&c)是否有变换? 不,没有使用转换。 你试过在iphone而不是模拟器上测试吗? @Alshcompiler 是的,我有。结果是一样的。 你在哪里调用这个代码 【参考方案1】:

numberOfRowsInSection 被多次调用,所以没有添加子视图的好地方,因为每次这个函数调用另一个 UILabel 的实例添加到视图层次结构。

删除在numberOfRowsInSection 中添加标签。添加类变量:

var emptyLabel: UILabel!
var emptyLabel2: UILabel!
var emptyImage: UIImageView!

然后添加函数

 func createEmptyLabels() 
    emptyLabel=UILabel(frame: CGRect(x: 0,y: 0, width: self.view.bounds.width, height: self.view.bounds.height))
    emptyLabel2=UILabel(frame: CGRect(x: 0.0,y: 20.0, width: self.view.bounds.width, height: self.view.bounds.height))


    self.view.addSubview(emptyLabel2)
    self.view.addSubview(emptyLabel)

    emptyImage = UIImageView(image: UIImage(named: "Quote Right Filled-100 (3)"))
    emptyImage.translatesAutoresizingMaskIntoConstraints = false
    self.view.addSubview(emptyImage)
    emptyImage.alpha=0.1
    NSLayoutConstraint.activate([
        emptyImage.centerXAnchor.constraint(equalTo: self.view.centerXAnchor),
        emptyImage.centerYAnchor.constraint(equalTo: self.view.centerYAnchor),
        emptyImage.heightAnchor.constraint(equalToConstant: 90),
        emptyImage.widthAnchor.constraint(equalToConstant: 90)
        ])


    emptyLabel.text = "no present reminders"
    emptyLabel.textColor=UIColor.darkGray
    emptyLabel.font=UIFont(name: "HelveticaNeue-Light", size: 18)
    emptyLabel.textAlignment = NSTextAlignment.center

    emptyLabel2.text = "you add by going back to the homescreen"
    emptyLabel2.textColor=UIColor.gray
    emptyLabel2.font=UIFont(name: "HelveticaNeue-Light", size: 11)
    emptyLabel2.textAlignment = NSTextAlignment.center

    emptyLabel.isHidden = true
    emptyLabel2.isHidden = true
    emptyImage.isHidden = true

viewDidLoad中调用这个函数

numberOfRowsInSection:

let hideEmptyViews = (list.count != 0)
emptyLabel.isHidden = hideEmptyViews
emptyLabel2.isHidden = hideEmptyViews
emptyImage.isHidden = hideEmptyViews

【讨论】:

当表格有一些条目时,它会显示标签和 imageView。它起着反作用。我希望它在 TableView 为空时显示 我写错了,应该是let hideEmptyViews = (list.count != 0)我已经编辑了我的答案。 是的,它有效,知道如何更改标签和 UIImages 的出现顺序。我希望我的图像位于我的标签之下。 使用UIStackView【参考方案2】:

您在numberOfRowsInSection 中添加标签。问题是这个方法被调用了很多次。因此,您添加了许多标签副本,彼此堆叠在一起,这使标签看起来很有趣。

【讨论】:

如何去掉这堆东西,让标签看起来不好笑。 如果您已经添加了标签并且它仍然存在,请不要再次添加。 我没有看到你在添加标签后删除标签,或者检查以查看它是否已添加。因此,正如我所说,它只是一次又一次地添加。您只是确认了我已经回答的内容。

以上是关于为啥在 subView 中添加 UILabel 会使其像素化的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式将 UILabel 添加到集合单元,快速

为啥我的 superview-with-subview 在模态显示(使用自动布局)时会缩小?

使用多个 SubView 调整 ScrollView

为啥在 Interface Builder 中更改字体大小会阻止 UILabel 调整大小以适应内容?

为啥 UIStackView 中的 UILabel 在重用时会失去高度?

为啥我的 UILabel 的 AutoLayout 不起作用