हालांकि मैं प्रिंसिपल कि अपनी खुद की पॉपओवर रोल करने के लिए है इस संभाल करने के लिए उचित तरीके से सहमति व्यक्त करते हैं, इस मामले में यह एक गैर मुद्दा है ओएस के नए संस्करण। क्या मैं वास्तव में एक ओएस का समर्थन करने के लिए अपने स्वयं के पॉपओवर कार्यान्वयन को बनाना और बनाए रखना चाहता हूं जो अंततः अप्रासंगिक होगा? यदि आप वास्तव में चाहते हैं, तो वेब पर कुछ मुक्त मुक्त स्रोत कार्यान्वयन पर विचार करें।
व्यक्तिगत रूप से मैंने यहां सुझाए गए तरीकों की जांच की और शुरुआती बिंदु (धन्यवाद!) के रूप में इस पृष्ठ का उपयोग करके स्वयं के साथ आया। यह दोनों परिदृश्यों के लिए काम करता है (नेविगेशन बार के साथ या बिना) और मेरी राय में थोड़ा सा सुरक्षित है।
UIPopoverController में कोई विधि जोड़ने के बजाय, मैंने ABSOLUTE के बजाय एक विश्वसनीय मार्ग का उपयोग करके अपमानजनक विचारों को देखने के लिए अपने UIPopoverBackgroundView में एक दिनचर्या जोड़ा। संक्षेप में, चूंकि कोड UIPopoverBackgroundView (स्वयं) का सीधा संदर्भ है, इसलिए यह नेविगेट (पर्यवेक्षण) और फिर नीचे (सबव्यू) को नेविगेट कर सकता है।
दृश्य पेड़ दोनों स्थितियों में इस तरह दिखेगा:
UINavigationBar साथ :
UINavigationBar के बिना:
दो बार देखा गया है कि हम में रुचि रखते हैं कर रहे हैं UILayoutView और UIImage विचार जो प्रत्येक ग्राफ में बोल्ड और रेखांकित हैं। हम नीचे दिए गए कोड का उपयोग करके UIPopoverBackgroundView से शुरू होने वाले इनका संदर्भ प्राप्त कर सकते हैं (एआरसी मानते हैं)। मैं इसे अपने UIPopoverBackgroundView कार्यान्वयन में layoutSubviews
से निष्पादित करता हूं।
// 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];
मैं कोड संक्षिप्त रखने के लिए सबव्यूज़ के ट्रैवर्सल करने के लिए यहां एक ब्लॉक का उपयोग करता हूं। यह एक प्रारंभिक बिंदु और कक्षा के नामों की एक सरणी के रूप में एक दृश्य लेता है। कक्षा नामों की सरणी दृश्य कक्षाओं का अनुक्रम है जो मुझे उम्मीद है कि इंडेक्स 0 इंडेक्स 1 का मूल है और इंडेक्स 1 इंडेक्स 2 का मूल है, आदि। यह सरणी में अंतिम आइटम द्वारा दर्शाए गए दृश्य को देता है।
स्रोत
2013-02-25 13:31:03
आईओएस 6 के लिए कजाम का जवाब देखें, स्वीकार्य उत्तर होना चाहिए। –