UISegmentedControl ด้านล่าง UINavigationbar ใน iOS 7


97

ฉันจะสร้างUISegmentedControlเป็นส่วนหนึ่งของUINavigationBarด้านล่างได้อย่างไร มีการเชื่อมต่อกับUINavigationBarหรือเป็นมุมมองแยกที่สมบูรณ์ซึ่งเพิ่งเพิ่มเป็นUINavigationControllerมุมมองย่อยไปยังตัวควบคุมมุมมองของ ดูเหมือนว่าเป็นส่วนหนึ่งของUINavigationBarเนื่องจากมีเงาอยู่ด้านล่างแถบ

ป้อนคำอธิบายภาพที่นี่


เป็นสิ่งสำคัญสำหรับคุณที่จะรักษาเอฟเฟกต์เบลอเริ่มต้นบน navbar หรือไม่?
vokilam

คำตอบ:


151

เป็นเอฟเฟกต์ง่ายๆที่จะทำให้สำเร็จ

ขั้นแรกวางกลุ่มในแถบเครื่องมือ วางแถบเครื่องมือนี้ไว้ด้านล่างแถบนำทาง ตั้งค่าผู้รับมอบสิทธิ์ของแถบเครื่องมือเป็นตัวควบคุมมุมมองของคุณและกลับUIBarPositionTopAttachedเข้าpositionForBar:มา คุณจะเห็นได้ในแอปร้านค้าหากคุณแสดงท่าทางป๊อปโต้ตอบว่าแถบเซ็กเมนต์จะไม่ขยับเหมือนกับแถบนำทาง นั่นเป็นเพราะพวกเขาไม่ใช่แถบเดียวกัน

ป้อนคำอธิบายภาพที่นี่

ตอนนี้เพื่อลบเส้นขน "เส้นขน" คือมุมUIImageViewมองย่อยของแถบนำทาง คุณสามารถค้นหาและตั้งค่าเป็นซ่อน นี่คือสิ่งที่ Apple ทำในแอพปฏิทินดั้งเดิมเช่นเดียวกับแอพสโตร์ อย่าลืมแสดงเมื่อมุมมองปัจจุบันหายไป ถ้าคุณเล่นเล็ก ๆ น้อย ๆ กับแอปแอปเปิ้ล, คุณจะเห็นว่าเส้นผมถูกตั้งค่าให้ซ่อนอยู่ในชุดการแสดงในviewWillAppear:viewDidDisappear:

เพื่อให้บรรลุถึงรูปแบบของแถบการค้นหาเพียงแค่ตั้งค่าแถบของการsearchBarStyleUISearchBarStyleMinimal


6
คำตอบที่ดี! อย่าลืมอัปเดต contentInset ของ tableView เพื่อหลีกเลี่ยง toolBar เพื่อปกปิดเนื้อหา :-)
LombaX

1
"วางแถบเครื่องมือนี้ไว้ด้านล่างแถบนำทาง" SuperView ควรเป็นอย่างไร?
koen

1
@Koen กรณีการใช้งานของคุณซับซ้อนมากขึ้น สร้างตัวควบคุมมุมมองคอนเทนเนอร์และเพิ่มกลุ่มของคุณที่นั่น จากนั้นเพิ่มตัวควบคุมอื่น ๆ เป็นตัวควบคุมเด็กภายใต้ตัวควบคุมเซ็กเมนต์
Leo Natan

2
ยังคงสับสนว่าวิธีที่ดีที่สุดคือการเพิ่มแถบเครื่องมือคืออะไรฉันควรฮาร์ดโค้ดในเฟรมinitWithRect: CGRectMake(0, self.toplayoutGuide.length, 320, 44)หรืออาจใช้การจัดวางอัตโนมัติเพื่อวางตำแหน่ง ด้านบนใหม่ของ ChildViews จะเป็นself.toplayoutGuide.length + 44อย่างไร?
koen

