【发布时间】:2016-08-20 03:02:18
【问题描述】:
我正在使用drawRect: 来绘制形状。当方向改变时,我必须调用这个方法并重新绘制形状,所以我想是否有办法在调用layoutSubviews() 时自动调用drawRect:。
谢谢。
【问题讨论】:
标签: ios uiview drawrect layoutsubviews
我正在使用drawRect: 来绘制形状。当方向改变时,我必须调用这个方法并重新绘制形状,所以我想是否有办法在调用layoutSubviews() 时自动调用drawRect:。
谢谢。
【问题讨论】:
标签: ios uiview drawrect layoutsubviews
您可以将视图的contentMode 设置为.redraw。
这将在视图的边界发生变化时调用setNeedsDisplay(因此是drawRect),因此也会在旋转时调用(前提是您已设置autoresizingMask,以便视图的边界在旋转时发生变化)。
【讨论】:
init: 中设置contentMode 它不起作用,我应该用其他方法设置它吗?
init 是否被调用(设置断点)?大多数时候,在UIView 子类中,您应该覆盖initWithFrame: 而不是init——因为init 的UIView 实现只调用initWithFrame:CGRectZero。还要检查您的autoresizingMask 以确保它在旋转时更改视图的边界(宽度或高度)。不,您应该在初始化程序中设置contentMode,因为它是一个恒定的一次性设置。
来自 UIView 类参考https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIView_Class/#//apple_ref/occ/instm/UIView/drawRect:
第一次显示视图或发生事件时调用此方法 发生使视图的可见部分无效。你不应该 自己直接调用这个方法。要使您的部分视图无效, 并因此导致该部分被重绘,调用 setNeedsDisplay 或 setNeedsDisplayInRect: 方法代替。
就是这样。只需在适当的视图上调用setNeedsDisplay。
【讨论】:
drawRect: 调用 setNeedsDisplay 时,我收到了这个警告 _BSMachError: (os/kern) invalid capability (20) 和 _BSMachError: (os /kern) 无效名称 (15)
drawRect: 被调用,这显然会导致无限循环。我以为你想通过layoutSubviews 给它打电话?
layoutSubviews() 我的错,错别字!
layoutSubviews 拨打setNeedsDisplay 吗?在这种情况下,我遇到了与上述相同的错误。
在 viewDidLoad() 函数中放入:
NSNotificationCenter.defaultCenter().addObserver(self, selector: "rotated", name: UIDeviceOrientationDidChangeNotification, object: nil)
然后添加以下函数:
func rotated()
{
if(UIDeviceOrientationIsLandscape(UIDevice.currentDevice().orientation))
{
print("landscape")
// Your drawRect function here
}
if(UIDeviceOrientationIsPortrait(UIDevice.currentDevice().orientation))
{
print("Portrait")
// Your drawRect function here
}
}
【讨论】: