iphone: частичный экран UIScrollView - PullRequest
2 голосов
/ 22 февраля 2011

Я давний веб-парень, который довольно плохо знаком с разработкой для iphone.Я нахожу много проблем, с которыми сталкиваюсь, думая о вещах с точки зрения веб-страниц, поэтому вполне возможно, что я просто не задаю правильные вопросы по этому вопросу.Тем не менее, после нескольких часов заливки результатами Google и страницами stackoverflow, время выкинуть этот вопрос в пустоту:

Я пытаюсь настроить представление, в котором есть некоторые статичные / неподвижные элементы вв самом верху (например, заголовок содержимого, показанного ниже), и разрешите прокрутить остальную часть «страницы».

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

По кодам это выглядит примерно так (я добавил комментарии, чтобы показатьмой мыслительный процесс по использованию этого кода):

DetailsWrapper.m:

-(void)viewDidLoad {

    //initialize details view (custom constructor that populates some stuff)
    //ListingDetails is a subclass of UIViewController whose view is set to be a UIScrollView created in IB
    //the viewDidLoad method of ListingDetails sets the contentSize of the scroll view
    ListingDetails *details = [[ListingDetails alloc] initWithNibName:@"ListingDetails" andListingData:theListing];

    //create an empty view that takes up all but the top 45px of the iphone screen
    CGRect scrollArea = CGRectMake(0.0f, 45.0f, 320.0f, 435.0f); 
    UIView *scrollView = [[UIView alloc] initWithFrame:scrollArea];

    //add the UIScrollView to the space we just made
    [scrollView addSubview:details.view];

    //now show it
    [self.view addSubview:scrollView];

    //cleanup
    [scrollView release];
    [details release];
}

Это все работает отлично и денди, и правильно вытягивает содержимое, с незначительной проблемой, что представление прокруткина самом деле не ... прокрутка.Если я пытаюсь добавить представление ListingDetails обычным образом, без использования этой оболочки, прокрутка работает нормально, но что-то, что я делаю (или не делаю?) Выше, заставляет перестать работать функциональность прокрутки.

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

Ответы [ 2 ]

2 голосов
/ 22 февраля 2011

Во-первых, только один UIViewController на экран. Период. Оттуда вам нужно добавить два подпредставления в основной вид UIViewController (тот, который загружен в viewDidLoad). Чтобы выразить это в терминах сети, представьте себе представление контроллера вида как <body></body>.

В конце концов, вы, вероятно, захотите что-то подобное.

- (void)viewDidLoad
{
    [super viewDidLoad];

    UIScrollView *scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0.0, 0.0, 320.0, 45.0)];
    // Further configure your scroll view as you presumably already have in ListingDetails
    [self.view addSubview:scrollView];
    [scrollView release];

    UIView *staticView = [[UIView alloc] initWithFrame:CGRectMake(0.0, 45.0, 320.0, 435.0)];
    [self.view addSubview:staticView];
    [staticView release];
}

Редактировать: Настройка в Интерфейсном Разработчике

По вашему мнению, контроллер .h

@interface SampleViewController : UIViewController
{
    UIScrollView *scrollView;
    UIView *staticView;
}

@property (nonatomic, retain) IBOutlet UIScrollView *scrollView;
@property (nonatomic, retain) IBOutlet UIView *staticView;

@end

и в файле .m

@implementation SampleViewController

@synthesize scrollView;
@synthesize staticView;

- (void)viewDidUnload
{
    [super viewDidUnload];
    self.scrollView = nil;
    self.staticView = nil;
}

- (void)dealloc
{
    [scrollView release], self.scrollView = nil;
    [staticView release], self.staticView = nil;
    [super dealloc];
}

@end

Теперь в файле Interface Builder вы можете щелкнуть правой кнопкой мыши и перетащить из Владельца файла (это ваш подкласс UIViewController) прямо в представления на экране. Когда вы отпустите, появится всплывающее окно, и вы выберете свойство в коде, к которому хотите подключить это представление. Когда это установлено, вы можете ссылаться на эти представления в коде следующим образом.

- (void)viewDidLoad
{
    [super viewDidLoad];

    // Assume we need to make some tweaks once the view has loaded
    self.staticView.backgroundColor = [UIColor redColor];
    self.scrollView.backgroundColor = [UIColor blackColor];
}
0 голосов
/ 22 февраля 2011

Лично я не стал бы беспокоиться об экземпляре scrollView, но делаю

[self.view addSubview:details.view];
details.view.frame = scrollArea;

Но я не думаю, что это твоя проблема. Другая проблема с вашим кодом заключается в том, что ваш контроллер представления ListingDetails освобождается в конце метода, оставляя представление без контроллера.

По сути, вы ошибаетесь. Вам лучше включить весь ваш код ListingDetails в текущий контроллер представления и добавить свой UIScrollView в Interface Builder. Контроллеры нескольких представлений могут быть сложены в UINavigationController или UITabBarController, но кроме этого у вас должен быть только один UIViewController.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...