1
@Vrutin อย่าใช้ไอเท็มปุ่มบาร์ ให้เพิ่มเป็นมุมมองย่อยของแถบเครื่องมือแทน จากนั้นคุณสามารถกำหนดขนาดให้เท่ากับแถบเครื่องมือได้
Leo Natan

14

ตอนนี้เพื่อลบเส้นขน "เส้นขน" คือ UIImageView ที่เป็นมุมมองย่อยของแถบนำทาง คุณสามารถค้นหาและตั้งค่าเป็นซ่อน นี่คือสิ่งที่ Apple ทำในแอพปฏิทินดั้งเดิมเช่นเดียวกับแอพสโตร์ อย่าลืมแสดงเมื่อมุมมองปัจจุบันหายไป หากคุณเล่นแอพของ Apple เล็กน้อยคุณจะเห็นว่าเส้นขนถูกตั้งค่าเป็นซ่อนใน viewWillAppear: และตั้งค่าให้แสดงใน viewDidDisappear:

อีกวิธีหนึ่งคือการมองหาเส้นขนและย้ายไปไว้ใต้แถบเครื่องมือที่เพิ่มเข้ามา นี่คือสิ่งที่ฉันคิดขึ้นมา

@interface ViewController ()
@property (weak, nonatomic) IBOutlet UIToolbar *segmentbar;
@property (weak, nonatomic) UIImageView *navHairline;
@end

@implementation ViewController

#pragma mark - View Lifecycle

- (void)viewDidLoad
{
    [super viewDidLoad];

    // find the hairline below the navigationBar
    for (UIView *aView in self.navigationController.navigationBar.subviews) {
        for (UIView *bView in aView.subviews) {
            if ([bView isKindOfClass:[UIImageView class]] &&
                bView.bounds.size.width == self.navigationController.navigationBar.frame.size.width &&
                bView.bounds.size.height < 2) {
                self.navHairline = (UIImageView *)bView;
            }
        }
    }
}

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    [self _moveHairline:YES];
}

- (void)viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:animated];
    [self _moveHairline:NO];
}

- (void)_moveHairline:(BOOL)appearing
{
    // move the hairline below the segmentbar
    CGRect hairlineFrame = self.navHairline.frame;
    if (appearing) {
        hairlineFrame.origin.y += self.segmentbar.bounds.size.height;
    } else {
        hairlineFrame.origin.y -= self.segmentbar.bounds.size.height;
    }
    self.navHairline.frame = hairlineFrame;
}

@end

ฉันยังพบว่าตัวอย่างรหัส Apple NavBar (การปรับแต่ง UINavigationBar)มีประโยชน์มากในการแก้ไขปัญหานี้

นอกจากนี้อย่าลืมจัดการกับเส้นขอบด้านบนของ UIToolbarซึ่งอาจปรากฏขึ้นและคุณอาจสับสนกับเส้นขนของ NavBar ฉันยังอยาก UIToolbar ที่จะมองเหมือน NavBar คุณอาจต้องการที่จะปรับแถบเครื่องมือbarTintColorแล้ว


13

นี่คือแนวทาง Protocol Oriented Swift สำหรับปัญหานี้โดยพิจารณาจากคำตอบที่ยอมรับ:

HideableHairlineViewController.swift

protocol HideableHairlineViewController {

  func hideHairline()
  func showHairline()

}

extension HideableHairlineViewController where Self: UIViewController {

  func hideHairline() {
    findHairline()?.hidden = true
  }

  func showHairline() {
    findHairline()?.hidden = false
  }

  private func findHairline() -> UIImageView? {
    return navigationController?.navigationBar.subviews
      .flatMap { $0.subviews }
      .flatMap { $0 as? UIImageView }
      .filter { $0.bounds.size.width == self.navigationController?.navigationBar.bounds.size.width }
      .filter { $0.bounds.size.height <= 2 }
      .first
  }

}

SampleViewController.swift

import UIKit

class SampleViewController: UIViewController, HideableHairlineViewController {

