كيف يمكنني استخدام UISegmentedControl للتبديل وجهات النظر ؟

StackOverflow https://stackoverflow.com/questions/1047114

سؤال

أنا في محاولة لمعرفة كيفية استخدام مختلف الدول من UISegmentedControl للتبديل آراء مماثلة إلى كيف تقوم أبل في المتجر عندما switiching بين الأعلى أجرا " و "أفضل الحرة'.

هل كانت مفيدة؟

المحلول

وأبسط نهج هو أن تكون وجهات النظر التي يمكنك تبديل وجودها والتي تشير إلى عرض تم اختيار. وفيما يلي بعض التعليمات البرمجية على كيف يمكن القيام به، بالتأكيد ليست الطريقة الأمثل للتعامل مع وجهات النظر ولكن فقط لإظهار كيف يمكنك استخدام <م> UISegmentControl إلى تبديل وجهة نظر واضحة:

- (IBAction)segmentSwitch:(id)sender {
  UISegmentedControl *segmentedControl = (UISegmentedControl *) sender;
  NSInteger selectedSegment = segmentedControl.selectedSegmentIndex;

  if (selectedSegment == 0) {
    //toggle the correct view to be visible
    [firstView setHidden:NO];
    [secondView setHidden:YES];
  }
  else{
    //toggle the correct view to be visible
    [firstView setHidden:YES];
    [secondView setHidden:NO];
  }
}

و
يمكنك مواصلة مسار إعادة عامل رمز لإخفاء / إظهار العرض الصحيح.

نصائح أخرى

في حالتي وجهات نظري هي معقدة للغاية، وأنا لا يمكن أن مجرد تغيير الخاصية الخفية للجهات نظر مختلفة لأنها ستتناول الكثير من الذاكرة.

ولقد حاولت عدة حلول وغير واحد منهم عملت بالنسبة لي، أو تنفيذ بطريقة متقطعة، خاصة مع titleView من نافبار لا تظهر دائما segmentedControl عند الضغط / ظهرت وجهات النظر.

ولقد وجدت هذا بلوق وظيفة حول المشكلة التي توضح كيفية القيام بذلك في الطريق الصحيح. يبدو انه كان المعونة من المهندسين أبل في WWDC'2010 من أجل التوصل إلى هذا الحل.

http://redartisan.com/2010/6/ 27 / uisegmented مراقبة للرؤية والتبديل، إعادة النظر

والحل في هذا الرابط هو أيدي بانخفاض أفضل الحلول التي وجدتها حول هذه القضية حتى الآن. مع قليل من التعديل لأنها عملت أيضا مع غرامة tabBar في أسفل

وأو إذا به في الجدول، يمكنك تحميل الجدول وفي cellForRowAtIndex، تعبئة الجدول من مصادر البيانات المختلفة استنادا إلى الخيار المقطع المحدد.

وفكرة واحدة هي أن يكون عرض مع الضوابط مجزأة وجهة نظر الحاوية التي ملء مع subviews مختلفة (إضافة باعتباره subview الوحيد من وجهة نظر حاوية عندما يتم مثبت شرائح). هل يمكن أن يكون حتى التحكم عرض منفصلة عن تلك subviews، لو كان لديك إلى الأمام على الطرق الهامة مثل "viewWillAppear" و "viewWillDisappear" إذا كنت في حاجة إليها (وسيكون لديهم أن يقال ما تحكم الملاحة هم تحت).

وعموما أن يعمل بشكل جيد جدا لأنه يمكنك وضع شاشة العرض الرئيسية مع الحاويات في IB، وسوف subviews ملء مهما كانت مساحة الحاوية يتيح منهم (تأكد من تعيين أقنعة تحجيم_تلقائي الخاص بك بشكل صحيح).

جرب هذا الكود, هذا سوف يساعدك على التبديل بين وجهات نظر مختلفة حول تغيير شرائح شريحة التحكم

فتح وجهات نظر مختلفة بشأن اختيار شرائح مختلفة من UISegmentControl

SNFSegmentedViewController أو عنصر مفتوح المصدر أن يفعل بالضبط ما كنت تبحث عنه مع الإعداد مثل UITabBarController.

ومن إجابة لRonnie ليو، أنا خلق هذا:

