Android View.GONE दृश्यता मोड के लिए iOS के बराबर


79

मैं iOS के लिए एक ऐप विकसित कर रहा हूं और मैं AutoLayout ON के साथ स्टोरीबोर्ड का उपयोग कर रहा हूं। मेरे एक दृश्य नियंत्रक में 4 बटन का एक सेट है, और कुछ परिस्थितियों में मैं पहले एक को गायब करना चाहूंगा।

यदि मैं setHidden:TRUEविधि का उपयोग करता हूं तो UIButton अदृश्य हो जाता है, लेकिन यह अभी भी स्पष्ट रूप से देखने में जगह लेता है, और परिणाम एक "छेद" है जिसे मैं मुख्य दृश्य के शीर्ष की ओर तैरने के लिए शेष UIButton बनाने में सक्षम नहीं हूं।

एंड्रॉइड में मैंने इसके View.GONEबजाय बस इस्तेमाल किया होगा View.INVISIBLE, लेकिन आईओएस में मैं इस व्यवहार के साथ फंस गया हूं और मैं विश्वास नहीं करना चाहता कि एकमात्र समाधान मैन्युअल रूप से है (हां मेरा मतलब प्रोग्रामेटिक रूप से) शेष तत्वों को शीर्ष पर ले जाना है।

मैंने सोचा था कि मैं इसे हर तरह से स्वचालित बनाने के लिए किसी प्रकार की बाधा को स्थापित करने में सक्षम हो सकता हूं क्योंकि यह एंड्रॉइड में है, लेकिन मेरे पास कोई भाग्य नहीं है।

इससे पहले कि मैं ऑटोलेयूट को बंद करूं, क्या कोई मुझे सही दिशा की ओर इशारा कर सकता है?

मैं आईबी का उपयोग कर रहा हूं, लेकिन मैं प्रोग्रामेटिक सामान के साथ भी सहज हूं।

अपडेट करें:

घटक की ऊँचाई को 0 पर सेट करने से भी मदद नहीं मिलती है।

मैंने कुछ इस तरह की कोशिश की:

UIButton *b;
CGRect frameRect = b.frame;
frameRect.size.height = 0;
b.frame = frameRect;

बटन की ऊंचाई शून्य करने के लिए कैसे सेट करें?
काहुन

मैंने कुछ इस तरह की कोशिश की: UIButton * b; सीजीआरइक्ट फ्रेमवर्क = बी.फ्रेम; फ्रेमरेक्ट.साइज़.हीट = 0; b.frame = फ्रेमआरक्ट; कोई किस्मत नहीं :(
1

मुझे पता है कि यह एक सुपर पुराना सवाल है, लेकिन यदि आप ऑटोलॉययट का उपयोग कर रहे हैं तो आपके अपडेट को फ्रेम में 0 पर सेट करने में मदद नहीं मिलेगी। आपको
wyu

जवाबों:


40

एक बाधा (NSLayoutAttributeHeight) जो मेरे लिए काम करने के लिए दृश्य की ऊंचाई निर्धारित करता है:

[self.view addConstraint:[NSLayoutConstraint constraintWithItem:self.captchaView attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1.0 constant:0]];

11
स्विफ्ट संस्करण:self.view.addConstraint(NSLayoutConstraint(item: self.captchaView, attribute: .Height, relatedBy: .Equal, toItem: nil, attribute: .NotAnAttribute, multiplier: 1.0, constant: 0))
iStar

1
इसका जवाब होना चाहिए था
रिक रॉयड अबन

2
अगर मुझे वांछित दृश्य की वास्तविक ऊंचाई का पता नहीं है (उदाहरण के लिए। कंटेनर दृश्य थोड़ा बाद में प्रदान किया गया है)?
ए। पेट्रोव

बहुत बढ़िया जवाब के लिए धन्यवाद! किसी के लिए इसकी आवश्यकता हो सकती है। मुझे एक त्रुटि मिली Unable to simultaneously satisfy constraints। जबकि मैं पहले से ही देखने के लिए एक बाधा थी। मैं इसे stackoverflow.com/a/38625419/1270901
Nevin Chen

@iStar मैंने एक ही कोड का उपयोग किया है, लेकिन यह काम नहीं करता है ... stackoverflow.com/questions/45454992/…
संजय मंगरोलिया

20

इस प्रश्न पर सभी उत्तर अकुशल हैं। Android setVisibility के समतुल्य तरीके के लिए सबसे अच्छा तरीका: iOS पर चला गया तरीका यह है कि StackViewपहले घटकों का चयन करें उसके बाद संपादक में, स्टैक व्यू में एम्बेड करें,

IBOutlet के साथ नया स्टैक दृश्य कनेक्ट करें, फिर:

छिपा हुआ:

UIView * firstView = self.svViewFontConfigure.arrangedSubviews[0];
        firstView.hidden = YES;

दृश्यता:

UIView * firstView = self.svViewFontConfigure.arrangedSubviews[0];
        firstView.hidden = NO;

स्टैक व्यू का उपयोग करते समय, सभी बाधाओं को रखा जाएगा!

डाक्यूमेंट


वास्तव में एक अच्छा समाधान की तरह लगता है, लेकिन यह ध्यान देने योग्य है कि इसे iOS9 + की आवश्यकता है।
user3533716

मैंने आपके शानदार समाधान का उपयोग किया (+1 आपके लिए, बहुत बहुत धन्यवाद !!), लेकिन मैं सीधे IBOutlet के माध्यम से जुड़ा हुआ हूं, वह दृश्य जिसे मैं दिखाना और छिपाना चाहता था, इसलिए मुझे कोड की सिर्फ एक पंक्ति टाइप करनी है! :)
क्रिस्टीना डी रिटो