  @IBOutlet private weak var toolbar: UIToolbar!
  @IBOutlet private weak var segmentedControl: UISegmentedControl!

  override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated)
    hideHairline()
  }

  override func viewDidDisappear(animated: Bool) {
    super.viewDidDisappear(animated)
    showHairline()
  }


}

// MARK: UIToolbarDelegate
extension SampleViewController: UIToolbarDelegate {

  func positionForBar(bar: UIBarPositioning) -> UIBarPosition {
    return .TopAttached
  }

}

“ เส้นขน” เป็นshadowImageคุณสมบัติของแถบนำทาง
LShi

1
สวัสดีคุณช่วยอธิบายได้ไหมว่าคุณวางตำแหน่งแถบเครื่องมือใน Interface Builder ได้อย่างไร เค้าโครงอัตโนมัติ? คุณสามารถแสดงความคิดเห็นเกี่ยวกับส่วนขยายด้านบนและดูว่าเกิดอะไรขึ้น? ไม่คิดว่าจะได้ผล
LShi

8

คุณสามารถค้นหาแถบนำทางด้วย UISegmentedControl ใน Apple Sample Code: https://developer.apple.com/library/ios/samplecode/NavBar/Introduction/Intro.html

หรือคุณสามารถสร้างโดยใช้โปรแกรมนี่คือรหัสในคำตอบของฉันในเธรดอื่น เพิ่มการควบคุมแบบแบ่งกลุ่มไปยังแถบนำทางและเก็บหัวเรื่องด้วยปุ่ม


6

ฉันอยากทำสิ่งเดียวกัน .. และได้รับสิ่งนี้:


1 - คลาสย่อย UINavigationBar

//-------------------------
// UINavigationBarCustom.h
//-------------------------
#import <UIKit/UIKit.h>

@interface UINavigationBarCustom : UINavigationBar

@end


//-------------------------
// UINavigationBarCustom.m
//-------------------------
#import "UINavigationBarCustom.h"

const CGFloat MyNavigationBarHeightIncrease = 38.f;

@implementation UINavigationBarCustom


- (id)initWithCoder:(NSCoder *)aDecoder {
    
    self = [super initWithCoder:aDecoder];
    
    if (self) {
        [self initialize];
    }
    
    return self;
}

- (id)initWithFrame:(CGRect)frame {
    
    self = [super initWithFrame:frame];
    
    if (self) {
        [self initialize];
    }
    
    return self;
}

- (void)initialize {
    // Set tittle position for top
    [self setTitleVerticalPositionAdjustment:-(MyNavigationBarHeightIncrease) forBarMetrics:UIBarMetricsDefault];
}

- (CGSize)sizeThatFits:(CGSize)size {
    // Increase NavBar size
    CGSize amendedSize = [super sizeThatFits:size];
    amendedSize.height += MyNavigationBarHeightIncrease;
    
    return amendedSize;
}

- (void)layoutSubviews {
// Set buttons position for top
    [super layoutSubviews];
    
    NSArray *classNamesToReposition = @[@"UINavigationButton"];
    
    for (UIView *view in [self subviews]) {
        
        if ([classNamesToReposition containsObject:NSStringFromClass([view class])]) {
            
            CGRect frame = [view frame];
            frame.origin.y -= MyNavigationBarHeightIncrease;
            
            [view setFrame:frame];
        }
    }
}

- (void)didAddSubview:(UIView *)subview
{
    // Set segmented position
    [super didAddSubview:subview];
    
    if ([subview isKindOfClass:[UISegmentedControl class]])
    {
        CGRect frame = subview.frame;
        frame.origin.y += MyNavigationBarHeightIncrease;
        subview.frame = frame;
    }
}

@end

2 - ตั้งค่า NavigationController ของคุณด้วยคลาสย่อย

ตั้งค่า NavigationController ของคุณด้วยคลาสย่อย


3 - เพิ่ม UISegmentedControl ของคุณใน navigationBar

