আইফোন: ইউআইটিএবলভিউ অনুসন্ধান বারটি ডিফল্টরূপে লুকান


85

আমি একটি টেবিল ভিউ তৈরি করতে ইন্টারফেস বিল্ডার ব্যবহার করেছি, যেখানে আমি অনুসন্ধান কার্যকারিতা যুক্ত করতে লাইব্রেরির অনুসন্ধান বার এবং অনুসন্ধান প্রদর্শন নিয়ন্ত্রক যুক্ত করেছি। যাইহোক, আইবি এটি সেট আপ করেছে যাতে বারের প্রথম দৃশ্য প্রদর্শিত হবে তখন পর্দার শীর্ষে বারটি দৃশ্যমান হয়।

আমি কীভাবে অনুসন্ধান বারটি ডিফল্টরূপে গোপন রাখতে পারি তা টেবিলের দৃশ্যের সাথে এখনও স্ক্রোলযোগ্য (উদাহরণের জন্য অ্যাপলের মেল অ্যাপ্লিকেশনটি দেখুন)। আমি কলিং চেষ্টা করেছি scrollRectToVisible:animated:viewDidLoadটেবিল ভিউ নিচে স্ক্রল, কিন্তু কোন উপকার। ডিফল্টরূপে অনুসন্ধান বারটি আড়াল করার পছন্দের উপায় কী?

উত্তর:


116

প্রথমে নিশ্চিত হয়ে নিন, ইউআইটিএলবারের টেবিলহাইডারভিউতে ইউআইএসবারবার যুক্ত করার জন্য যাতে এটি টেবিলের বিষয়বস্তুতে স্ক্রোল হয় এবং দৃশ্যের শীর্ষে স্থির না হয়।

সন্ধানবারটি টেবিলভিউতে সারি হিসাবে গণনা করা হয় না, তাই যদি আপনি প্রথম সারিতে টেবিল ভিউয়ের শীর্ষটি স্ক্রোল করেন তবে এটি অনুসন্ধান বারটি 'লুকিয়ে রাখে':

[yourTableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] atScrollPosition:UITableViewScrollPositionTop animated:NO];

বা সুইফটে:

yourTableView.scrollToRowAtIndexPath(NSIndexPath(forRow: 0, inSection: 0), atScrollPosition: UITableViewScrollPosition.Top, animated: false)

ডেটা থাকার আগে টেবিলভিউটি স্ক্রোল না করার বিষয়টি নিশ্চিত করুন ( scrollToRowAtIndexPathপ্রদত্ত ইনডেক্সপথটি বৈধ সারিটিতে নির্দেশ না করলে (যেমন টেবিলভিউ খালি থাকলে)) একটি ব্যতিক্রম উত্থাপন করবে Make


12
প্রকৃতপক্ষে, আমি একটি ইস্যু পাচ্ছি যেখানে টেবিলের ভিউ স্ক্রল করবে না যদি স্ক্রিনটি পূরণ করার জন্য পর্যাপ্ত সারি না থাকে - এক বা দুটি সারি সহ একটি টেবিলে, এই কোডটি কিছুই করে না। এটা কি প্রত্যাশিত আচরণ? আমি কি এটির আশপাশে কিছুটা পেতে পারি?
টিম

18
আমি একটি উপায় পেয়েছি: একটি সূচক পথে স্ক্রোল করার পরিবর্তে, টেবিলের স্ক্রোল ভিউটির সামগ্রীটি অফসেটকে সিজিআরেক্টে 0.0, 44.0 এ পরিবর্তন করুন
টিম

107
টিম, এই পথেই! আমি self.tableView.contentOffset = সিজিপিউইন্টমেক (0, self.searchDisplayController.searchBar.frame.size.height) ব্যবহার করেছি;
জো

4
বিটিডব্লিউ - যখন আমি [টেবিলভিউ পুনরায়লোডডাটা] এর কল করার পরে এই কোডটি দিচ্ছিলাম যার ফলে আমার টেবিলটি 2 টি সারি থেকে পর্যাপ্ত সারিতে সাধারণ স্ক্রোলিংয়ের অনুমতি দেয়, তখন আমি দেখতে পেলাম যে বিষয়বস্তু অফসেট পদ্ধতিটি ব্যবহারের ফলে অনুসন্ধানকে ঝুঁকিপূর্ণ দেখাবে এবং লুকিয়েছে স্ক্রোলটিআরআউটইন্টেক্সপথ পদ্ধতিটি ব্যবহার করার সময় বাক্সটিতে একই ঝাঁকুনি ছিল না।
ক্রিস আর

