UIViewContentModeScaleAspectFill không cắt


144

Tôi đang cố gắng vẽ một số hình ảnh thu nhỏ ở kích thước cố định (100x100) bằng cách sử dụng UIImageView. Tôi đã thiết lập kích thước khung xem hình ảnh của tôi là 100x100, và thiết lập contentModeđể UIViewContentModeScaleAspectFill.

Tôi hiểu rằng điều này sẽ khiến hình ảnh được vẽ ở kích thước tôi đặt và hình ảnh sẽ lấp đầy khu vực của hình ảnh và cắt bất kỳ phần nào của hình ảnh nằm ngoài kích thước tôi đặt cho chế độ xem hình ảnh. Tuy nhiên, hình ảnh vẫn được vẽ lớn hơn hoặc nhỏ hơn kích thước 100x100 mà tôi đặt cho nó.

Nếu tôi đặt contentModeđể UIviewContentModeScaleToFill, sau đó hình ảnh được vẽ tại chính xác 100x100, nhưng nó bị bóp méo để phù hợp với những kích thước. Bất kỳ ý tưởng tại sao điền vào khía cạnh không cắt như mong đợi?

Đây là mã của tôi:

_photoView = [[UIImageView alloc] initWithImage:photoImage];
_photoView.contentMode = UIViewContentModeScaleAspectFill;
[self addSubview:_photoView];

CGRect photoFrame = _photoView.frame;
photoFrame.size = CGSizeMake(100, 100);
_photoView.frame = photoFrame;

Để minh họa rõ hơn, đây là một ảnh chụp màn hình những gì tôi đang thấy. Các hình vuông màu xanh lá cây UIViewchứa cái UIImageViewtôi đang làm việc. Tôi đã đặt màu nền của chúng thành màu xanh lá cây và khung hình của chế độ xem thành 100x100. Như một thử nghiệm, UIImageViewskích thước đến 50x50. Như bạn có thể thấy, khi sử dụng ...AspectFill, hình ảnh không có kích thước tới 50x50 và trong một số trường hợp được bù từ nơi tôi muốn. Khi sử dụng ...ScaleToFill, chúng có kích thước chính xác, nhưng hình ảnh bị biến dạng.

Ảnh chụp màn hình minh họa vấn đề

Câu trả lời:


352

Bạn có thể thử cài đặt clip thành giới hạn không

[_photoview setClipsToBounds:YES];

Hoặc trực tiếp trong Storyboard / Xib của bạn nếu bạn có thể:

nhập mô tả hình ảnh ở đây


10
Đó là nó - cảm ơn. (Tôi đã thêm ảnh chụp màn hình ở trên để hiển thị tốt hơn những gì tôi đang thấy, ví dụ như nếu có ai khác gặp phải vấn đề này.)
Josh Buhler

3
Trong InterfaceBuilder, đã đổi tên (không hữu ích) thành "Clip phỏng vấn" (NB: trong trường hợp này, nó không đóng "các cuộc phỏng vấn", tên này bị sai: nó quay clip TỰ TIN VÀ các cuộc phỏng vấn)
Adam

3
Tùy chọn 'Clip Subview' trong tệp NIB cũng thực hiện tương tự. Chúc mừng.
tiền mã hóa

Nhưng còn nếu bạn muốn thêm bóng bằng thuộc tính CALayer :( thêm một chế độ xem khác đằng sau nó thì không lý tưởng đối với tôi
Rambatino

Nếu bạn đang sử dụng Bố cục tự động như tôi, có một nguyên nhân có thể khác, đó là NSLayoutConstraint "UIView-Encapsulation-Layout-height" phá vỡ các ràng buộc kích thước UIImageView.
ewiinnnnn

8

Nếu bạn muốn mở rộng kiến ​​thức của mình, có một bài viết thực sự hay về cách xếp chồng UIView của iOS . Ngoài ra còn có một bài viết sâu hơn về toàn bộ đường ống vẽ .

Tóm tắt:

  1. Rasterisation - Tất cả nội dung của chế độ xem được rasterized (được vẽ hoặc bộ đệm pixel ngoài màn hình) trong không gian tọa độ của giới hạn của Chế độ xem. Đây có thể là dữ liệu hình ảnh hoặc bản vẽ tùy chỉnh (nghĩa là drawRect:) nhưng nội dung xem. Rasterisation này có tính đến tài contentModesản.

    Bất cứ điều gì bên ngoài giới hạn của một khung nhìn đều bị loại bỏ.

  2. Thành phần - Các kết quả được tổng hợp (được vẽ chồng lên nhau) từ chế độ xem phụ đến giám sát. Điều này sử dụng thuộc tính khung của khung nhìn phụ.

    Nếu clipsToBoundstài sản là YEStrên SuperView sau đó nó sẽ loại bỏ subview bên ngoài nội dung giới hạn của nó.


2

có cùng một vấn đề và nó đã được giải quyết bằng cách đánh dấu vào "Clip Subview".

Hình ảnh được hiển thị đúng cho tất cả các chế độ xem (3,5,4,4,7,5,5, ipad) trong bản xem trước bảng phân cảnh nhưng không có trong trình giả lập.

Sau khi tôi đánh dấu vào "Clip Subview", vấn đề đã được giải quyết. :)


1

Kiểm tra "Clip phỏng vấn" trực tiếp trong Storyboard / Xib cũng có hiệu quả đối với tôi. nhập mô tả hình ảnh ở đây


0

Các cuộc phỏng vấn của tôi đã thay đổi kích thước và tôi nhận ra đó là do xib có bộ bố cục tự động: nhập mô tả hình ảnh ở đây


0

Nếu mọi thứ thất bại,

thực hiện các clip để giới hạn trong Phương thức viewDidLayoutSubview.

Thí dụ :

  override func viewDidLayoutSubviews() {

    imageProfile.layer.cornerRadius = imageProfile.bounds.size.width/2
    imageProfile.clipsToBounds = true
    imageProfile.layer.masksToBounds = true
 }
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.