Ограничение макета для изменения размера изображения по ширине экрана с сохранением соотношения сторон

У меня есть фоновое изображение, которое должно быть такой же ширины, как экран iPhone, но длиннее. Я хочу прокрутить изображение по оси Y.

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

Я создал изображение в Photoshop, используя шаблон 6+ размеров (1242*2208 @ 72ppi) с идеей, что соотношение сторон составляет 16:9 для iPhone 5 и выше, поэтому все, что мне нужно сделать, это установить ограничение, чтобы сохранить соотношение сторон. ratio и другой, чтобы установить ширину, равную ширине прокрутки. Это не имело никакого эффекта, и я не уверен, как действовать дальше.

Это дает мне вид прокрутки, который заполняет экран (правильно!), но внутри него огромное изображение, и мне нужно прокручивать по обеим осям. Я хочу, чтобы изображение изменялось в соответствии с шириной прокрутки/экрана, сохраняя при этом соотношение сторон, поэтому пользователю нужно только прокручивать вверх/вниз.

изменить Я изменил код, чтобы исправить ограничение ширины и добавить режим содержимого для изображения. Это не разрешилось

    self.background = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"newOrderBack_stg1.png"]];
self.scrollView.contentSize = self.background.bounds.size;
[self.scrollView addSubview:self.background];

NSLayoutConstraint *constraint = [NSLayoutConstraint
                                 constraintWithItem:self.background
                                 attribute:NSLayoutAttributeHeight
                                 relatedBy:NSLayoutRelationEqual
                                 toItem:self.background
                                 attribute:NSLayoutAttributeWidth
                                 multiplier:16.0/9.0
                                 constant:0.0f];
[self.background addConstraint:constraint];

NSLayoutConstraint *widthConstraint = [NSLayoutConstraint
                                       constraintWithItem:self.background
                                       attribute:NSLayoutAttributeWidth
                                       relatedBy:NSLayoutRelationEqual
                                       toItem:self.scrollView
                                       attribute:NSLayoutAttributeWidth
                                       multiplier:1
                                       constant:0];
[self.scrollView addConstraint:widthConstraint];

self.background.contentMode = UIViewContentModeScaleAspectFill;

Тоже не сработало


person clicky    schedule 26.04.2015    source источник
comment
Я изменил размер кадра изображения, что несколько помогло, поскольку оно значительно уменьшило ширину, но недостаточно, однако теперь изображение начинается намного ниже в представлении прокрутки, чем раньше (когда оно начиналось вверху).   -  person clicky    schedule 26.04.2015


Ответы (1)


настройте свой прокрутку (без изображения в нем) в раскадровке и установите его делегата на ваш контроллер просмотра. затем реализуйте свой контроллер просмотра следующим образом:

@interface ViewController () <UIScrollViewDelegate>

@property (weak, nonatomic) IBOutlet UIScrollView *scrollView;
@property (strong, nonatomic) UIImageView *imageView;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    self.imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"example_image"]];
    self.imageView.translatesAutoresizingMaskIntoConstraints = NO;

    [self.scrollView addSubview:self.imageView];
    [self.scrollView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[imageView]|" options:0 metrics:nil views:@{@"imageView": self.imageView}]];
    [self.scrollView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[imageView]|" options:0 metrics:nil views:@{@"imageView": self.imageView}]];
}

- (void)viewDidLayoutSubviews {
    CGFloat zoomScale = CGRectGetWidth(self.scrollView.frame) / self.imageView.image.size.width;

    self.scrollView.minimumZoomScale = zoomScale;
    self.scrollView.maximumZoomScale = zoomScale;
    self.scrollView.zoomScale = zoomScale;
}

- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView {
    return self.imageView;
}

@end

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

person André Slotta    schedule 26.04.2015