美文网首页iOS高质量博客IOS网友们的篇章
修改使用xib自定义cell的子控件的frame

修改使用xib自定义cell的子控件的frame

作者: CoderAO | 来源:发表于2015-08-02 21:44 被阅读4073次

最近发现了一个比较奇怪的现象:使用xib自定义UITableViewCell时添加了一些子控件进去(并没有为它们添加约束),却发现在代码里面无论如何都没办法修改这些子控件的frame.

如果修改frame的代码是放在cell的layoutSubviews方法中,那么会出现一开始的时候frame没有改变,当cell滚动出屏幕或者在表视图reloadData之后frame才发生改变的情况.

这个问题的解决方法有两个:

  • 将AutoLayout的勾选去掉,即禁用掉cell的自动布局.

因为xib文件在被创建的时候会自动将AutoLayout勾选,所以即使没有为子控件添加约束,系统也会默默地将子控件当前的位置和尺寸信息转成约束,导致代码里面无法修改其frame.禁用掉AutoLayout后就没有"约束"这一说法了.

  • 将修改frame的语句搬到cell的drawRect:方法里面.

如:

- (void)drawRect:(CGRect)rect {
    self.yellowView.frame = CGRectMake(50, 0, 20, 20);
}

drawRect:方法通常在第一次显示到屏幕上的时候调用.

总结:

虽说上面两个方法可以解决出现的问题,但是并不推荐使用.

因为AutoLayout早已是必然趋势,不使用会遭淘汰.而drawRect:方法的主要作用是绘制,让这个方法承受太多总觉得不妥,也不建议在这个方法里面设置其他的东西.

如果确实有修改某个子控件frame的需要

你可以尝试:

  • 为这个子控件添加约束,需要修改位置或者尺寸的时候尝试去修改它的约束
  • 如果这个子控件的约束条件以及显示与否都不能确定,那么不要在xib中创建这个子控件,而是选择在代码中动态创建

相关文章

  • 自定义不等高cell

    自定义不等高cell 自定义不等高cell(纯代码) 给模型增加frame数据 所有子控件的frame cell...

  • 关于动态改变tableviewCell内部子控件的frame

    如果你是用xib定义了cell(如果是用纯代码手写请跳过本文),那么cell内的子控件不能通过frame修改,也就...

  • UITableView(自定义cell)(2)

    自定义不等高cell frame方法 给模型增加frame数据 所有子控件的frame cell的高度 重写模型c...

  • 修改使用xib自定义cell的子控件的frame

    最近发现了一个比较奇怪的现象:使用xib自定义UITableViewCell时添加了一些子控件进去(并没有为它们添...

  • Cell定制和Frame模型引入

    一、xib定制cell 二、代码定制cell 三、frame模型引入(自定义高度)

  • xib中的frame

    使用XIB自定义cell,并且使用了Masonry,所以在awakeFromNib 方法中是拿不到正确的frame...

  • 5.等高的cell设置

    1.内容大纲: 2.纯代码,添加子控件 项目初始准备: 创建自定义的cell: 3.自定义等高的cell--xib...

  • 不等高cell

    纯代码创建 frame 一.给模型增加frame数据 所有子控件的frame cell的高度 二.重写模型cell...

  • Learning iOS D6 2017-10-27

    今日完成两个页面 !! 自定义cell 使用xib与不使用xib register 方法不同 使用xib做cell...

  • UI-Xib

    Xib的加载 方法1 方法2 自定义控件view的步骤 新建自定义控件类 修改xib中view的类名 封装xib的...

网友评论

  • nenhall:放在加载xib那个方法可以啊
  • csqingyang:可以将重新设置frame 的代码放在 [super initWithFrame] 下面,不用放在 drawReact 下面。滚动之后又改变了 frame 的原因是 tableVIew 的重用机制又重新算了一遍,所以在体统计算完之后,再重新设置 frame 。类似的思想:新浪微博中实现一个全局统一的导航栏按钮,可以拦截系统的 push 方法,重写对应的实现。
    csqingyang:@CoderAO:不会,xib 创建的 cell 会走 initWithCoder ,我没有注意到,不好意思。解决方法:- (void)layoutSubviews {
    [super layoutSubviews];
    // 重新调整内部textLabel的frame
    }
    可能是一个解决方法。
    CoderAO:@csqingyang 用xib创建cell会走initWithFrame:方法么?
  • 小凡凡520:good mark
  • Freedom_fly:怎么用代码修改约束?是不是还得回到xib里面的constraints 手动修改呀?
    慧煎蛋:@CoderAO 666
    Freedom_fly:@CoderAO 啊 原来还可以这样 会了 谢谢
    CoderAO:@Freedom_fly 如果在xib里面已经加了约束后期需要修改,你可以把约束从xib里面拖出来,在代码里面进行修改.
  • 9bfe700d122a:之前好多的 不解 好像 你全遇到了
    60343a0ad510:@不吐葡萄皮z too young.
  • 9bfe700d122a:帮到我了
  • 9bfe700d122a:mark!!!!

本文标题:修改使用xib自定义cell的子控件的frame

本文链接:https://www.haomeiwen.com/subject/kudvqttx.html