【问题标题】:How to invoke drawRect: when layoutSubviews invokes in ios如何调用drawRect:ios中layoutSubviews调用时
【发布时间】:2016-08-20 03:02:18
【问题描述】:

我正在使用drawRect: 来绘制形状。当方向改变时,我必须调用这个方法并重新绘制形状,所以我想是否有办法在调用layoutSubviews() 时自动调用drawRect:

谢谢。

【问题讨论】:

    标签: ios uiview drawrect layoutsubviews


    【解决方案1】:

    您可以将视图的contentMode 设置为.redraw

    这将在视图的边界发生变化时调用setNeedsDisplay(因此是drawRect),因此也会在旋转时调用(前提是您已设置autoresizingMask,以便视图的边界在旋转时发生变化)。

    【讨论】:

    • 如果我在init: 中设置contentMode 它不起作用,我应该用其他方法设置它吗?
    • @SunilRao 您的init 是否被调用(设置断点)?大多数时候,在UIView 子类中,您应该覆盖initWithFrame: 而不是init——因为initUIView 实现只调用initWithFrame:CGRectZero。还要检查您的autoresizingMask 以确保它在旋转时更改视图的边界(宽度或高度)。不,您应该在初始化程序中设置contentMode,因为它是一个恒定的一次性设置。
    【解决方案2】:

    来自 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 吗?在这种情况下,我遇到了与上述相同的错误。
    【解决方案3】:

    在 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
    
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 2010-10-18
      • 1970-01-01
      • 1970-01-01
      • 2011-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多