4
এটিই একমাত্র চূড়ান্ত উপায় যা কোনও পরিস্থিতিতে কাজ করে। contentOffsetযদি আপনি জটিল ভিউ-কন্ট্রোলার লেআউট নিযুক্ত করেন তবে মানটি যা ভেঙে যায় তা দিয়ে সেট করা। আমি এটি সুপারিশ না।
eonil

45

ইউআইটিএলভিউর একটি সংক্ষিপ্তসার হিসাবে UIS SearchBar যুক্ত করবেন না, এটি প্রয়োজনীয় নয়।

ইউআইটিএবলভিউতে একটি টেবিলহাইডারভিউ সম্পত্তি রয়েছে যা এটির জন্য উপযুক্ত:

- (void) viewDidLoad {
    [super viewDidLoad]; 
    self.searchBar = [[[UISearchBar alloc] initWithFrame:CGRectMake(0, 0, 320, 44)] autorelease];
    self.searchBar.showsCancelButton = YES;    
    self.searchBar.delegate = self;
    self.tableView.tableHeaderView = self.searchBar;     
}

আপনি যদি এটি ডিফল্টরূপে দেখতে না চান:

- (void) viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    [self.tableView setContentOffset:CGPointMake(0, 44)];
}

আবার লুকানোর জন্য আমি বাতিল বোতামটিও পেয়েছি .... (এবং কীবোর্ডটি সরিয়ে দিন)

- (void)searchBarCancelButtonClicked:(UISearchBar *)searchBar {
    [self.tableView setContentOffset:CGPointMake(0, 44) animated:YES];
    [self.searchBar resignFirstResponder];
}

আমার জন্য, এটিই একমাত্র সমাধান যা একটি লুকানো ইউআইএস সার্চবার বাস্তবায়ন তৈরি করেছিল যা অনুভব করেছিল যে এটি এইচআইজি-র সাথে মিল রয়েছে। অন্যান্য সমাধানগুলি যেখানে এটি টেবিলের দৃশ্যের শীর্ষে "আটকে "ছে অপ্রাকৃত মনে হয়।
কুর্তজমার্ক

4
এই সমাধানটি সবচেয়ে ভাল কাজ করেছে। এটি আমার মতে উত্তর হওয়া উচিত।
দারওয়িন্দেডস

এই সমাধানটি দুর্দান্ত (+1)। তবে কিছু ক্ষেত্রে টেবিলভিউ অনুসন্ধান বারটি সঠিকভাবে আড়াল করে না (আমার ক্ষেত্রে: যখন টেবিলভিউ নিয়ামকটিকে অন্য ভিউ নিয়ামক থেকে পিছনে ঠেলে দেওয়া হয়)। এই সমস্যা সম্পর্কে একটি প্রশ্ন আছে: stackoverflow.com/questions/15222186/... আমি মনে করি এই প্রশ্নের প্রদান উত্তর বেশ ভাল যদিও নয়। @ বানদেজপাইসা, আপনার কি ধারণা আছে?
ব্রায়ান

4
এটি আমার পক্ষে ভাল কাজ করেছে, যদিও আমি জুড়েই হার্ড-কোডিংয়ের পরিবর্তে 44 এর জন্য সেল্ফ.ট্যাবলভিট.ট্যাবলহাইডারভিউ.ফ্রেম.সাইজ.উইট ব্যবহার করার পরামর্শ দিচ্ছি অ্যাপল ভবিষ্যতে অনুসন্ধান বারের উচ্চতায় পরিবর্তন করতে পারে allow
জন স্টিফেন

এটি puttingোকানো viewWillAppearএকটি খারাপ ধারণা কারণ এটি প্রতিবার আপনার দৃশ্যে নেভিগেট করার সময় চলবে। এর অর্থ আপনার টেবিলভিউটি ধীরে ধীরে ইঞ্চি হয়ে যাবে। জ্বালা বাগ!
সাইরেনস

25

টিম এবং জো ডি'আন্ড্রিয়া মন্তব্যগুলিতে কন্টেন্টঅফসেটটি উল্লেখ করেছে, তবে অনুসন্ধান বারটি গোপনে একটি অ্যানিমেশন যুক্ত করে এটি কিছুটা প্রসারিত করা হয়েছে। আমি লক্ষ্য করেছি যে অনুসন্ধান বারটি সবেমাত্র অদৃশ্য হয়ে যাওয়ার জন্য এটি কিছুটা অপ্রত্যাশিত।

যারা আইওএস ৪.০ বা তারপরের উপরে লক্ষ্য করতে চান তাদের জন্য একটি সামান্য আপডেট, চেষ্টা করে দেখুন:

