Дизайн пользовательского интерфейса iPhone для контроллера навигации - кнопки движутся вниз

Я создал приложение на основе контроллера навигации. Представление, которое открывается под панелью навигации, также имеет UIImageView и несколько кнопок «раскрытие деталей» поверх uiimage для целей навигации.

Что я замечаю, так это то, что эти кнопки отклонились от своего конструктора (конструктора интерфейса), когда они появляются в симуляторе.

Я подозреваю, что панель навигации имеет какое-то отношение к этому, но они не перемещаются вниз пропорционально высоте панели навигации.

Я не знаю, как сказать им, чтобы они держались своей позиции.

UIImage не выходит за пределы высоты экрана даже с навигационной панелью вверху.

Есть ли у них какие-либо рекомендации / ошибки, о которых нужно знать при использовании панели навигации вверху?

Я использую xcode 4

Спасибо

Изменить:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{

    StartScreenViewController *controller = 
    [[StartScreenViewController alloc] initWithNibName:@"StartScreenViewController" bundle:nil];
    _navigationController = [[UINavigationController alloc] initWithRootViewController:controller];

    _navigationController.view.frame = CGRectMake(0,0, 320, 460);
    _navigationController.title = @"Test";
    //[self.window addSubview:_navigationController.view];

    self.window.rootViewController = self.navigationController;
    [self.window makeKeyAndVisible];
    return YES;
}

Другое дело, что если я использую метод «addubview», тогда панель навигации усекается, а если я назначаю контроллер навигации для window.rootviewcontroller, тогда я вижу всю панель навигации.

Изменить 2

Вот как выглядит мой AppDelegate.h

@interface TestAppDelegate : NSObject <UIApplicationDelegate> {

    IBOutlet UIView *mainView;
}

@property (nonatomic, retain) IBOutlet UIView *mainView;

@property (nonatomic, retain) IBOutlet UIWindow *window;

//@property (nonatomic, retain) IBOutlet UIViewController *viewController;

@end

Вот метод didFinishLaunchingWithOptions из AppDelegate.m

StartScreenViewController *controller = [[StartScreenViewController alloc] initWithNibName:@"StartScreenViewController" bundle:nil];
    UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:controller];
    navController.title = @"Test";
    navController.view.frame = CGRectMake(0, 0, 320, 460);
    [self.mainView addSubview:navController.view];    
    [self.window makeKeyAndVisible];

MainWindow.xib содержит делегат приложения и окно в качестве объектов. Под окном находится UIView.

В xib-файле StartScreenViewcontroller есть UIImageview и кнопки.


person CF_Maintainer    schedule 16.05.2011    source источник
comment
Что вы использовали на верхней панели навигации по умолчанию или на изображении?   -  person Chirag S    schedule 16.05.2011
comment
панель навигации, обычная, ничего особенного   -  person CF_Maintainer    schedule 16.05.2011
comment
Является ли _navigationController IBOutlet? Если да, измените это. И он не обязательно должен быть глобальным (AFAIK), потому что каждый загруженный в него ViewController может получить к нему доступ с помощью self.navigationController.   -  person SteveB    schedule 17.05.2011
comment
Я попробую. Переменная _navigationController была создана как часть настройки проекта навигации. Я ценю ваше время и помогаю Стиву. Я отчитаюсь.   -  person CF_Maintainer    schedule 17.05.2011
comment
Стив, я пытался, что это не сработало так, как я ожидал. Раньше у меня была панель навигации с заголовком. Как только я удалил объявление IBOutlet, панель навигации стала меньше в два раза без заголовка. У вас есть пример, показывающий простой пример контроллера навигации с изображением как частью представления?   -  person CF_Maintainer    schedule 17.05.2011
comment
Ты прав. Я обновил свой ответ ниже. Если у вас возникнут проблемы, я могу опубликовать тестовый проект на github.   -  person SteveB    schedule 17.05.2011
comment
Стив, еще раз спасибо. Я выполнил описанные вами шаги. Теперь панель навигации отображается полностью, но без заголовка, несмотря на то, что она явно указана в файле appdelegate.m. Также кнопки раскрытия деталей по-прежнему перемещаются вниз.   -  person CF_Maintainer    schedule 17.05.2011
comment
Вы можете установить заголовок в StartScreenViewController в viewDidLoad следующим образом: [self.navigationItem setTitle: @My Title];   -  person SteveB    schedule 17.05.2011
comment
Разница между тем, что вы делаете, и тем, что делаю я, небольшая, но может быть проблемой. Я создал новый проект на основе просмотра. Поэтому StartScreenViewController, например, фактически будет определен в IB. Ниже я сделал еще одно обновление, чтобы показать свой файл AppDelegate.h.   -  person SteveB    schedule 17.05.2011
comment
Если вы создадите новый проект, вы увидите, как они настраивают для вас файл MainWindow.xib с ViewController в качестве объекта в окне документов xib.   -  person SteveB    schedule 17.05.2011
comment
Стив, еще раз спасибо. Я все еще что-то упускаю. Кнопки по-прежнему двигаются вниз. Я загрузил свое приложение на основе представлений на github. Это может помочь нам быстрее понять, что мне не хватает. github.com/klimaye/NavigationControllerTest   -  person CF_Maintainer    schedule 17.05.2011
comment
Я запустил ваш проект, но кнопки не двигаются. На самом деле размер фонового изображения изменяется по вертикали, что может приводить к появлению движущихся кнопок. Я все еще изучаю ...   -  person SteveB    schedule 17.05.2011
comment
Хорошо, изменение размера было связано с вашими свойствами Autosizing в IB. Откройте ViewBasedAppTestViewController.xib. Выберите ImageView для Test2.png. В окне «Атрибуты» выберите «Размер просмотра», а затем «Автоматическое изменение размера». Измените внешние метки так, чтобы они были только верхними и левыми, и удалите все внутренние метки. Я сделал это и запустил его в симуляторе, и теперь он выглядит идентично файлу xib, за исключением, конечно, Nav Controller.   -  person SteveB    schedule 17.05.2011
comment
Стив, спасибо большое. Будучи новичком в мире iphone, я понятия не имел об этом. Я должен был больше поиграть с этими свойствами в ретроспективе. Я просто увидел другое поведение в тот момент, когда добавил панель навигации. Извините за неприятности. Еще раз спасибо!!!!.   -  person CF_Maintainer    schedule 17.05.2011
comment
Итак, почему этого не произошло, когда у меня просто не было панели навигации. Итак, что из этого следует изучить, - это привязать любые просмотры изображений к верхнему левому углу при использовании панели навигации?   -  person CF_Maintainer    schedule 17.05.2011
comment
Вероятно, это потому, что iPhone пытается быть умным и автоматически обрабатывает определенные вещи, такие как перемещение и изменение размера, когда вы добавляете контроллер навигации. К сожалению, это не всегда правильно.   -  person SteveB    schedule 17.05.2011
comment
Я бы не сказал, что такая привязка ImageView должна быть незыблемым правилом. Проблема заключалась в том, что он был прикреплен ко всем 4 сторонам, а затем растягивался также по вертикали и горизонтали. Эти параметры автоматического изменения размера могут быть сложными. После того, как вы их установите, если вы наведете курсор на анимацию справа, вы увидите эффект, который оказывают различные настройки. Также попробуйте повернуть представление в IB с помощью значка в правом верхнем углу окна просмотра, и это покажет вам влияние ваших изменений в реальном сценарии.   -  person SteveB    schedule 17.05.2011


