it-swarm.dev

iOS المكافئ لوضع رؤية Android.GONE

أقوم بتطوير تطبيق لنظام iOS وأستخدم لوحة العمل مع AutoLayout ON. تحتوي إحدى وحدات التحكم في العرض الخاصة بي على مجموعة من 4 أزرار ، وفي ظروف معينة ، أرغب في اختفاء أول زر.

إذا استخدمت طريقة setHidden:TRUE ، فإن UIButton تصبح غير مرئية ، لكن من الواضح أنها لا تزال تشغل مساحة في العرض ، والنتيجة هي "ثقب" لم أتمكن من تعبئته مما يجعل UIButton المتبقي يطفو باتجاه الجزء العلوي من العرض الرئيسي .

في نظام Android ، كنت ببساطة أستخدم View.GONE بدلاً من View.INVISIBLE ، لكنني في iOS أتعرض لهذا السلوك ولا أريد أن أصدق أن الحل الوحيد هو يدويًا (نعم أقصد برمجيًا) نقل العناصر المتبقية إلى الأعلى .

اعتقدت أنني كنت سأتمكن من القيام بذلك بوضع نوع من القيود لجعل كل شيء تلقائيًا كما هو الحال في Android ولكن لم يكن لدي حظ.

قبل أن أقوم بإيقاف تشغيل Autolayout ، هل يمكن لأي شخص توجيهي إلى الاتجاه الصحيح؟

أنا أستخدم IB ، لكنني مرتاح للأشياء البرمجية أيضًا.

UPDATE:

تعيين ارتفاع المكون إلى 0 لا يساعد كذلك.

جربت شيئًا كهذا:

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

إضافة قيد (NSLayoutAttributeHeight) الذي يحدد ارتفاع العرض إلى 0 عملت لي:

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

أضف قيد ارتفاع إلى طريقة العرض الخاصة بك كما يلي: enter image description here

ثم قم بإجراء منفذ لارتفاع القيد في ملف viewController الخاص بك كما يلي: enter image description here

& في طريقة viewDidLoad الخاصة بك ، قم بتغيير ارتفاع القيد إلى 0 كما يلي:

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

جميع الإجابات على هذه الأسئلة غير فعالة. أفضل طريقة لتحقيق التوازن بين set android و VISibility: طريقة Gone على iOS هي أن StackView حدد المكونات أولاً ثم في المحرر ، وتضمينها ، و Stack View ،

قم بتوصيل عرض مكدس جديد باستخدام IBOutlet ، ثم:

مخفي:

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

الرؤية:

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

باستخدام طريقة عرض المكدس ، سيتم الاحتفاظ بجميع القيود!

وثيقة

16
Beyaz

ما يمكنك القيام به هو تجميع طرق العرض الخاصة بك تحت طريقة عرض مكدس. ثم عندما تقوم بإخفاء طريقة عرض معينة ، سيتم تحويل طرق العرض المتبقية تلقائيًا لملء المساحة.

قد ترغب في التحقق من وثائق Apple على مشاهدات Stack: https://developer.Apple.com/reference/uikit/uistackview

أو البرامج التعليمية عبر الإنترنت مثل: https://www.appcoda.com/stack-views-intro/

6
mechdon

لتحقيق وظيفة Androids.GONE على iOS ، يجب استخدام UIStackView. بعد ذلك إخفاء الطفل حسب الموقف. ( وثائق التفاح )

سويفت 4:

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

إنه مثال لخلية الجدول ، فقط ضع كلا الدواوين Stack view واحصل على عنصر لـ GONE للطفل.

enter image description here

5
Md Imran Choudhury
1
poyo fever.

1) إذا تم وضع الأزرار عموديًا ، فيجب عليك ضبط height على 0 وفي حالة الأزرار الموضوعة أفقياً ، حاول ضبط width إلى 0 أو يمكنك ضبطهما على 0.

OR

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
iphondroid

كما أظهر بحثي ، لا يمكن حتى لـ 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
Katlu

هذا السؤال قديم جدًا ولكن الشيء الذي وجدته هو وضع قيود إضافية (حتى تعرف طرق العرض "المنعطفة" ما يجب القيام به بمجرد فقده)

A  which you want to be     A
|  after setting B to gone  |
B                           C
|                               
C                               
  1. قم بتعيين قيد أولوية (750) أقل من C إلى A.
  2. أضف قيود B العلوية والسفلية (أو اليسار واليمين إذا كنت تريد أن تنهار طريقة العرض أفقياً) إلى مجموعة NSLayoutConstraint 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)
    

من الواضح أنه كلما زاد عدد المشاهدات التي تزداد تعقيدًا ، يزداد هذا التعقيد ، حيث تحتاج إلى قيود إضافية من كل طريقة عرض

0
wyu

يمكنك أيضًا مسح الصفحة ، أو على الأقل خلايا معينة من الصفحة ، وإعادة تحديد الأمر بالكامل. إنه سريع ويعمل بشكل جيد. لم أكتب الرمز لكن وجدته في هذا المشروع الموجود مسبقًا الذي أعمل عليه. قم بإنشاء فصول ManagementTableSection و ManagementTableCell لإدارة كل شيء. آسف لا أستطيع تقديم رمز محدد بشكل أفضل.

0
craned

لقد أضفت خاصية جديدة إلى تطبيق UIView مخصص يسمى "مرئي" والذي ، عند التعيين على "خطأ" ، يضيف قيدًا لطي العرض (لقد أضفت فقط قيد عرض لأن قائمتي أفقية ، ولكن أفضل طريقة قد تكون لإضافة ارتفاع القيد من 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)
    ...
}
0
Anthony De Smet

بناءً على الإجابة التي قدمها Deniz ، إليك حلاً يستخدم القيود في Swift

على سبيل المثال: إذا كان لديك 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
The4thIceman