[UIView animateWithDuration:0.4 animations:^{
    self.tableView.contentOffset = CGPointMake(0, self.searchDisplayController.searchBar.frame.size.height);
 } completion:nil];

পূর্ববর্তী উত্তর:

[UIView beginAnimations:@"hidesearchbar" context:nil];
[UIView setAnimationDuration:0.4];
[UIView setAnimationBeginsFromCurrentState:YES];

self.tableView.contentOffset = CGPointMake(0, self.searchDisplayController.searchBar.frame.size.height);

[UIView commitAnimations];


9
আমি খুঁজে পেয়েছি যে অ্যানিমেশনটি এই সমাধানের মূল বিষয়। অ্যানিমেশন ব্যতীত সামগ্রীতে অফসেট সেট করার চেষ্টা করা কিছুতেই উপস্থিত হবে না। এই নমুনায় অ্যানিমেশন পদ্ধতিগুলি (বা ব্লক) ব্যবহারের পরিবর্তে, আমি দেখতে পাচ্ছি যে কেবলমাত্র [সেল্ফ.ট্যাবলভিউ সেটকন্টেন্টঅফসেট: সিজিপয়েন্টমনেক (0,44) অ্যানিমেটেড: সত্য] ভালভাবে কাজ করে।
কুইথথাইম

এটি অ্যানিমেশন ব্যতীত মোটেই কাজ করবে না বলে মনে হচ্ছে। @ কুইকিথিম একই পর্যবেক্ষণ করেছেন।
থিলো

4
আপনি যদি এর viewDidAppear:পরিবর্তে এটি প্রয়োগ করেন তবে অ্যানিমেশনগুলির প্রয়োজন ছাড়াই আমি এ নিয়ে সাফল্য পেয়েছি viewDidLoad
wbyoung

8

এই সমাধানের অনেক উত্তর রয়েছে তবে আমার পক্ষে কোনওটিই খুব ভালভাবে কাজ করেনি।

এটি পুরোপুরি কাজ করে। কোনও অ্যানিমেশন নেই, এবং এটি সম্পন্ন হয়েছে-viewDidLoad

 - (void)viewDidLoad {
     [super viewDidLoad];
     self.tableView.contentOffset = CGPointMake(0,  self.searchBar.frame.size.height - self.tableView.contentOffset.y);
 }

বিঃদ্রঃ:

কোড ধরে নেয় আপনার কাছে searchBar @propertyযা অনুসন্ধান বারের সাথে যুক্ত। যদি না হয়, আপনি self.searchDisplayController.searchBarপরিবর্তে ব্যবহার করতে পারেন


এই একমাত্র আমার জন্য কাজ করেছেন! , তবে এটি কেবল এটি দর্শনীয় লোড আনন করে না ... সুতরাং প্রথমবারের জন্য এটি লুকানো হয়, তবে ডি অ্যাপ্লিকেশন চলাকালীন তখন আর লুকানো হয় না। এবং আমি এটিকে ভিউআইলাপিয়ার এবং ভিউডিডিঅ্যাপে রাখার চেষ্টা করেছি তবে ভুল কাজ করে। ধন্যবাদ!
fguespe

@fguespe এটি অদ্ভুত .. ভিউডিডডলডটি ততক্ষণে তাত্ক্ষণিকভাবে ফোন করা উচিত। আমার সাথে এটি কখনও ঘটেনি যে অন্য ভিউ থেকে ফিরে আসার পরে ইউআইএসবারবার দৃশ্যমান ছিল।
মতেজ

আমি একটি ট্যাবড অ্যাপ্লিকেশন ব্যবহার করছি। হয়তো যে?
fguespe

@fguespe আমি দেখছি এটি হুম ইস্যু হতে পারে। দুর্ভাগ্যক্রমে আমি নিশ্চিত না যে আপনি কীভাবে সমাধান -viewWillAppearনা করে যদি এটি কাজ না করে তবে কী ট্যাব নিয়ামক দৃশ্যে স্যুইচ করে তা ডাকা হবে?
মতেজ

ভিউউইলপিয়ার এবং ভিউডিডাপিয়ার বলা হয় তবে আমি উভয়ের সাথে চেষ্টা করেছিলাম এবং দৃশ্যটি ভুল অফসেটের মতো। এটি প্রত্যাশিত ফলাফল দেয় না। মানে কিছু একটা করে তবে তা খারাপ করে।
fguespe

7

সুইফ্ট 3+ এর জন্য

আমি এটা করেছি:

এটি ঘোষণা করুন var:

    var searchController = UISearchController()

