更改设备方向时重新绘制自定义uiview

pvl*_*spk 20 core-graphics uiview ios quartz-core

  1. 如果我在里面绘制我的图表- (void)drawRect:(CGRect)rect就足以设置[ _chartView setContentMode:UIViewContentModeRedraw]并且当设备改变它的定向时将调用此方法,并且可以为我的图表计算新的中心点.
  2. 如果我使用子视图创建一个视图- (id)initWithFrame:(CGRect)frame,然后在视图控制器中添加它[self.view addSubview:chartView];.在这种情况下我如何处理轮换以重绘我的图表?

Swi*_*ect 31

运用 setNeedsDisplay

drawRect在创建自定义视图时以编程方式调用应该足够了.它是IB中的单个标志,因此,0行代码首选方式.请参阅堆栈溢出如何在UIView子类上触发drawRect.


运用 layoutSubviews

如果必须触发重绘,请执行此操作UIView,然后再调用UIViewController.
无需收听通知也无需重构代码.

迅速

override func layoutSubviews() {
    super.layoutSubviews()
    self.setNeedsDisplay()
}
Run Code Online (Sandbox Code Playgroud)

Objective-C的

- (void)layoutSubviews {
    [super layoutSubviews];
    [self setNeedsDisplay];
}
Run Code Online (Sandbox Code Playgroud)

注:
setNeedsDisplay是一种drawRect方法,不是一个layoutSubviews方法.


Kee*_*nle 15

要在设备方向更改时正确呈现图表,您需要更新图表的布局,以下是您应添加到视图控制器的代码:

- (void)viewDidLayoutSubviews {
    [super viewDidLayoutSubviews];

    _chartView.frame = self.view.bounds;
    [_chartView strokeChart];
}
Run Code Online (Sandbox Code Playgroud)

  • 我相信自从自动布局出现以来,非常不鼓励在代码中设置框架,检查我的答案 (2认同)

Swi*_*ect 5

零行代码

.redraw

myView.contentMode = .redraw在创建自定义视图时以编程方式调用就足够了。它是IB 中的单个标志,因此,0 行代码首选方式。请参阅堆栈溢出如何在 UIView 子类上触发 drawRect