ป้อนคำอธิบายภาพที่นี่


4 - วิ่งและสนุก -> อย่าลืมใส่สีเดียวกันทั้งสองอย่าง

ป้อนคำอธิบายภาพที่นี่


แหล่งค้นหา:

การแฮ็ก UINavigationBar

คำถามดังนั้น


โปรดสังเกตว่าUINavigationButtonเป็น API ส่วนตัวและแอปของคุณจะถูกปฏิเสธไม่ให้ใช้งาน คุณควรพยายามปกปิดการใช้คลาสนั้น
Leo Natan

@LeoNatan หลังจากค้นหาเกี่ยวกับฉันตัดสินใจที่จะเสี่ยงส่งแอพของฉันไปจัดเก็บตามที่อยู่ในคำตอบและ zhas ของฉัน! อนุมัติ
iTSangar

1
โปรดจำไว้ว่าแม้ว่าคุณจะได้รับการอนุมัติเพียงครั้งเดียวคุณก็เสี่ยงที่จะถูกปฏิเสธในอนาคตหรือ Apple สามารถปฏิเสธการส่งในอนาคตได้ อย่างน้อยก็ทำงานจำนวนเล็กน้อยเพื่อซ่อนการใช้ API ส่วนตัว
Leo Natan

1
วิธีแก้ปัญหาของคุณยอดเยี่ยมมากฉันสามารถเพิ่มอะไรก็ได้ในแถบนำทาง แต่น่าเสียดายที่ฉันไม่สามารถคลิกที่วัตถุใด ๆ ที่เพิ่มเข้ามาในมุมมอง: / (แอปที่ฉันใช้งานมีไว้สำหรับอุปกรณ์ JB และไม่ได้ไปที่ Appstore )
iDev

1
ดูดียกเว้นปุ่มย้อนกลับซึ่งจะเพิ่มไปที่ด้านล่าง
gklka

2

Apple มีแอปตัวอย่างสำหรับสิ่งนี้โดยเฉพาะ อธิบายถึงการตั้งค่าภาพเงาโปร่งใสและภาพพื้นหลังสีสำหรับแถบนำทางและวิธีกำหนดค่ามุมมองด้านล่างแถบนำทาง นอกจากนี้ยังมีตัวอย่างของการปรับแต่งแถบนำทางอื่น ๆ

ดูhttps://developer.apple.com/library/ios/samplecode/NavBar/Introduction/Intro.html


2

ฉันพยายามลบเส้นขนโดยใช้วิธีของ @ Simon แต่ไม่ได้ผล ฉันอาจจะทำอะไรผิดเพราะฉันเป็นคนสุดยอด อย่างไรก็ตามแทนที่จะลบบรรทัดคุณสามารถซ่อนได้โดยใช้hiddenแอตทริบิวต์ นี่คือรหัส:

var hairLine: UIView = UIView()
override func viewDidLoad() {
    super.viewDidLoad()
    doneButton.enabled = false

    for parent in self.navigationController!.navigationBar.subviews {
        for childView in parent.subviews {
            if childView is UIImageView && childView.bounds.size.width == self.navigationController!.navigationBar.frame.size.width {
                hairLine = childView
            }
        }
    }
}

override func viewWillAppear(animated: Bool) {
    hairLine.hidden = true
}

override func viewWillDisappear(animated: Bool) {
    hairLine.hidden = false
}

หวังว่านี่จะช่วยใครสักคน!


2

UISegmentedControl ด้านล่าง UINavigationbar ในเร็ว 3/4

รายละเอียด

Xcode 9.2 รวดเร็ว 4

ตัวอย่างเต็ม

