Mặc dù tôi đồng ý về nguyên tắc rằng cách thích hợp để xử lý này là để cuộn Popover của riêng bạn, trong trường hợp này đó là một vấn đề không cho các phiên bản mới hơn của hệ điều hành. Tôi có thực sự muốn xây dựng và duy trì triển khai cửa sổ bật lên của riêng mình chỉ để hỗ trợ một hệ điều hành mà cuối cùng sẽ không liên quan? Nếu bạn thực sự muốn, hãy xem xét một số triển khai mã nguồn mở miễn phí trên web.
Cá nhân tôi đã nghiên cứu các phương pháp được đề xuất ở đây và đã tự mình sử dụng trang này làm điểm bắt đầu (cảm ơn!). Nó hoạt động cho cả hai kịch bản (có hoặc không có thanh điều hướng) và an toàn hơn một chút theo ý kiến của tôi.
Thay vì thêm phương thức vào UIPopoverController, tôi đã thêm một thường trình vào UIPopoverBackgroundView của mình để tìm kiếm các khung nhìn vi phạm bằng cách sử dụng một tuyến RELATIVE, chứ không phải là ABSOLUTE. Trong ngắn hạn, kể từ khi mã có một tham chiếu trực tiếp đến UIPopoverBackgroundView (tự), nó có thể điều hướng lên (superview) và sau đó xuống (subviews).
Các cây nhìn giống như thế này trong cả hai kịch bản:
Với UINavigationBar:
Without UINavigationBar:
Hai quan điểm rằng chúng ta quan tâm là Chế độ xem UILayoutView và UIImage được in đậm và gạch chân trong mỗi biểu đồ. Chúng ta có thể tham chiếu đến những thứ này bắt đầu từ UIPopoverBackgroundView bằng cách sử dụng đoạn mã dưới đây (giả sử ARC). Tôi thực hiện điều này từ layoutSubviews
trong triển khai UIPopoverBackgroundView của mình.
// Helper method for traversing child views based solely on class types
UIView* (^__unsafe_unretained __block traverseSubviews)(UIView*, NSArray*) = ^(UIView *root, NSArray* nodeTypes) {
NSString *typeName = [nodeTypes objectAtIndex:0];
for (UIView *subView in root.subviews) {
if ([NSStringFromClass([subView class]) isEqualToString: typeName]) {
if (nodeTypes.count == 1)
return subView;
else
return traverseSubviews(subView, [nodeTypes subarrayWithRange:NSMakeRange(1, nodeTypes.count - 1)]);
}
}
return (UIView*)nil;
};
// Find the subviews of interest, taking into account there could be a navigation bar
UIView *layoutView = traverseSubviews([self superview], @[@"UIView", @"UILayoutContainerView"]);
if (traverseSubviews(layoutView, @[@"UINavigationBar"])) {
layoutView = traverseSubviews(layoutView, @[@"UILayoutContainerView"]);
}
UIView *imageView = traverseSubviews(layoutView, @[@"UIImageView"]);
// Remove the default content appearance
layoutView.layer.cornerRadius = 0;
[imageView removeFromSuperview];
Tôi sử dụng khối ở đây để thực hiện tra cứu các bản phụ để giữ mã ngắn gọn. Nó có một khung nhìn như là một điểm khởi đầu và một mảng các tên lớp. Mảng các tên lớp là chuỗi các lớp khung nhìn mà tôi mong đợi trong đó chỉ mục 0 là phụ huynh của chỉ mục 1 và chỉ mục 1 là phụ huynh của chỉ mục 2, vv. Nó trả về khung nhìn được biểu diễn bởi mục cuối cùng trong mảng.
Nguồn
2013-02-25 13:31:03
Xem câu trả lời của kajham, cho iOS 6 phải là câu trả lời được chấp nhận. –