এবং viewDidLoad()পদ্ধতিতে

    searchController = UISearchController(searchResultsController: nil)
    searchController.searchResultsUpdater = self
    searchController.hidesNavigationBarDuringPresentation = false
    searchController.dimsBackgroundDuringPresentation = true
    searchController.searchBar.placeholder = NSLocalizedString("Search", comment: "")
    definesPresentationContext = true
    tableView.tableHeaderView = searchController.searchBar

    tableView.contentOffset = CGPoint(x: 0, y: searchController.searchBar.frame.size.height)

5

আমার লক্ষ্যটি ছিল স্টোরিবোর্ডে প্লে টেবিলভিউর স্টাইলের টেবিলহাইডারভিউতে যুক্ত সন্ধানের বারটি লুকানো the সুতরাং, আমি সুইফ্ট ব্যবহার করছি এবং এক্সটেনশন যুক্ত করেছি:

extension UITableView {
    func hideSearchBar() {
        if let bar = self.tableHeaderView as? UISearchBar {
            let height = CGRectGetHeight(bar.frame)
            let offset = self.contentOffset.y
            if offset < height {
                self.contentOffset = CGPointMake(0, height)
            }
        }
    }
}

মধ্যে viewDidLoad () শুধু কল:

self.tableView.hideSearchBar()

5

সমস্ত বিদ্যমান সমাধান আইওএস 8 এ আমার জন্য কাজ করে না যখন টেবিলটি পূরণ করার জন্য পর্যাপ্ত সারি না থাকায় আইওএস এই পরিস্থিতিতে স্বয়ংক্রিয়ভাবে ইনসেটটি সামঞ্জস্য করবে adjust (পর্যাপ্ত সারি থাকলেও বিদ্যমান উত্তরগুলি ভাল থাকে)

এই ইস্যুতে 6 ঘন্টা নষ্ট করার পরে অবশেষে আমি এই সমাধান পেয়েছি।

সংক্ষেপে, পর্যাপ্ত কক্ষ না থাকলে আপনার টেবিলভিউতে খালি ঘরগুলি সন্নিবেশ করা দরকার, সুতরাং টেবিলভিউয়ের সামগ্রীর আকারটি এত বড় যে আইওএস আপনার জন্য ইনসেটটি সামঞ্জস্য করবে না।

আমি সুইফটে এটি কীভাবে করেছি:

1.) minimumCellNumএকটি শ্রেণীর সম্পত্তি হিসাবে একটি ভেরিয়েবল ঘোষণা

var minimumCellNum: Int?

2.) ক্যালকুলেট minimumCellNumএবং সেট tableView.contentOffsetমধ্যেviewWillAppear

let screenHeight = Int(UIScreen.mainScreen().bounds.height)

// 101 = Height of Status Bar(20) + Height of Navigation Bar(44) + Height of Tab Bar(49)
// you may need to subtract the height of other custom views from the screenHeight. For example, the height of your section headers.
self.minimumCellNum = (screenHeight - 103 - heightOfOtherCustomView) / heightOfYourCell
self.tableView.contentOffset = CGPointMake(0, 44)

3.) ইন tableView(tableView: UITableView, numberOfRowsInSection section: Int))

let numOfYourRows = YOUR LOGIC
if numOfYourRows > minimumCellNum {
    return numOfYourRows
} else {
    return minimumCellNum!
}

৪) স্টোরিবোর্ডে এবং ভিতরে একটি ফাঁকা ঘর নিবন্ধভুক্ত করুন যার selectionবৈশিষ্ট্যNonetableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath)

if indexPath.row < numOfYourRows {
    return YOUR CUSTOM CELL
} else {
    let cell = tableView.dequeueReusableCellWithIdentifier("EmptyCell", forIndexPath: indexPath) as! UITableViewCell
    return cell
}

5.) ইন tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath)

if tableView == self.tableView {
    if numOfYourRows < (indexPath.row + 1) {
        return
    }
    YOUR LOGIC OF SELECTING A CELL
}

এটি একটি নিখুঁত সমাধান নয়, তবে এটিই একমাত্র কার্যপ্রণালী যা আইওএস 8 এর জন্য আমার পক্ষে সত্যই কাজ করে I'd আমি আরও জানতে চাই যে আরও সুন্দর সমাধান আছে কিনা।


আইওএস ১১ এর জন্য আমাকে এটি করতে হয়েছিল ১১. কনটেন্টসফিট সেট করা একা আইওএস 9/10 এর জন্য 0 বা আরও বেশি কক্ষের জন্য কাজ করেছিল এবং এটি 8+ কোষের জন্য আইওএস 11 এও কাজ করেছে। যে কোনও কিছুতেই কম সমাধান দরকার required একটি কারণ কেন আছে?
টনি