ViewController.swift

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var tableView: UITableView!
    @IBOutlet weak var navigationBarWithSegmentedControl: UINavigationBar!

    fileprivate let barBackgroundColor = UIColor(red: 248/255, green: 248/255, blue: 248/255, alpha: 1.0)

    override func viewDidLoad() {
        super.viewDidLoad()

        navigationBarWithSegmentedControl.barTintColor = barBackgroundColor
        tableView.dataSource = self
        tableView.delegate = self
    }

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)

        navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default)
        navigationController?.navigationBar.shadowImage = UIImage()
        navigationController?.navigationBar.barTintColor = barBackgroundColor
    }

    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)

        navigationController?.navigationBar.setBackgroundImage(nil, for: .default)
        navigationController?.navigationBar.shadowImage =  nil
    }
}

extension ViewController: UITableViewDataSource {

    func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 100
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "TableViewCell") as! TableViewCell
        cell.label.text = "\(indexPath)"
        return cell
    }
}

extension ViewController: UITableViewDelegate {
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        if let cell = tableView.cellForRow(at: indexPath) {
            cell.isSelected = false
        }
    }
}

TableViewCell.swift

import UIKit

class TableViewCell: UITableViewCell {

    @IBOutlet weak var label: UILabel!

}

Main.storyboard

