Выровняйте UIImageView по нижней части UIScrollView

Я хочу выровнять красное изображение внизу прокрутки. В портретной ориентации это выглядит нормально, так как высота прокрутки равна высоте просмотра.

Портретная ориентация

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

Горизонтальная ориентация

Я добавил красное изображение в качестве подвида прокрутки и применил к нему маску нижнего поля с автоматическим изменением размера.


person hariszaman    schedule 07.12.2014    source источник
comment
установить автоматический макет/автоматическое изменение размера.   -  person Vineesh TP    schedule 08.12.2014
comment
Я уже использую нижнее поле autoreszingmask   -  person hariszaman    schedule 08.12.2014
comment
не только нижнее поле, ему нужна гибкая ширина, высота, левая и правая маски   -  person Vineesh TP    schedule 09.12.2014
comment
это не работает, поэтому я разместил этот вопрос   -  person hariszaman    schedule 10.12.2014
comment
@hariszaman, если вы используете автомакет, проблема будет решена легко, в противном случае вам придется явно установить рамку, чтобы отобразить вид в нужном месте.   -  person Adeel Ur Rehman    schedule 11.12.2014
comment
Вы пытались использовать чисто автомакет? Таким образом, вы добавляете изображение, а затем помечаете изображение в нижней части прокрутки и делаете изображение внутри прокрутки. Есть ли конкретная причина, по которой вы не использовали автозапуск? если вы дадите больше информации, я смогу опубликовать более полезный ответ!   -  person Nour1991    schedule 16.12.2014


Ответы (6)


Если вы используете autoresizing, вам нужно установить маски left, right, bottom и flexibleWidth на UIImageView и UIScrollView. Взгляните на изображения, прикрепленные здесь.

Если ваш UIScrollView закрывает весь экран, то установите все маски изменения размера для it, а для UIImageView установите только указанные выше.

Надеюсь, поможет.

введите здесь описание изображениявведите здесь описание изображения

Вывод в симуляторе:

Портрет

Пейзаж

person z22    schedule 17.12.2014

Autoresizingmask не работает при использовании автоматической компоновки. AutoLayout отключит translatesAutoresizingMaskIntoConstraints представлений, декодированных из файла раскадровки. Но вы все равно можете установить его на YES в коде, если хотите. Но я не рекомендую вам этого делать. Придерживайтесь AutoLayout, если хотите, чтобы он был простым и элегантным. Что вам нужно сделать, так это использовать AutoLayout для компоновки изображения.

То, что вы хотите сделать здесь, не может быть сделано только в IB. Представления макета AutoLayout на основе их краев. В вашем случае отношение между представлением изображения и представлением прокрутки отличается в портретной и альбомной ориентации. В портретной ориентации нижний край представления изображения выравнивается с нижним краем представления прокрутки. Но в альбомной ориентации верхний край представления изображения выравнивается с нижним краем представления прокрутки. Невозможно использовать только один набор ограничений для достижения цели. Вы можете добавить ограничение для просмотра изображения в IB, которое выравнивает нижний край изображения с нижним краем прокрутки, как первое изображение в вашем вопросе. Затем IBOutlet добавьте это ограничение к вашему контроллеру представления. Когда ориентация устройства изменилась, вы можете просто изменить константу ограничения. Это что-то вроде этого:

@interface ViewController ()

@property (nonatomic, weak) UIImageView *imageView; // the image view
@property (nonatomic, weak) NSLayoutConstraint *imageBottomToScrollView; // the constraint you added in IB to the image view

@end

@implementation ViewController


- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation {
    UIDeviceOrientation orientation = [UIDevice currentDevice].orientation;
    if (UIDeviceOrientationIsLandscape(orientation)) {
        self.imageBottomToScrollView.constant = -CGRectGetHeight(self.imageView.frame);
    } else if (UIDeviceOrientationIsPortrait(orientation)) {
        self.imageBottomToScrollView.constant = 0;
    }
}


@end

Это очень просто~

person wcd    schedule 15.12.2014
comment
спасибо за ваш ответ, я уже сделал это с помощью кодирования, но, как указано, я ищу только решение для построителя интерфейса - person hariszaman; 15.12.2014
comment
@hariszaman, это просто невозможно сделать только в IB. Некоторые задачи макета должны быть выполнены в коде. - person wcd; 15.12.2014

Просто добавьте этот метод в свой контроллер представления.

-(void)viewWillLayoutSubviews
{
    [super viewWillLayoutSubviews];
    CGSize contentSize = self.scrollView.contentSize;
    CGRect frame = self.imageView.frame;
    frame.origin.x = 0;
    frame.size.width = self.scrollView.frame.size.width;
    frame.size.height = Expected_Height;
    frame.origin.y = contentSize.height - frame.size.height;
    self.imageView.frame = frame;
}
person sahara108    schedule 11.12.2014
comment
Почему? Спрашивающий использует autoresizingmask, так что это единственный способ сделать это. - person sahara108; 11.12.2014
comment
Я просто процитировал заметку. - person kas-kad; 11.12.2014
comment
Ах, извините, я этого не замечаю. - person sahara108; 11.12.2014

Autoresizingmask не будет работать с автоматическим макетом, в вашем IB добавьте ограничение верхнего пространства на изображение, оно покажет ваше изображение в конце прокрутки.

person sajjeel    schedule 15.12.2014

Вы не можете решить «проблему», используя только IB, потому что вам нужно изменить размер содержимого прокрутки относительно ориентации. Если вы хотите, чтобы ваше изображение перекрывалось панелью вкладок, вам нужно вручную установить размер содержимого для вашего прокрутки, равный screen_height + abs(tabbar_height - imageview_height).

person kas-kad    schedule 11.12.2014

Вы должны прикрепить uiimageview к нижней части прокрутки, и он будет учитывать размер содержимого. надеюсь, это поможет

введите здесь описание изображения

person vibrazy    schedule 15.12.2014