আমি মনে করি এই পোস্টের প্রথম অনুচ্ছেদটি কেন তা ব্যাখ্যা করে।
ব্রায়ান

আমি প্রথম অনুচ্ছেদটি বুঝতে পেরেছিলাম, তবে এটি এখনও আশ্চর্যজনক যে এটি আমার জন্য আইওএস 11 এ কেবল "ভাঙ্গা" ছিল। আমি আইওএস 9, 10 এবং 11 এর জন্য একইরকম আচরণ আশা করতাম যখন কক্ষের সংখ্যা একই হয় (পর্যাপ্ত চেয়ে কম)। আবার ধন্যবাদ এবং একটি পুরানো পোস্ট আনার জন্য দুঃখিত!
টনি

4

উপরের কোনওটিই আমার পক্ষে কাজ করেনি, তাই যদি কারও ক্ষেত্রে একই সমস্যা থাকে।

আমি iOS7 এ একটি দলবদ্ধ টেবিল searchBarহিসাবে সেট করেছি tableHeaderView। ইন viewDidLoadআমার আছে tableView.contentOffset = CGPointMake(0, 44);রাখার searchBarপ্রাথমিকভাবে "লুকানো"। যখন ব্যবহারকারী স্ক্রল ডাউন ডাউন searchBarহয়

লক্ষ্য: বাতিল বোতামের ট্যাপে অনুসন্ধান বারটি লুকান

ভিতরে searchBarCancelButtonClicked(searchBar: UISearchBar!)

এটি কার্যকর হয়নি: [yourTableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] atScrollPosition:UITableViewScrollPositionTop animated:NO]; টেবিলভিউ খুব বেশি স্ক্রোল করছে, ফলস্বরূপ সারি 0 টি টুলবারের পিছনে চলে গেছে।

এটি কার্যকর হয়নি: tableView.ContentOffset = CGPointMake(0, 44) - কিছুই হয় না

এটি কার্যকর হয়নি: tableView.ContentOffset = CGPointMake(0, searchBar.frame.size.height) - কিছুই হয় না

এটি কাজ করে নি: tableView.setContentOffset(CGPointMake(0, 44), animated: true); আবার টেবিলভিউ খুব বেশি স্ক্রোল করছে, ফলস্বরূপ সারি 0 টি টুলবারের পিছনে চলে গেছে।

এটি আংশিকভাবে কাজ করেছে: tableView.setContentOffset(CGPointMake(0, 0) তবে titleForHeaderInSectionটুলবারের পিছনে ছিল

এই কাজ: tableView.setContentOffset(CGPointMake(0, -20)

যৌক্তিক বলে মনে হচ্ছে না তবে কেবল -20 এটিকে সঠিক অবস্থানে নিয়ে গেছে


আপনার পয়েন্টগুলি সত্যই হার্ড কোড করা উচিত নয়, আপনি কেন ব্যবহার করবেন না CGRectGetHeight(searchBar.bounds)?
জোরেয়ার

আমি অনুমান করি আপনি অবশ্যই এটি অবশ্যই ভিডডোড () / init () এ করছেন যেখানে অনুসন্ধান বারের উচ্চতা পাওয়ার জন্য কোনও ফ্রেম সেট করা হয়নি। আপনার সাথে চেষ্টা করা উচিতডিডিউলআউটসুবভিউগুলি ()
কাউশিল রুপারেলিয়া

যদি টেবিলভিউ লোডিং শেষ না করে, সমাধানগুলির কোনওটিই ContentOffsetকাজ করবে না
মাওর

4

সামগ্রী অফসেট হ'ল উপায়, তবে এটি সময়ের 100% কাজ করে না।

estimatedRowHeightকোনও নির্দিষ্ট সংখ্যায় সেট করা থাকলে এটি কাজ করে না । আমি এখনও কাজ প্রায় জানি না। আমি সমস্যাটি প্রকাশ করে একটি প্রকল্প তৈরি করেছি এবং আমি একটি রাডার তৈরি করেছি অ্যাপলের সাথে ।

আপনি কীভাবে সমস্ত সেট আপ করতে চান তাড়াতাড়ি উদাহরণ চাইলে প্রকল্পটি দেখুন।


4
ধন্যবাদ! এই আমি খুঁজছিলাম ছিল। আপনি যেতে হবে।
ব্যবহারকারী 2387149

3

নোট করুন যে টেবিলভিউতে কোনও ডেটা না থাকলে গৃহীত উত্তর ক্রাশ হবে। এবং এটি ডিডলয়েডে যুক্ত করা কিছু নির্দিষ্ট পরিস্থিতিতে কাজ নাও করতে পারে।

[yourTableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] atScrollPosition:UITableViewScrollPositionTop animated:NO]; // crashes if no rows/data

সুতরাং পরিবর্তে কোডের এই লাইনটি যুক্ত করুন:

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];

    [yourTableView setContentOffset:CGPointMake(0, self.searchDisplayController.searchBar.frame.size.height)];
}

