Ответ 1
Настройка accessibilityIdentifier
на UIView
делает трюк. Протестировано на Xcode 6.4, iOS 8.4.
Во время разговора с WWDC 2012 ( "Лучшие практики для мастеринга автоматической компоновки" ) ведущий сказал, что вы можете установить идентификатор UIView в Xcode, чтобы помочь в отладке автоматического макета:
Это кажется действительно хорошей идеей, но в Xcode 4.5.1 для моего iOS-проекта нет возможности увидеть, как установить идентификатор UIView.
Как установить идентификатор UIView в Xcode 4.5.1? Если это невозможно в проектах iOS, как я могу получить те же функции?
Настройка accessibilityIdentifier
на UIView
делает трюк. Протестировано на Xcode 6.4, iOS 8.4.
Похоже, идентификатор доступен только в NSView только в Mac OSX. Это не доступно на UIView в iOS.
Найдите плохое ограничение или ограничения.
Чтобы получить ограничения, влияющие на конкретное представление, используйте constraintsAffectingLayoutForOrientation :. Затем вы можете проверить ограничения в отладчике. Они печатаются с использованием визуального обозначения формата. Если ваши представления имеют идентификаторы (см. идентификатор (NSView)), они распечатываются с использованием идентификатора в описании, например:
Как описано здесь:http://developer.apple.com/library/ios/#documentation/UserExperience/Conceptual/AutolayoutPG/Articles/debugging.html
К сожалению, похоже, что это не так. Я пробовал заполнять почти все, и ничего не получилось. Ни восстановление, ни признаки доступности не влияют на это. Если вы посмотрите на скриншот, вы увидите, что на самом деле он устанавливает NSView, который имеет свойство идентификатора.
Настройка в коде, работала для меня:
код:
imageView.accessibilityIdentifier = "profileImageView"
Выход:
<NSLayoutConstraint:0x17028eec0 profileImageView.width == 40 (active, names: profileImageView:0x10fd48110 )>
Не совсем тот ответ, который вы искали, но что полезно делать в этом отладчике примерно так:
expr [(UIButton*)0x12345 setBackgroundColor:[UIColor purpleColor]]
Это помогает идентифицировать представление. Убедитесь, что вы нажмете пробег на отладчике, чтобы увидеть, как он вступает в силу.
Вот вам полезный трюк, который вы можете сделать, чтобы помочь в отладке AutoLayout. Вы можете добавить свое собственное свойство name
к UIView
через категорию и перегрузить его метод description
, чтобы добавить новый name
. Это не совсем дает вам видимое имя в информации об отладке AutoLayout, но позволяет легко po
видеть из своего адреса и видеть его имя.
Затем просто назначьте соответствующие имена в контроллере вида:
- (void)viewDidLoad {
[super viewDidLoad];
self.firstView.name = @"MyViewController.firstView";
self.secondView.name = @"MyViewController.secondView";
}
Теперь, когда вы видите что-то вроде этого:
<NSAutoresizingMaskLayoutConstraint:0x175086220 h=-&- v=-&- UIView:0x147533250.height == UIView:0x14760b4a0.height>
Вы можете просто po
видеть адреса:
po 0x147533250
MyViewController.firstView <UIView: 0x147533250>
po 0x14760b4a0
MyViewController.secondView <UIView: 0x14760b4a0>
Здесь код категории:
UIView + Name.h
#import <UIKit/UIKit.h>
@interface UIView (Name)
@property (strong, nonatomic) NSString *name;
- (NSString *)description;
@end
UIView + Name.m
#import "UIView+Name.h"
#import <objc/runtime.h>
@implementation UIView (Name)
- (NSString *)name {
return objc_getAssociatedObject(self, @selector(name));
}
- (void)setName:(NSString *)name {
objc_setAssociatedObject(self, @selector(name), name, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
- (NSString *)description {
return [NSString stringWithFormat:@"%@ %@", self.name, [super description]];
}
@end
Вместо Identifier
используйте поле идентификатора Storyboard
. То же самое.