Ответы (1)


Сделайте несколько снимков экрана и посмотрите, как далеко они опускаются. Если его 20 пикселей, то это проблема, с которой сталкивались многие люди (включая меня). Я исправил это, переопределив представление, чтобы оно было того же размера, что и в IB. По какой-то причине iPhone пытается быть умным и помогает вам изменять размер, а иногда делает это неправильно.

UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:viewController];
                navController.view.frame = CGRectMake(0, 0, 320, 460);
[self.window addSubview:navController.view];

Если это не сработает, попробуйте следующий поиск: https://stackoverflow.com/search?q=%5Biphone%5D%2020px.


РЕДАКТИРОВАТЬ:
Я пропустил здесь кусок. Чтобы обойти это, мне пришлось добавить UIView в файл MainWindow.xib ....

1. В вашем AppDelegate.h создайте свойство для IBOutlet UIView * mainView
2. Сделайте для него @property и синтезируйте его в файле .m
3. Откройте MainWindow.xib
4. Перетащите UIView в окно (НЕ ViewController) и поместите его полностью. frame
5. Щелкните правой кнопкой мыши объект AppDelegate в окне документов в IB и подключите свойство mainView к только что добавленному UIView.
6. Теперь в AppDelegate.m ...

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    

    UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:viewController];
    navController.view.frame = CGRectMake(0, 0, 320, 460);

    //[self.window addSubview:navController.view]; // old broken way
    [mainView addSubview:navController.view];
    [self.window makeKeyAndVisible];

    return YES;
}

и AppDelegate.h:

@interface TestNavigationAppAppDelegate : NSObject <UIApplicationDelegate> {
    UIWindow *window;
    TestNavigationAppViewController *viewController;
    IBOutlet UIView *mainView;
}

@property (nonatomic, retain) IBOutlet UIWindow *window;
@property (nonatomic, retain) IBOutlet TestNavigationAppViewController *viewController;
@property (nonatomic, retain) IBOutlet UIView *mainView;
person SteveB    schedule 16.05.2011
comment
Спасибо, попробую. Вы, как правило, начинаете с приложения на основе просмотра и добавляете навигацию вместо того, чтобы начинать с приложения на основе навигации? - person CF_Maintainer; 16.05.2011
comment
Стив, вышеперечисленное не сработало. Любопытно, что изображение в IB имеет размер 320X460 (в xcode 4). Я посмотрю на ссылку, которую вы упомянули, чтобы узнать больше. Спасибо. - person CF_Maintainer; 16.05.2011
comment
Вы можете подтвердить, что кнопки перемещаются на 20 пикселей вниз? Если нет, то это может не быть вашей проблемой. Обычно я начинаю с приложения на основе просмотра и добавляю к нему навигацию. - person SteveB; 16.05.2011
comment
Когда вы попробовали приведенный выше код, я предполагаю, что вы были в своем делегате приложения в applicationDidFinishLaunchingWithOptions? Если бы вы могли обновить свой пост и показать мне, где вы добавляете навигационные материалы, я мог бы помочь вам немного лучше устранить неполадки. - person SteveB; 16.05.2011