2016-04-26 7 views
0

Я использую drawRect: для рисования фигур. Мне нужно вызвать этот метод и перерисовать фигуры при изменении ориентации, поэтому я подумал, что если вы вызываете drawRect:, автоматически вызывается layoutSubviews().Как вызвать drawRect: когда layoutSubviews вызывает в ios

спасибо.

ответ

2

Просто установите свойство contentMode на UIViewContentModeRedraw.

Это будет вызывать setNeedsDisplay (и, следовательно, drawRect) всякий раз, когда функции представления оценки изменений, и, следовательно, также может быть вызвана при вращении (при условии, вы настройки вашего autoresizingMask так, что оценки функции представления меняются при повороте).

+0

Если я установил 'contentMode' в' init: 'он не работает, должен ли я установить его каким-либо другим способом? –

+0

@SunilRao Вы вызываете вызов 'init' (устанавливаете точку останова)? Большую часть времени в подклассе 'UIView' вы должны переопределять' initWithFrame: 'вместо' init', поскольку реализация 'init 'в UIView' просто вызывает' initWithFrame: CGRectZero'. Также проверьте свою 'autoresizingMask', чтобы убедиться, что она изменяет границы вида (ширину или высоту) при вращении. И нет, вы должны установить 'contentMode' в инициализаторе, поскольку это постоянная, одноразовая настройка. – Hamish

+0

Я работал отлично. –

2

Из ссылки https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIView_Class/#//apple_ref/occ/instm/UIView/drawRect класса UIView:

This method is called when a view is first displayed or when an event occurs that invalidates a visible part of the view. You should never call this method directly yourself. To invalidate part of your view, and thus cause that portion to be redrawn, call the setNeedsDisplay or setNeedsDisplayInRect: method instead.

Вот так. Просто позвоните setNeedsDisplay в соответствующем окне.

+0

Когда я вызываю 'setNeedsDisplay' из' drawRect: 'Я получаю это предупреждение ** _ BSMachError: (os/kern) недопустимая возможность (20) ** и ** _ BSMachError: (os/kern) неверное имя (15) ** –

+0

Ну, как говорится, это вызывает вызов 'drawRect:', который, очевидно, вызовет бесконечный цикл. Я думал, вы хотите назвать это из 'layoutSubviews'? –

+0

О! да, что если он вызывается из 'layoutSubviews()' my bad, typos! –

0

В 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 

    } 

} 
Смежные вопросы