UIView загружен с проблемой авторазмера Nib - PullRequest
4 голосов
/ 20 июля 2011

У меня есть подкласс UIView -

@interface DatePickerPopup : UIView
    UIToolbar *toolbar;
    UIDatePicker *datePicker;
@end

@implementation

- (id)initWithFrame:(CGRect)frame
{
    NSArray *xib = 
        [[NSBundle mainBundle] 
            loadNibNamed:@"DatePickerPopup" 
                  owner:self 
                options:nil];
    self = [xib objectAtIndex:0];
    if (self) {

    }
    return self;
}
@end

и перо выглядит как -
nib ib autoresizing

В моем UIViewController, содержащем DatePickerPopup (datePopup):

- (void)viewDidLoad
{
    datePopup = [[DatePickerPopup alloc] initWithRect:CGRectZero];
    CGRect newFrame = datePopup.frame;
    newFrame.y = 200.0f; //lets say this aligns it to the bottom in portrait
    datePopup.frame = newFrame;

    // Normally happens when accessory button pressed but for brevity...
    [self.view.superview addSubview:datePopup];
}

- (void)willAnimateRotationToInterfaceOrientation:
    (UIInterfaceOrientation)toInterfaceOrientation 
    duration:(NSTimeInterval)duration
{
    CGRect screen = [[UIScreen mainScreen] bounds];
    if (toInterfaceOrientation == UIInterfaceOrientationPortrait || 
        toInterfaceOrientation == UIInterfaceOrientationPortraitUpsideDown)
    {
        self.datePopup.frame = 
            CGRectMake(0.0f, newHeightPortrait, screen.size.width, 260.0f);
    }
    else
    {
        self.datePopup.frame = 
            CGRectMake(0.0f, newHeightLandscape, screen.size.width, 260.0f);
    }
}

Однако по какой-то причине это растягивается, когда меняется ориентация, а растягивается представление до высоты границ экрана - панель навигации ...

после viewDidLoad
after viewDidLoad

после willAutorotate ...
after willAutorotate...

Ответы [ 2 ]

2 голосов
/ 20 июля 2011

Поскольку ваш контроллер представления, по-видимому, управляется контроллером навигации, вызов [self.view.superview addSubview:datePopup]; добавляет ваше всплывающее окно как подпредставление UIViewControllerWrapperView, которое является одним из частных классов, используемых UIKit для реализации функциональности UINavigationController.Возиться с частной иерархией представления UIKit всегда рискованно.В этом случае, исходя из поведения, которое вы видите, кажется, что UIKit ожидает, что любое подпредставление UIViewControllerWrapperView будет представлением контроллера представления, поэтому оно соответствующим образом изменяет размер вашего всплывающего окна.

Я думаю, что самый безопасный способЧтобы решить эту проблему, нужно, чтобы представление вашего контроллера представления было оболочкой, содержащей ваш tableView и, при необходимости, ваше всплывающее представление.К сожалению, использование представления-оболочки означает, что контроллер представления не может быть UITableViewController.Вам придется изменить суперкласс на UIViewController, установить пользовательское свойство tableView и вручную принять протоколы UITableViewDataSource и UITableViewDelegate.

Примечание: у вас может возникнуть желание добавить свой поповеркак подпредставление вашего окна, но я не рекомендую этого, потому что UIWindow только автоматически поворачивает свое самое верхнее подпредставление, соответствующее контроллеру представления.Это означает, что если вы добавите всплывающее окно в окно, оно не будет автоматически поворачиваться.


РЕДАКТИРОВАТЬ: Кстати, переназначая self = [xib objectAtIndex:0]; в initWithFrame:, вы вытекаете объект, который был первоначальноalloc'd.Если вы собираетесь переназначить себя таким образом, сначала вы должны освободить существующий объект.

0 голосов
/ 20 июля 2011

Добавьте метод

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 

в классе viewController и верните YES.Если этот метод возвращает YES, только тогда устройство будет поддерживать альбомную ориентацию.Попробуйте этот дополнительный код и посмотрите, поможет ли он ... Вы можете установить размер фрейма для ландшафта в этом методе вместо текущего метода.PS: я только что видел, что вы использовали UIView вместо контроллера ... вы можете перейти на контроллер.

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