iPhone UI дизайн за контролер за навигация - бутони, движещи се надолу

Създадох приложение, базирано на навигационен контролер. Изгледът, който се отваря под лентата за навигация, има UIImageView и куп бутони за „разкриване на детайли“ в горната част на te 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;
}

Друго нещо е, че ако използвам метода „addsubview“, тогава навигационната лента се съкращава, докато ако присвоя навигационния контролер на 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
Стив, благодаря отново. Направих стъпките, които сте очертали. Сега Navbar се показва напълно, но без заглавие, въпреки изричното му задаване в appdelegate.m. Също така бутоните за разкриване на детайли все още се движат надолу.   -  person CF_Maintainer    schedule 17.05.2011
comment
Можете да зададете заглавието в StartScreenViewController във viewDidLoad по следния начин: [self.navigationItem setTitle:@My Title];   -  person SteveB    schedule 17.05.2011
comment
Разликата между това, което правите вие ​​и това, което правя аз, е малка, но може да е проблемът. Създадох нов проект, базиран на View. Следователно StartScreenViewController, например, всъщност ще бъде дефиниран в IB. Направих още една актуализация по-долу, за да покажа моя файл AppDelegate.h.   -  person SteveB    schedule 17.05.2011
comment
Ако създадете нов проект, ще видите как те настройват файла MainWindow.xib за вас с ViewController като обект в прозореца Documents на 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
Добре, преоразмеряването се дължи на вашите свойства за автоматично оразмеряване в 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
Не бих казал, че закрепването на ImageViews като това трябва да бъде непоколебимо правило. Проблемът беше, че трябваше да го закрепите към всичките 4 страни и след това да го разтегнете също вертикално и хоризонтално. Тези опции за автоматично оразмеряване могат да бъдат трудни. След като ги зададете, ако задържите курсора на мишката върху анимацията вдясно, можете да видите ефекта, който имат различните настройки. Опитайте също така да завъртите изгледа в IB с иконата в горния десен ъгъл на прозореца на изгледа и това ще ви покаже ефектите от вашите промени в сценарий от реалния свят.   -  person SteveB    schedule 17.05.2011


Отговори (1)


Направете няколко екранни снимки и вижте колко далеч се преместват надолу. Ако е 20px, това е проблем, който са имали много хора (включително и аз). Поправих го, като предефинирах изгледа да бъде със същия размер като в 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) и го направете да пасне на пълния рамка
5. Щракнете с десния бутон върху обекта AppDelegate в прозореца Documents в 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
Благодаря, ще пробвам това. Като правило започвате ли с приложение, базирано на View и добавяте навигация, вместо да започнете с приложение, базирано на навигация? - 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
Когато опитахте кода по-горе, предполагам, че сте били във вашия App Delegate в applicationDidFinishLaunchingWithOptions? Ако можете да актуализирате публикацията си и да ми покажете къде добавяте навигационните неща, бих могъл да ви помогна да отстраните малко по-добре проблемите. - person SteveB; 16.05.2011