2

সত্যিই, উত্তরের কোনও উত্তরই সত্যিই সমস্যাটি সমাধান করেনি (আমার জন্য) যদি আপনার টেবিল দর্শনে কোনও সারি না থাকে বা সারি উচ্চতা আলাদা হয় তবে এই উত্তরগুলি যথেষ্ট নয়।

একমাত্র যে কাজ করে:

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    self.tableView.contentOffset = (CGPoint){.y =  self.tableView.contentOffset.y + self.searchController.searchBar.frame.size.height};
}

অফসেট সমস্যার জন্য ভাল সমাধান। ইউআইএনএভিগেশন কন্ট্রোলার ব্যবহার করার সময় আমার পক্ষে কাজ করে।
Andreas Kraft

4
সমাধানটি কার্যকর হয় না যখন সারিগুলির সংখ্যা পুরো পর্দাটি কভার করে না - আপনি কি এইটির জন্য কোনও কার্যকারিতা জানতে পারবেন?
জোরেয়ার

নিশ্চিত নয় যে আমি এটি পুরোপুরি বুঝতে পেরেছি। আমার যখন টেবিলে কয়েকটি সারি থাকে তখন এটি আমার পক্ষে কাজ করে। তবে নিম্নলিখিত ব্যবহার করুন: self.tableView.tableFooterView = [[UIView alloc] initWithFrame:CGRectZero];
p0l আরিস

2

scrollToRowAtIndexPathযদি টেবিলে শূন্য সারি পদ্ধতি একটি ক্র্যাশ কারণ।

ইউআইটিএবলভিউ হ'ল কেবল একটি স্ক্রোল ভিউ, যাতে আপনি সহজেই অফসেট সামগ্রী পরিবর্তন করতে পারেন।

এটি আপনার টেবিলহাইডারভিউ হিসাবে আপনার কাছে কিছু আছে এবং এটি আড়াল করার জন্য আপনি স্ক্রোলগুলি ধরে নিয়েছেন তা পরীক্ষা করে

    if let searchHeight = tableView.tableHeaderView?.frame.height {
        tableView.setContentOffset(CGPoint.init(x: 0, y:searchHeight ), animated: false)
    }

1

আমি দেখতে পেয়েছি যে টেবিলভিউটি ফাঁকা থাকলে "নোটস" অ্যাপ্লিকেশন আইটেমগুলি সন্ধান করতে অক্ষম। সুতরাং আমি মনে করি এটি -(void)addSubview:(UIView *)viewপ্রথমে খালি টেবিল যুক্ত করতে ব্যবহার করছে। আপনি যখন তার আইটেম সোর্স অ্যারেতে কোনও আইটেম যুক্ত করবেন, এটি টেবিল ভিউ লোড করার জন্য কোডের অন্য পিস চালাবে।

সুতরাং আমার সমাধানটি হ'ল:

if([self.arrayList count] > 0)
{
     [self.tableView reloadData];     //use jdandrea's code to scroll view when cell==nil in cellForRowAtIndexPath
     self.tableView.scrollEnabled = YES;
}
else
{
     tableBlank = [[UITableView alloc]initWithFrame:CGRectMake(0,0,320,416) style:UITableViewStylePlain] autorelease];
     tableBlank.delegate = self;
     tableBlank.dataSource = self;
     [self.view addSubview:tableBlank];
}

আশাকরি এটা সাহায্য করবে :-)


1

টেবিলের সীমানা পরিবর্তন করুন, এটি ভিতরে করা যেতে পারে viewDidLoadপ্লাস আপনি টেবিলটি খালি আছে কিনা (ব্যতিক্রম এড়াতে) তা নিয়ে চিন্তা করতে হবে না।

CGRect newBounds = self.tableView.bounds;
newBounds.origin.y = newBounds.origin.y + self.searchBar.bounds.size.height;
self.tableView.bounds = newBounds;

ব্যবহারকারী একবার টেবিলটি স্ক্রোল করে নিলে অনুসন্ধান বারটি প্রদর্শিত হবে এবং স্বাভাবিকভাবে আচরণ করবে


1