1
यह उत्तर वास्तव में सही नहीं है। Android View.GONE UI पर दृश्य निकालता है। उदाहरण के लिए, यदि आप View.GONE को सेट करते हैं, तो नीचे दिए गए दृश्य w शिफ्ट हो जाएंगे। तो आपका सुझाव केवल उस दृश्य को छुपाता है जो View.HIDE के बराबर है। इस उत्तर को देखें: stackoverflow.com/questions/11556607/…
emin deniz

मैंने android api पर खोज नहीं की ... लेकिन मैं मोबाइल डेवलपर हूं, इसलिए मैं मैकेनिक को जानता हूं ... बूलियन फ्लैग व्यू के साथ एंड्रॉइड में देखा जा सकता है या नहीं (गया, दृश्यमान) यदि यह ui से निकालता है तो यह मुश्किल होगा फिर से जोड़ें ... लेकिन आईओएस में, यह लेआउट में, लेकिन बिना रिक्त स्थान के साथ .... इसके अलावा आधिकारिक ios छिपी हुई संपत्ति है जो जगह लेती है ... UIStackview में Android View.Gone
Ucdemir

16

अपने दृष्टिकोण में एक ऊंचाई बाधा जोड़ें:यहाँ छवि विवरण दर्ज करें

उसके बाद अपनी व्यू-कॉन्ट्रोलर फ़ाइल में ऊँचाई की कमी के लिए एक आउटलेट बनाएं:यहाँ छवि विवरण दर्ज करें

और फिर आपके विचार मेंDadLoad विधि में बाधा की ऊँचाई को 0 में बदल दें:

override func viewDidLoad() {
    super.viewDidLoad()
nsLcButtonHeight.constant = 0
}

1
निरंतर ऊंचाई बेकार है, मैं बराबर ऊंचाई और गुणक का उपयोग करता हूं, उदाहरण के लिए माता-पिता के 25% दृश्य, इसके लिए कोई उदाहरण?
user924

8

IOS पर Androids.GONE कार्यक्षमता प्राप्त करने के लिए UIStackView का उपयोग करना है। उसके बाद स्थिति के अनुसार बच्चे को छिपाएं। ( सेब प्रलेखन )

स्विफ्ट 4:

let firstView = cell.rootStackView.arrangedSubviews[0]
    firstView.isHidden = true // first view gone

यह एक टेबल सेल उदाहरण है, बस दोनों इंसाइड करें Stack viewऔर GONEबच्चे के लिए आइटम प्राप्त करें ।

यहाँ छवि विवरण दर्ज करें


6

स्टैक दृश्य के तहत अपने विचारों को समूहित करने के लिए आप क्या कर सकते हैं। फिर जब आप किसी विशेष दृश्य को छिपाते हैं, तो शेष दृश्य स्वचालित रूप से स्थान को भरने के लिए स्थानांतरित हो जाएंगे।

आप स्टैक व्यूज पर Apple डॉक्यूमेंटेशन देखना चाहते हैं: https://developer.apple.com/reference/uikit/istackview

या ऑनलाइन ट्यूटोरियल जैसे: https://www.appcoda.com/stack-views-intro/


1

1) यदि आपके बटन लंबवत रखे गए हैं तो आपको height0 पर सेट होना चाहिए और क्षैतिज रूप से रखे गए बटन के मामले में, width0 पर सेट करने का प्रयास करें या आप दोनों को 0 पर सेट कर सकते हैं।

या

2) आप इस दृष्टिकोण की कोशिश कर सकते हैं जो button2ऊपर सेट करता है button1:

- (void)viewDidLoad
{
[super viewDidLoad];

UIButton *button1 = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[button1 setTitle:@"hello" forState:UIControlStateNormal];

UIButton *button2 = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[button2 setTitle:@"world" forState:UIControlStateNormal];

[button1 sizeToFit]; [button2 sizeToFit];
[button2 setFrame:CGRectMake(button1.frame.origin.x, button1.frame.origin.y, button2.frame.size.width, button2.frame.size.height)];

[self.view addSubview:button1];
[self.view addSubview:button2];

}


