2013-05-18 4 views
5

У меня есть 2 пользовательских UIViews, которые я добавляю в свой UIViewController, а затем выравнивая их с помощью NSLayoutConstraint. После того, как я применил NSLayoutConstraint в представлении UIViewController, UIButtons в пользовательских UIViews больше не получает события касания.UIButton в subview не получает прикосновения после NSLayoutConstraint

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    navigationBar = [[DtNavigationBar alloc] initWithFrame:CGRectMake(0,0,320,45)]; 
    [navigationBar setTranslatesAutoresizingMaskIntoConstraints:NO]; 
    [self.view addSubview:navigationBar]; 

    switchBar = [[DtSwitch alloc] initWithFrame:CGRectMake(0,0,320,44)]; 
    [switchBar setTranslatesAutoresizingMaskIntoConstraints:NO]; 
    [self.view addSubview:switchBar]; 

    [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-0-[navigationBar(45)]-0-[switchBar(44)]-(>=100)-|" 
                     options:NSLayoutFormatAlignAllLeft metrics:nil 
                     views:NSDictionaryOfVariableBindings(switchBar, navigationBar)]]; 
} 

Оба DtNavigationBar и DtSwitch имеют вид UIButton, что до сих пор показывают в нужном месте, но больше не реагирует на прикосновения.

Если я удалю часть addConstraints (и вручную разместите виды), то кнопки будут работать нормально.

ответ

14

Проблема в том, что, избрав ограничения использования, вы не используете достаточно ограничений. У вас двусмысленный макет.

Чтобы проверить эту гипотезу, запустить приложение, и паузу в отладчике и ввести это в консоли lldb:

po [[UIWindow keyWindow] _autolayoutTrace] 

Слово неоднозначного РАСПОЛ появится где-то в ответ.

Для того, чтобы эти слова ушли, вам необходимы ограничения. Вы должны полностью определить вертикальное и горизонтальное положение и ширина и высота всего в истории.

+0

wow thanks Я никогда бы не подумал об этом – dowi