<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="13771" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES" initialViewController="5TT-dT-dEr">
    <device id="retina4_7" orientation="portrait">
        <adaptation id="fullscreen"/>
    </device>
    <dependencies>
        <deployment identifier="iOS"/>
        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="13772"/>
        <capability name="Constraints to layout margins" minToolsVersion="6.0"/>
        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
    </dependencies>
    <scenes>
        <!--Text-->
        <scene sceneID="tne-QT-ifu">
            <objects>
                <viewController id="BYZ-38-t0r" customClass="ViewController" customModule="stackoverflow_21887252" customModuleProvider="target" sceneMemberID="viewController">
                    <layoutGuides>
                        <viewControllerLayoutGuide type="top" id="y3c-jy-aDJ"/>
                        <viewControllerLayoutGuide type="bottom" id="wfy-db-euE"/>
                    </layoutGuides>
                    <view key="view" contentMode="scaleToFill" id="8bC-Xf-vdC">
                        <rect key="frame" x="0.0" y="0.0" width="375" height="603"/>
                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
                        <subviews>
                            <tableView clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" separatorStyle="default" rowHeight="44" sectionHeaderHeight="28" sectionFooterHeight="28" translatesAutoresizingMaskIntoConstraints="NO" id="HLl-W2-Moq">
                                <rect key="frame" x="0.0" y="44" width="375" height="559"/>
                                <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
                                <prototypes>
                                    <tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" reuseIdentifier="TableViewCell" id="FKA-c2-G0Q" customClass="TableViewCell" customModule="stackoverflow_21887252" customModuleProvider="target">
                                        <rect key="frame" x="0.0" y="28" width="375" height="44"/>
                                        <autoresizingMask key="autoresizingMask"/>
                                        <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="FKA-c2-G0Q" id="Xga-fr-00H">
                                            <rect key="frame" x="0.0" y="0.0" width="375" height="43.5"/>
                                            <autoresizingMask key="autoresizingMask"/>
                                            <subviews>
                                                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="QW3-Hg-hU9">
                                                    <rect key="frame" x="15" y="11" width="345" height="21"/>
                                                    <fontDescription key="fontDescription" type="system" pointSize="17"/>
                                                    <nil key="textColor"/>
                                                    <nil key="highlightedColor"/>
                                                </label>
                                            </subviews>
                                            <constraints>
                                                <constraint firstAttribute="trailingMargin" secondItem="QW3-Hg-hU9" secondAttribute="trailing" id="Grx-nu-2Tu"/>
                                                <constraint firstItem="QW3-Hg-hU9" firstAttribute="centerY" secondItem="Xga-fr-00H" secondAttribute="centerY" id="MIn-R2-wYE"/>
                                                <constraint firstItem="QW3-Hg-hU9" firstAttribute="leading" secondItem="Xga-fr-00H" secondAttribute="leadingMargin" id="h6T-gt-4xk"/>
                                            </constraints>
                                        </tableViewCellContentView>
                                        <color key="backgroundColor" red="0.0" green="0.0" blue="0.0" alpha="0.050000000000000003" colorSpace="custom" customColorSpace="sRGB"/>
                                        <connections>
                                            <outlet property="label" destination="QW3-Hg-hU9" id="QjK-i2-Ckd"/>
                                            <segue destination="hcx-2g-4ts" kind="show" id="IGa-oI-gtf"/>
                                        </connections>
                                    </tableViewCell>
                                </prototypes>
                            </tableView>
                            <navigationBar contentMode="scaleToFill" translucent="NO" translatesAutoresizingMaskIntoConstraints="NO" id="8jj-w6-ZtU">
                                <rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
                                <items>
                                    <navigationItem id="q8e-Yy-ceD">
                                        <nil key="title"/>
                                        <segmentedControl key="titleView" opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="top" segmentControlStyle="bar" selectedSegmentIndex="0" id="cHD-bv-2w7">
                                            <rect key="frame" x="96.5" y="7" width="182" height="30"/>
                                            <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
                                            <segments>
                                                <segment title="First"/>
                                                <segment title="Second"/>
                                                <segment title="Third"/>
                                            </segments>
                                        </segmentedControl>
                                    </navigationItem>
                                </items>
                            </navigationBar>
                        </subviews>
                        <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
                        <constraints>
                            <constraint firstItem="8jj-w6-ZtU" firstAttribute="trailing" secondItem="HLl-W2-Moq" secondAttribute="trailing" id="1vT-ta-AuP"/>
                            <constraint firstItem="8jj-w6-ZtU" firstAttribute="leading" secondItem="8bC-Xf-vdC" secondAttribute="leading" id="BJE-BC-XcB"/>
                            <constraint firstItem="8jj-w6-ZtU" firstAttribute="top" secondItem="y3c-jy-aDJ" secondAttribute="bottom" id="Boi-dN-awt"/>
                            <constraint firstItem="HLl-W2-Moq" firstAttribute="bottom" secondItem="wfy-db-euE" secondAttribute="top" id="W1n-m1-EOH"/>
                            <constraint firstAttribute="trailing" secondItem="8jj-w6-ZtU" secondAttribute="trailing" id="ihc-9p-71l"/>
                            <constraint firstItem="HLl-W2-Moq" firstAttribute="top" secondItem="8jj-w6-ZtU" secondAttribute="bottom" id="pFk-pU-y7j"/>
                            <constraint firstItem="8jj-w6-ZtU" firstAttribute="leading" secondItem="HLl-W2-Moq" secondAttribute="leading" id="yjf-7o-t2m"/>
                        </constraints>
                    </view>
                    <navigationItem key="navigationItem" title="Text" id="yrt-M7-PAX">
                        <barButtonItem key="leftBarButtonItem" systemItem="search" id="wrz-DS-FdJ"/>
                        <barButtonItem key="rightBarButtonItem" systemItem="add" id="LnB-Ci-YnO"/>
                    </navigationItem>
                    <connections>
                        <outlet property="navigationBarWithSegmentedControl" destination="8jj-w6-ZtU" id="Ggl-xb-fmj"/>
                        <outlet property="tableView" destination="HLl-W2-Moq" id="hEO-2U-I9k"/>
                    </connections>
                </viewController>
                <placeholder placeholderIdentifier="IBFirstResponder" id="dkx-z0-nzr" sceneMemberID="firstResponder"/>
            </objects>
            <point key="canvasLocation" x="894" y="791"/>
        </scene>
        <!--View Controller-->
        <scene sceneID="Bi7-4l-uRN">
            <objects>
                <viewController id="hcx-2g-4ts" sceneMemberID="viewController">
                    <layoutGuides>
                        <viewControllerLayoutGuide type="top" id="NSV-kw-fuz"/>
                        <viewControllerLayoutGuide type="bottom" id="aze-le-h11"/>
                    </layoutGuides>
                    <view key="view" contentMode="scaleToFill" id="1nd-qq-kDT">
                        <rect key="frame" x="0.0" y="0.0" width="375" height="603"/>
                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
                        <subviews>
                            <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="k7W-CB-tpA">
                                <rect key="frame" x="0.0" y="0.0" width="375" height="603"/>
                                <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
                            </view>
                        </subviews>
                        <color key="backgroundColor" white="0.66666666666666663" alpha="0.5" colorSpace="calibratedWhite"/>
                        <constraints>
                            <constraint firstAttribute="trailing" secondItem="k7W-CB-tpA" secondAttribute="trailing" id="1t2-Bi-dR7"/>
                            <constraint firstItem="k7W-CB-tpA" firstAttribute="bottom" secondItem="aze-le-h11" secondAttribute="top" id="Fnm-UL-geX"/>
                            <constraint firstItem="k7W-CB-tpA" firstAttribute="leading" secondItem="1nd-qq-kDT" secondAttribute="leading" id="bKV-7A-hz0"/>
                            <constraint firstItem="k7W-CB-tpA" firstAttribute="top" secondItem="NSV-kw-fuz" secondAttribute="bottom" id="cFH-7i-vAm"/>
                        </constraints>
                    </view>
                </viewController>
                <placeholder placeholderIdentifier="IBFirstResponder" id="jPK-Z9-yvJ" userLabel="First Responder" sceneMemberID="firstResponder"/>
            </objects>
            <point key="canvasLocation" x="1566" y="791"/>
        </scene>
        <!--Navigation Controller-->
        <scene sceneID="1Pc-qt-rnW">
            <objects>
                <navigationController automaticallyAdjustsScrollViewInsets="NO" id="5TT-dT-dEr" sceneMemberID="viewController">
                    <toolbarItems/>
                    <navigationBar key="navigationBar" contentMode="scaleToFill" translucent="NO" id="lPt-hx-iar">
                        <rect key="frame" x="0.0" y="20" width="375" height="44"/>
                        <autoresizingMask key="autoresizingMask"/>
                    </navigationBar>
                    <nil name="viewControllers"/>
                    <connections>
                        <segue destination="BYZ-38-t0r" kind="relationship" relationship="rootViewController" id="6b8-br-zSy"/>
                    </connections>
                </navigationController>
                <placeholder placeholderIdentifier="IBFirstResponder" id="u7U-GH-NHe" userLabel="First Responder" sceneMemberID="firstResponder"/>
            </objects>
            <point key="canvasLocation" x="140" y="791.15442278860576"/>
        </scene>
    </scenes>
