最新消息:20210816 当前crifan.com域名已被污染,为防止失联,请关注(页面右下角的)公众号

[暂未解决]Swift中获取不到UITableViewCell的imageView的frame的真实大小

iOS crifan 2198浏览 0评论

折腾:

[已解决]swift给图片画一个badge:给红色背景的圆圈加上数字或文字且放置在右上角

期间,此时图片其实已经正常显示的:

想要获得

UITableViewCell的imageView的frame的真实大小

但是得到的却是0:

            cell.imageView?.image = UIImage(named:"hdImg_xuchen_48x48.jpg")

           

            let badgeView = drawBadgeView("3")

            cell.imageView?.addSubview(badgeView)

            //badgeView.removeFromSuperview() //can remove this badge view if necessary

           

            print("cell.imageView!.frame=\(cell.imageView!.frame)")

            print("badgeView.frame=\(badgeView.frame)")

结果输出结果是:

cell.imageView!.frame=(0.0, 0.0, 0.0, 0.0)

badgeView.frame=(0.0, 0.0, 18.0, 18.0)

即,无法获得frame的大小:

搜:

swift UITableViewCell imageView frame size 0

swift UITableViewCell imageView frame real size

swift UITableViewCell imageView frame

参考:

ios – When using a custom UITableViewCell the imageview frame is zero – Stack Overflow

看起来的感觉是:

1.对于cellForRowAtIndexPath期间,即使设置了cell.imageView的image:

cell.imageView?.image = UIImage(named:"hdImg_pnp_48x48.jpg")

但是对于cell.imageView的frame的大小,都还是0

所以无奈,只能换种思路:

用image创建一个image view,

但是结果也无法直接设置,否则会出错:

            let imageView = UIImageView(image: UIImage(named:"hdImg_xuchen_48x48.jpg"))

            print("imageView.frame=\(imageView.frame)") //imageView.frame=(0.0, 0.0, 48.0, 48.0)

            //cell.imageView = imageView // Cannot assign to property: ‘imageView’ is a get-only property

最后只能改为:

间接的设置图片和frame:

            let imageView = UIImageView(image: UIImage(named:"hdImg_xuchen_48x48.jpg"))

            print("imageView.frame=\(imageView.frame)") //imageView.frame=(0.0, 0.0, 48.0, 48.0)

            //cell.imageView = imageView // Cannot assign to property: ‘imageView’ is a get-only property

            cell.imageView?.frame = imageView.frame

            cell.imageView?.image = imageView.image

才达到目的:

或许可以通过cell.imageView!.frame去获得对应的大小:

此处是用于将badge放在右上角的位置。

完整代码:

           let imageView = UIImageView(image: UIImage(named:"hdImg_xuchen_48x48.jpg"))

            print("imageView.frame=\(imageView.frame)") //imageView.frame=(0.0, 0.0, 48.0, 48.0)

            //cell.imageView = imageView // Cannot assign to property: ‘imageView’ is a get-only property

            cell.imageView?.frame = imageView.frame

            cell.imageView?.image = imageView.image

            let badgeView = drawBadgeView("3")

            cell.imageView?.addSubview(badgeView)

            //badgeView.removeFromSuperview() //can remove this badge view if necessary

           

            print("cell.imageView!.frame=\(cell.imageView!.frame)") //cell.imageView!.frame=(0.0, 0.0, 48.0, 48.0)

            print("cell.imageView!.bounds=\(cell.imageView!.bounds)") //cell.imageView!.bounds=(0.0, 0.0, 48.0, 48.0)

            print("badgeView.frame=\(badgeView.frame)") //badgeView.frame=(0.0, 0.0, 18.0, 18.0)

            badgeView.frame.origin.x = (cell.imageView?.frame.size.width)! – badgeView.frame.width

供参考。

[后记 2015-11-04]

后来看到:

从一段奇葩的objc代码看代码规范的重要性 – Lancy’s Blog

中的“不要在vc的init的函数里面初始化,尤其是初始化视图。而应该在viewdidload里面初始化,保证self.view已经生成。”

感觉是:

View没有被(带frame)的init,所以那时候self.view还没有生成。

所以frame大小是0 ?

转载请注明:在路上 » [暂未解决]Swift中获取不到UITableViewCell的imageView的frame的真实大小

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
83 queries in 0.163 seconds, using 22.19MB memory