1

यह प्रश्न बहुत पुराना है, लेकिन मुझे जो अलमारी मिली है वह अतिरिक्त बाधाओं को स्थापित कर रही है (इसलिए "गए" दृश्य के आसपास के दृश्य जानते हैं कि एक बार लापता होने पर क्या करना है)

A  which you want to be     A
|  after setting B to gone  |
B                           C
|                               
C                               
  1. C से A तक कम प्राथमिकता (750) की बाधा निर्धारित करें।
  2. एक NSLayoutConstraint सरणी में B के ऊपर और नीचे की बाधाओं (या बाएं और दाएं को यदि आप अपना दृश्य क्षैतिज रूप से ढंकना चाहते हैं) जोड़ें bConstraints । इसके द्वारा करें:
    1. नियंत्रण क्लिक करें और कसना से ViewController के लिए खींचें
    2. आउटलेट से आउटलेट संग्रह में कनेक्शन बदलें
    3. नाम के लिए bConstraints
    4. कनेक्ट कनेक्ट करें। यह एक पैदा करेगा@IBOutlet var bConstraints: [NSLayoutConstraint]! आपके ViewController में
    5. अतिरिक्त बाधाओं को जोड़ने के लिए: स्टोरीबोर्ड में बाधा से @IBOutlet चर नाम पर खींचें
  3. फिर बी छिपाओ

    B.hidden = true
    NSLayoutConstraint.deactivateConstraints(bConstraints)
    
  4. अनसुना करना

    B.hidden = false
    NSLayoutConstraint.activateConstraints(bConstraints)
    

स्पष्ट रूप से अधिक से अधिक विचार आपके पास जितने अधिक जटिल हैं यह बढ़ता है, क्योंकि आपको प्रत्येक दृश्य से अतिरिक्त बाधाओं की आवश्यकता होती है


यह अधिक उपयोगी होगा यदि आपने समझाया कि आप क्यों लागू नहीं कर सकते
wu

दूसरा बिंदु। मैं Xamarin में काम कर रहा हूँ, हालांकि। अभी भी इस समस्या का हल नहीं मिला है। पता नहीं कैसे आप बी बाधाओं के साथ एक NSLayoutConstraint सरणी का निर्माण करना चाहिए। मुझे लगता है कि यह प्रोग्रामिक रूप से किया जाता है, उसके लिए कोड देखना अच्छा होगा। आपका तरीका मुझे इस समस्या से निपटने का सबसे उचित तरीका लगता है, हालाँकि इसे सिर्फ छद्म कोड के साथ लागू करना आसान नहीं है
गुस्तावो बायोची कोस्टा

मैंने Xamarin का उपयोग नहीं किया है। जिस तरह से यह XCode में किया गया है, वह है: ctrl-click और कसना से ViewController तक खींचें (यह इसी तरह है कि आप xcode में IBOutlet कैसे बनाते हैं)। पॉपअप दिखाई देने वाले (के समान दिखता में i.stack.imgur.com/JegLK.png ) "कनेक्शन" बदलने से ड्रॉप डाउन मेनू Outletके लिए Outlet Collection। अतिरिक्त बाधाओं के लिए, ctrl सीधे चर नाम पर खींचें। मैं आज (बाद में ~ 8 घंटे में) sceenshots अपलोड कर सकता हूं
wyu

तो NSLayoutConstraint सरणी का आउटलेट संग्रह है, यहाँ थोड़ा खो गया है हाहा, मेरे सवालों के जवाब देने के लिए अपना समय निकालने के लिए धन्यवाद :)
Gustavo Baiocchi Costa

हां, मैं उत्तर को अधिक स्पष्ट होने के लिए अपडेट करूंगा। तो समाधान आपके लिए काम कर रहा है?

0

जैसा कि मेरे शोध ने दिखाया है, यहां तक ​​कि AutoLayout भी आपकी मदद नहीं कर सकता है। आपको वैकल्पिक रूप से दिखाए गए घटक से प्रभावित विचारों को मैन्युअल रूप से प्रतिस्थापित करना होगा (मेरे मामले में, वैकल्पिक दृश्य के निचले भाग के सभी दृश्य, लेकिन मुझे यकीन है कि आप अपने वैकल्पिक बटन के दाईं ओर सभी बटन को संभालने के लिए इसे अनुकूलित कर सकते हैं ):