</document>

ผล

ป้อนคำอธิบายภาพที่นี่ ป้อนคำอธิบายภาพที่นี่ ป้อนคำอธิบายภาพที่นี่


เขียนได้ดีและทันเวลา ขอบคุณ Vasily
daspianist

วิธีใดที่คุณสามารถอัปโหลดโครงการ XCode สำหรับสิ่งนี้ ฉันคิดว่าฉันกำหนดค่าแถบนำทางไม่ถูกต้อง ตัวอย่างเช่นฉันสังเกตเห็นว่าเป็นส่วนหัวพื้นหลังสีขาวแทนที่จะเป็นสีเทามาตรฐาน ขอบคุณ
daspianist

รหัสนี้ - สำเนาเต็มโครงการของฉัน คัดลอกไฟล์ทั้งหมด หรือบอกฉันเกี่ยวกับข้อผิดพลาดของคุณ
Vasily Bodnarchuk

สุดยอด! ขอบคุณ!
daspianist

คุณกำลังใช้แถบนำทางที่สอง (ที่มีตัวควบคุมแบบแบ่งกลุ่ม) นอกเหนือจากแถบที่มีให้โดยUINavigationController?
LShi

0

มีหลายวิธีในการทำสิ่งที่คุณถาม สิ่งที่ง่ายที่สุดคือการสร้างมันในตัวสร้างอินเทอร์เฟซ แต่ฉันคิดว่านี่ไม่ใช่สิ่งที่คุณคิดไว้ ฉันสร้างตัวอย่างของภาพที่คุณโพสต์ไว้ด้านบน มันไม่เหมือนกันทุกประการ แต่คุณสามารถเล่นกับคุณสมบัติมากมายเพื่อให้ได้รูปลักษณ์ของสิ่งที่คุณกำลังมองหา