এই প্রশ্নের অন্য উত্তরগুলি আমার পক্ষে মোটেও কার্যকর হয়নি, টেবিলভিউতে 0 টি সারি থাকায় বা পিতামাতার এবং নেস্টেড লাইন আইটেমগুলির মধ্যে পিছনে পিছনে যাওয়ার সময় স্ক্রোলের অবস্থানটি বিশৃঙ্খলাবদ্ধ করার সাথে অদ্ভুত আচরণ ছিল। এটি আমার পক্ষে কাজ করেছিল (লক্ষ্যটি যখন ইউআইএস সার্চবারটি লোড করার সময় লুকানো থাকে):

public override func viewWillAppear(animated: Bool) {        
    if self.tableView.contentOffset.y == 0 {
        self.tableView.contentOffset = CGPoint(x: 0.0, y: self.searchBar.frame.size.height) 
    }
}

ব্যাখ্যা
যে কোনো সময় tableViewদেখা যাবে, এই কোড চেক কিনা দেখতে UISearchBar দৃশ্যমান (অর্থাত yঅবস্থান contentOffset, ওরফে স্ক্রল অবস্থান, হয় 0)। যদি এটি হয় তবে এটি সন্ধান বারের উচ্চতাটি কেবল স্ক্রোল করে। যদি সার্চবারটি দৃশ্যমান না হয় (এর মধ্যে আইটেমগুলির একটি বৃহত তালিকা মনে করুন tableView), তবে এটি চেষ্টা করে স্ক্রোল করবে না tableView, কারণ আপনি কোনও নেস্টেড লাইন আইটেমটি থেকে ফিরে এসে পজিশনিংগুলিকে গোলমাল করবেন।

পার্শ্ব দ্রষ্টব্য
আমি একক দায়িত্ব নিশ্চিত করতে এবং আপনার কোডটিতে যে কোনও সময় এটি কল করার পুনঃব্যবহারের জন্য একটি পৃথক পদ্ধতিতে এই কোডটি রাখার পরামর্শ দেব।


1

যদি আপনার টেবিলটিতে সর্বদা কমপক্ষে একটি সারি থাকে তবে কেবল সারণির প্রথম সারিতে স্ক্রোল করুন এবং অনুসন্ধান বারটি স্বয়ংক্রিয়ভাবে লুকানো থাকবে।

let firstIndexPath = NSIndexPath(forRow: 0, inSection: 0)

স্ব.ট্যাটিভিউ.সিলিটরোউএটিএন্ডেক্সপথ (ফার্স্ট ইন্ডেক্সপথ, অ্যানিমেটেড: ভুয়া, স্ক্রোলপজিশন:। শীর্ষস্থানীয়)

যদি আপনি উপরের কোডটি ভিডডিডোডে রাখেন তবে এটি একটি ত্রুটি ছুঁড়ে দেবে কারণ টেবিলভিউ এখনও লোড হয়নি, সুতরাং আপনাকে এটিকে ভিউডিডঅ্যাপারে রাখতে হবে কারণ এই মুহুর্তে টেবিলভিউ ইতিমধ্যে লোড হয়ে গেছে।

আপনি যদি এটিকে ভিডডআইপিয়ারে রাখেন , প্রতিবার আপনি টেবিলভিউ খুলুন এটি শীর্ষে স্ক্রোল করবে।

যদি আপনি টেবিলভিউটি উন্মুক্ত থাকে, যেমন এটি কোনও ইউআইটিববার ভিউ কন্ট্রোলার বা আপনি যখন কোনও সিগ করেন এবং তারপরে ফিরে আসেন তবে আপনি এই আচরণটি চান না Maybe আপনি যদি এটি প্রাথমিক লোডের উপরে শীর্ষে স্ক্রোল করতে চান তবে এটি প্রাথমিক লোড কিনা তা পরীক্ষা করতে আপনি একটি পরিবর্তনশীল তৈরি করতে পারেন যাতে এটি একবারে শীর্ষে স্ক্রোল করে।

ভিউ কন্ট্রোলার ক্লাসে প্রথমে isInitialLoad নামক একটি ভেরিয়েবল সংজ্ঞায়িত করুন এবং এটি "সত্য" এর সমান সেট করুন:

var isInitialLoad = true

তারপরে আইডিআইটিএলএডটি ভিডিডআইপিয়ারে সত্য কিনা তা পরীক্ষা করে দেখুন এবং এটি সত্য হলে শীর্ষে স্ক্রোল করুন এবং আইসনিটাললয়েড ভেরিয়েবলটি মিথ্যাতে সেট করুন:

if isInitialLoad {
            let firstIndexPath = NSIndexPath(forRow: 0, inSection: 0)
            self.tableView.selectRowAtIndexPath(firstIndexPath, animated: false, scrollPosition: .Top)

            isInitialLoad = false
        }

