Tôi có một giải pháp khác hoạt động tuyệt vời.
Một mặt, cách tiếp cận và giải pháp của Ortwin chỉ hoạt động với iOS 6.0 trở lên, nhưng không hoạt động chính xác trên iOS 5.0, 5.1 và 5.1.1, mặt khác có điều gì đó mà tôi không thích và không thể hiểu được với cách tiếp cận của Ortwin, đó là việc sử dụng phương thức [webView sizeThatFits:CGSizeZero]
với tham số CGSizeZero
: Nếu bạn đọc tài liệu Chính thức của Apple về phương thức này và tham số của nó, nó sẽ nói rõ ràng:
Việc triển khai mặc định của phương thức này trả về phần kích thước của hình chữ nhật giới hạn của khung nhìn. Các lớp con có thể ghi đè phương thức này để trả về giá trị tùy chỉnh dựa trên bố cục mong muốn của bất kỳ lượt xem con nào. Ví dụ: một đối tượng UISwitch trả về giá trị kích thước cố định đại diện cho kích thước chuẩn của chế độ xem chuyển đổi và đối tượng UIImageView trả về kích thước của hình ảnh mà nó hiện đang hiển thị.
Ý của tôi là giống như anh ấy đã xem qua giải pháp của mình mà không có bất kỳ logic nào, bởi vì đọc tài liệu, tham số được truyền đến [webView sizeThatFits: ...]
ít nhất phải có mong muốn width
. Với giải pháp của mình, chiều rộng mong muốn được đặt thành webView
khung của trước khi gọi sizeThatFits
với một CGSizeZero
tham số. Vì vậy, tôi duy trì giải pháp này đang hoạt động trên iOS 6 một cách "tình cờ".
Tôi đã tưởng tượng ra một cách tiếp cận hợp lý hơn, có lợi thế là hoạt động cho iOS 5.0 trở lên ... Và cả trong các tình huống phức tạp khi có nhiều hơn một webView (Với thuộc tính của nó webView.scrollView.scrollEnabled = NO
được nhúng trong a scrollView
.
Đây là mã của tôi để buộc Bố cục của webView
theo mong muốn width
và lấy lại bộ tương ứng height
về webView
chính nó:
Ob-C
- (void)webViewDidFinishLoad:(UIWebView *)aWebView
{
aWebView.scrollView.scrollEnabled = NO; // Property available in iOS 5.0 and later
CGRect frame = aWebView.frame;
frame.size.width = 200; // Your desired width here.
frame.size.height = 1; // Set the height to a small one.
aWebView.frame = frame; // Set webView's Frame, forcing the Layout of its embedded scrollView with current Frame's constraints (Width set above).
frame.size.height = aWebView.scrollView.contentSize.height; // Get the corresponding height from the webView's embedded scrollView.
aWebView.frame = frame; // Set the scrollView contentHeight back to the frame itself.
}
Swift 4.x
func webViewDidFinishLoad(_ aWebView: UIWebView) {
aWebView.scrollView.isScrollEnabled = false
var frame = aWebView.frame
frame.size.width = 200
frame.size.height = 1
aWebView.frame = frame
frame.size.height = aWebView.scrollView.contentSize.height
aWebView.frame = frame;
}
Lưu ý rằng trong ví dụ của tôi, cái webView
được nhúng trong một tùy chỉnh scrollView
có cái khác webViews
... Tất cả những cái này webViews
đều có cái khác webView.scrollView.scrollEnabled = NO
, và đoạn mã cuối cùng tôi phải thêm là tính toán height
giá contentSize
trị của scrollView
việc nhúng tùy chỉnh của tôi webViews
, nhưng nó rất dễ dàng như tổng hợp của tôi webView
's frame.size.height
tính toán với các trick mô tả ở trên ...