//
//  ViewController.m
//  ResearchSegmentedView
//
//  Created by Ta Quoc Viet on 5/1/14.
//  Copyright (c) 2014 Ta Quoc Viet. All rights reserved.
//
#define SIZE_OF_SEGMENT 56
#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController
@synthesize theSegmentControl;
UIView *firstView;
UIView *secondView;
CGRect leftRect;
CGRect centerRect;
CGRect rightRect;
- (void)viewDidLoad
{
    [super viewDidLoad];
    leftRect = CGRectMake(-self.view.frame.size.width, SIZE_OF_SEGMENT, self.view.frame.size.width, self.view.frame.size.height-SIZE_OF_SEGMENT);
    centerRect = CGRectMake(0, SIZE_OF_SEGMENT, self.view.frame.size.width, self.view.frame.size.height-SIZE_OF_SEGMENT);
    rightRect = CGRectMake(self.view.frame.size.width, SIZE_OF_SEGMENT, self.view.frame.size.width, self.view.frame.size.height-SIZE_OF_SEGMENT);

    firstView = [[UIView alloc] initWithFrame:centerRect];
    [firstView setBackgroundColor:[UIColor orangeColor]];
    secondView = [[UIView alloc] initWithFrame:rightRect];
    [secondView setBackgroundColor:[UIColor greenColor]];
    [self.view addSubview:firstView];
    [self.view addSubview:secondView];

}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

- (IBAction)segmentSwitch:(UISegmentedControl*)sender {
    NSInteger selectedSegment = sender.selectedSegmentIndex;
    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:0.2];
    if (selectedSegment == 0) {
        //toggle the correct view to be visible
        firstView.frame = centerRect;
        secondView.frame = rightRect;
    }
    else{
        //toggle the correct view to be visible
        firstView.frame = leftRect;
        secondView.frame = centerRect;
    }
    [UIView commitAnimations];
}
@end

وتعيين .H في

 UISegmentedControl *lblSegChange;

- (IBAction)segValChange:(UISegmentedControl *) sender

وتعلن .M

- (IBAction)segValChange:(UISegmentedControl *) sender
{

 if(sender.selectedSegmentIndex==0)
 {
  viewcontroller1 *View=[[viewcontroller alloc]init];
  [self.navigationController pushViewController:view animated:YES];
 }
 else 
 {
  viewcontroller2 *View2=[[viewcontroller2 alloc]init];
  [self.navigationController pushViewController:view2 animated:YES];
 }
} 

ونسخة سويفت:

وحدة تحكم الرأي الأم هي المسؤولة عن تحديد حجم وموضع من وجهة نظر كل وحدة تحكم رأي الطفل. وجهة نظر وحدة تحكم عرض الطفل يصبح جزءا من التسلسل الهرمي وجهة نظر تحكم رأي الوالدين.

وتحديد خصائص كسول:

private lazy var summaryViewController: SummaryViewController = {
   // Load Storyboard
   let storyboard = UIStoryboard(name: "Main", bundle: Bundle.main)

   // Instantiate View Controller
   var viewController = storyboard.instantiateViewController(withIdentifier: "SummaryViewController") as! SummaryViewController

   // Add View Controller as Child View Controller
   self.add(asChildViewController: viewController)

   return viewController
}()

private lazy var sessionsViewController: SessionsViewController = {
    // Load Storyboard
    let storyboard = UIStoryboard(name: "Main", bundle: Bundle.main)

    // Instantiate View Controller
    var viewController = storyboard.instantiateViewController(withIdentifier: "SessionsViewController") as! SessionsViewController

    // Add View Controller as Child View Controller
    self.add(asChildViewController: viewController)

    return viewController
}()

وإظهار / إخفاء الطفل مشاهدة تحكم:

private func add(asChildViewController viewController: UIViewController) {
    // Add Child View Controller
    addChildViewController(viewController)

    // Add Child View as Subview
    view.addSubview(viewController.view)

    // Configure Child View
    viewController.view.frame = view.bounds
    viewController.view.autoresizingMask = [.flexibleWidth, .flexibleHeight]

    // Notify Child View Controller
    viewController.didMove(toParentViewController: self)
}

private func remove(asChildViewController viewController: UIViewController) {
    // Notify Child View Controller
    viewController.willMove(toParentViewController: nil)

    // Remove Child View From Superview
    viewController.view.removeFromSuperview()

    // Notify Child View Controller
    viewController.removeFromParentViewController()
}

إدارة SegmentedControl tapEvent

private func updateView() {
    if segmentedControl.selectedSegmentIndex == 0 {
        remove(asChildViewController: sessionsViewController)
        add(asChildViewController: summaryViewController)
    } else {
        remove(asChildViewController: summaryViewController)
        add(asChildViewController: sessionsViewController)
    }
}

وبالطبع كنت قادرا على استخدامها داخل الفصول تحكم عرض طفلك:

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    print("Summary View Controller Will Appear")
}

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    print("Summary View Controller Will Disappear")
}

والمرجعي: https://cocoacasts.com/managing-view-controllers-with -container للرؤية والتحكم /

سريع سريع الإصدار:

@IBAction func segmentControlValueChanged(_ sender: UISegmentedControl) {

    if segmentControl.selectedSegmentIndex == 0 {

        // do something
    } else {

        // do something else
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top