1

নীচের কোডটি আমার জন্য কাজ করছে

self.tableView.contentOffset = CGPointMake(0.0, 44.0);

1

আমি সামগ্রীটি অফসেট এবং স্ক্রোলটো ইন্ডেক্সপথ সেট করার চেষ্টা করেছি তবে কিছুই সন্তোষজনকভাবে কাজ করে নি। আমি ViewDidLoad থেকে সারণীবার হিসাবে টেবিলহাইডারভিউয়ের সেটিংটি সরিয়েছি এবং এটি নীচের মত স্ক্রোলভিউ প্রতিনিধিতে সেট করেছি

override func scrollViewWillBeginDragging(scrollView: UIScrollView) {
    if scrollView.contentOffset.y < 0 && tableView.tableHeaderView == nil {
        tableView.tableHeaderView = searchController.searchBar
        tableView.setContentOffset(CGPointMake(0, scrollView.contentOffset.y + searchController.searchBar.frame.size.height), animated: false)
    }
}

এটি একটি কবজির মতো কাজ করেছে content সামগ্রীর অফসেট সেটিংটি মসৃণ স্ক্রোলিংয়ের উদ্দেশ্যে


0

বিবেচনা করে স্ট্যাটাস বার এবং নেভিগেশন বার নিতে ভুলবেন না । আমার সারণী দর্শন নিয়ামকটি নেভিগেশন নিয়ামকটিতে এম্বেড করা হয়েছে viewDidAppear:

tableView.contentOffset = CGPointMake(0, -20) // -20 = 44 (search bar height) - 20 (status bar height) - 44 (navigation bar height)

আমার জন্য কাজ।


0

সুইফ্টের জন্য:

কেবল টেবিলভিউ সামগ্রীটি অফসেট করুন, যা অনুসন্ধানবারের উচ্চতার মতো হওয়া উচিত।

self.tableView.contentOffset = CGPointMake(0, self.searchController.searchBar.frame.size.height)

0

সুইফট 3

খালি টেবিলের সাথেও কাজ করে!

আমার পরিবেশে আমি কাস্টম সেলগুলি xib ফাইল দ্বারা লোড করি এবং সারিটি হাইট স্বয়ংক্রিয় সেট।

    override func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
        self.tableView.contentOffset = CGPoint(x: 0, y: self.tableView.contentOffset.y + self.searchController.searchBar.bounds.height)
}

0

আমারও একই সমস্যা ছিল এবং এই সমস্যাটি সমাধান করার একমাত্র উপায় হ'ল ইউআইটিএবলভিউ কনটেন্টঅফসেট সম্পত্তিতে মূল মান পর্যবেক্ষক ব্যবহার করা।

কিছু ডিবাগিংয়ের পরে আমি বুঝতে পারি যে টেবিল ভিউ সামগ্রীর আকার টেবিলভিউয়ের চেয়ে ছোট হলে ঠিক সমস্যাটি উপস্থিত হয়। ভিউ উইলঅ্যাপায় থাকাকালীন আমি কেভিও শুরু করি। এবং ভিউ উপস্থিত হওয়ার পরে কেভিও ০.০ সেকেন্ড পরে স্টপ প্রেরণ করুন। প্রতিবার কন্টেন্টঅফসেট 0.0 হয়ে গেলে কেভিও প্রতিক্রিয়া জানায় এবং অনুসন্ধান বারের উচ্চতায় কনটেন্টঅফসেট সেট করে। আমি ০.০ সেকেন্ডের পরে কেভিও অ্যাসিক্রোনাসকে থামিয়ে দেব কারণ ভিউ উপস্থিত হওয়ার পরেও ভিউ লেআউটটি সামগ্রী পুনরায় সেট করবে।

- (void)viewWillAppear:(BOOL)animated {
  [super viewWillAppear:animated];
  [self.tableView addObserver:self forKeyPath:@"contentOffset" options:NSKeyValueObservingOptionNew context:nil];
}

-(void)viewDidAppear:(BOOL)animated{
   __weak typeof (self) weakSelf = self;
   dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(.3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
    [weakSelf.tableView removeObserver:self forKeyPath:@"contentOffset"];});
}

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{
    if ([keyPath isEqualToString:@"contentOffset"] && self.tableView.contentOffset.y == 0.0) {
       self.tableView.contentOffset = CGPointMake(0, CGRectGetHeight(self.tableView.tableHeaderView.frame));
    }
}

-(void)dealloc {
    [self.tableView removeObserver:self forKeyPath:@"contentOffset"];
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.