- (IBAction)toggleOptionalView:(id)sender {
    if (!_expanded) {
        self.optionalView.frame = CGRectMake(self.optionalView.frame.origin.x, self.optionalView.frame.origin.y, self.optionalView.frame.size.width, _optionalHeight);
        self.bottomView.frame = CGRectMake(self.bottomView.frame.origin.x, self.bottomView.frame.origin.y+_optionalHeight, self.bottomView.frame.size.width, self.bottomView.frame.size.height);
        _expanded = YES;
    } else {
        self.optionalView.frame = CGRectMake(self.optionalView.frame.origin.x, self.optionalView.frame.origin.y, self.optionalView.frame.size.width, 0);
        self.bottomView.frame = CGRectMake(self.bottomView.frame.origin.x, self.bottomView.frame.origin.y-_optionalHeight, self.bottomView.frame.size.width, self.bottomView.frame.size.height);
        _expanded = NO;

    }
}

यह सलाह दी जाती है कि वैकल्पिक घटकों की ऊँचाई / चौड़ाई को हार्ड-कोड न करें, अन्यथा आपका कोड हर बार जब आप XIB / Storyboard संपादित करते हैं तो टूट जाता है। मेरे पास एक फ़ील्ड फ़्लोट है _optionalHeight जो मैंने viewDidLoad में सेट किया है, इसलिए यह हमेशा अद्यतित रहता है।


0

आप पृष्ठ को या पेज की कम से कम कुछ कोशिकाओं को भी साफ़ कर सकते हैं और पूरी चीज़ को फिर से परिभाषित कर सकते हैं। यह तेज है और अच्छी तरह से काम करता है। मैंने कोड नहीं लिखा था, लेकिन इस पहले से मौजूद प्रोजेक्ट में यह पाया गया कि मैं काम कर रहा हूं। यह सब प्रबंधित करने के लिए कक्षाएं बनाएं ManagementTableSectionऔर बनाएं ManagementTableCell। क्षमा करें, मैं बेहतर परिभाषित कोड प्रदान नहीं कर सकता।


0

डेनिज़ द्वारा प्रदान किए गए उत्तर का निर्माण, यहाँ स्विफ्ट में बाधाओं का उपयोग करके एक समाधान है

उदाहरण के लिए: यदि आपके पास 3 दृश्य हैं, तो A_view B_view और C_view उस क्रम में लंबवत रूप से संरेखित हैं और आप "छिपाएँ" B को भी चाहते हैं और अंतर को समायोजित भी करते हैं, एक बाधा जोड़ें

B_view.removeFromSuperView()
var constr = NSLayoutConstraint(item: C_view, 
                                attribute: NSLayoutAttribute.Top, 
                                relatedBy: NSLayoutRelation.Equal, 
                                toItem: A_view, 
                                attribute: NSLayoutAttribute.Bottom,
                                multiplier: 1,
                                constant: 20)
view.addConstraint(constr)

निरंतर (इस मामले में) C_view और A_view के बीच ऊर्ध्वाधर स्थान की मात्रा है


0

मैंने "दृश्यमान" नामक एक कस्टम यूवाईवाई कार्यान्वयन में एक नई संपत्ति को जोड़ा, जो जब झूठे पर सेट होता है, तो दृश्य को ढहाने के लिए एक बाधा जोड़ता है (मैंने केवल एक चौड़ाई की बाधा को जोड़ा क्योंकि मेरी सूची क्षैतिज है, लेकिन सबसे अच्छा तरीका एक ऐड जोड़ना हो सकता है ऊँचाई की बाधा 0 के रूप में अच्छी तरह से)।

var visible:Bool = true{
        didSet{
            if(visible){
                clipsToBounds = false;
                removeConstraint(hideConstraint!)
            }else{
                clipsToBounds = true
                addConstraint(hideConstraint!)
            }
        }
    }

आपको दृश्य पर शून्य-चौड़ाई की बाधा को शुरू करने और इसे एक क्षेत्र के रूप में जोड़ने की आवश्यकता है:

private var hideConstraint:NSLayoutConstraint?


func someInitFunction(){
    hideConstraint = NSLayoutConstraint(item: self, attribute: NSLayoutAttribute.Width, relatedBy: NSLayoutRelation.Equal, toItem: nil, attribute: NSLayoutAttribute.NotAnAttribute, multiplier: 1.0, constant: 0.0)
    ...
}

-3

setHidden: TRUE / FALSE Android View.GONE / VISIBLE के निकटतम समतुल्य है।

यदि दृश्य नहीं है, तो दृश्य आवश्यक रूप से जगह नहीं लेता है!

मैंने अन्य दृश्यों के शीर्ष पर एक सूची दृश्य के साथ एक कॉम्बो बॉक्स-एक जैसे बनाया है। चयन करते समय मैं केवल दृश्यमान हूं:

यहाँ छवि विवरण दर्ज करें


आप भूल गए कि android में हमारे पास भी view.inv अदृश्य है ... view.gone setHidden के समान नहीं है ... इसका view.inv अदृश्य है जो कि setHidden के समान है
Nav
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.