ใน ViewController.h

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController <UITableViewDataSource, UITableViewDelegate, UISearchBarDelegate>

@end

ใน ViewController.m

#import "ViewController.h"

@interface ViewController ()

@property (strong, nonatomic) UISegmentedControl *mySegmentControl;
@property (strong, nonatomic) UISearchBar *mySearchBar;
@property (strong, nonatomic) UITableView *myTableView;
@property (strong, nonatomic) NSMutableArray *tableDataArray;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    // create a custom UIView
    UIView *myView = [[UIView alloc] initWithFrame:CGRectMake(0, 64, 320, 84)];
    myView.tintColor = [UIColor lightGrayColor]; // change tiny color or delete this line to default

    // create a UISegmentControl
    self.mySegmentControl = [[UISegmentedControl alloc] initWithItems:[NSArray arrayWithObjects:@"All", @"Not on this iPhone", nil]];
    self.mySegmentControl.selectedSegmentIndex = 0;
    [self.mySegmentControl addTarget:self action:@selector(segmentAction:) forControlEvents:UIControlEventValueChanged];
    self.mySegmentControl.frame = CGRectMake(20, 10, 280, 30);
    [myView addSubview:self.mySegmentControl]; // add segment control to custom view

    // create UISearchBar
    self.mySearchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0, 40, 320, 44)];
    [self.mySearchBar setDelegate:self];
    self.mySearchBar.searchBarStyle = UISearchBarStyleMinimal;
    [myView addSubview:self.mySearchBar]; // add search bar to custom view

    [self.view addSubview:myView]; // add custom view to main view

    // create table data array
    self.tableDataArray = [[NSMutableArray alloc] initWithObjects:
                           @"Line 1",
                           @"Line 2",
                           @"Line 3",
                           @"Line 4",
                           @"Line 5",
                           @"Line 6",
                           @"Line 7",
                           @"Line 8",
                           @"Line 9",
                           @"Line 10",
                           @"Line 11",
                           @"Line 12", nil];
    self.myTableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 160, 320, 320)];
    [self.myTableView setDataSource:self];
    [self.myTableView setDelegate:self];
    [self.view addSubview:self.myTableView]; // add table to main view
}

-(void)searchBarSearchButtonClicked:(UISearchBar *)searchBar {
    [searchBar resignFirstResponder];
    NSLog(@"search text = %@",searchBar.text);
    // code for searching...
}

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return 1;
}

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return [self.tableDataArray count];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil)
        {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
        }

    cell.textLabel.text = [self.tableDataArray objectAtIndex:indexPath.row];

    return cell;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    NSLog(@"Selected table item: %@",[self.tableDataArray objectAtIndex:indexPath.row]);

    // do something once user has selected a table cell...
}

-(void)segmentAction:(id)sender {
    NSLog(@"Segment control changed to: %@",[self.mySegmentControl titleForSegmentAtIndex:[self.mySegmentControl selectedSegmentIndex]]);

    // do something based on segment control selection...
}

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

@end

-2

displaySearchBarInNavigationBarเป็นวิธีการแสดงแถบค้นหาตลอดจนแถบขอบเขตในแถบนำทาง

คุณต้องซ่อนแถบค้นหาทุกครั้งที่คุณแสดงชื่อเรื่องที่กำหนดเอง


ฉันไม่เข้าใจ คุณช่วยระบุซอร์สโค้ดได้ไหม
yoeriboven

ว่ากันว่า "แถบค้นหาที่แสดงในแถบนำทางไม่สามารถมีแถบขอบเขตได้"
vokilam
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.