2016-12-04 56 views
1

我試圖把導航欄中的集合視圖,如在iMessage組聊天中看到的,所有成員都在導航欄中的圓圈中有他們的首字母縮寫。如何把iMessage羣組聊天中的導航欄中的集合視圖

我在SO上發現了一個答案here,我盡了最大努力將它轉換爲iOS10/Swift 3,但收集視圖單元格沒有正確顯示在導航欄中。這裏是我的代碼:

import UIKit 


weak var collectionView: UICollectionView? 

class ChatController: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource { 

override func viewDidLoad() { 
    super.viewDidLoad() 

    let layout = UICollectionViewFlowLayout() 
    let collectionView = UICollectionView(frame: CGRect(x: CGFloat(0), y: CGFloat(0), width: CGFloat(300), height: CGFloat(80)), collectionViewLayout: layout) 
    collectionView.backgroundColor = UIColor.clear 
    navigationItem.titleView? = collectionView 
    collectionView.register(UICollectionViewCell.self, forCellWithReuseIdentifier: "cell") 
    collectionView.delegate? = self 
    collectionView.dataSource? = self 
    view.addSubview(collectionView) 
    collectionView.reloadData() 
} 


func numberOfSections(in collectionView: UICollectionView) -> Int { 
    return 1 
} 

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { 
    return 5 
} 

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 
    let cell = (collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath)) 
    cell.backgroundColor = UIColor.orange 
    cell.layer.cornerRadius = 24 
    return cell 
} 

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { 
    return CGSize(width: CGFloat(50), height: CGFloat(50)) 
} 

} 

和導航欄類:

import Foundation 
import UIKit 



class NavigationBar: UINavigationBar { 

var chatController: ChatController? 

override func sizeThatFits(_ size: CGSize) -> CGSize { 
    return CGSize(width: CGFloat(self.superview!.bounds.size.width), height: CGFloat(80)) 
} 

func setFrame(frame: CGRect) { 
    var f = frame 
    f.size.height = 80 
    super.frame = f 
} 


} 

它看起來像集合視圖細胞被顯示出來,但他們的導航欄,而不是在它裏面下方(見下文圖片)。如果我隱藏導航欄,單元格將轉到視圖的頂部,但我希望在導航欄中包含它們。

enter image description here

下面是在應用程序委託我的UI代碼,不知道我在做一個新手的錯誤在這裏:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { 
    // Override point for customization after application launch. 

    window = UIWindow(frame: UIScreen.main.bounds) 
    window?.makeKeyAndVisible() 
    window?.rootViewController = UINavigationController(rootViewController: ChatController()) 

    return true 
} 

我這樣做編程方式(沒有故事板)。任何人都可以看到我要去哪裏嗎?

+0

調用'view.addSubview(collectionView)collectionView.reloadData()'作爲'viewDidLoad'中最後一次調用。將代碼發佈到添加導航條的地方。 – shallowThought

+0

謝謝,我忘了添加子視圖..不幸的是,它並沒有解決它!仍然只是一個普通的視圖控制器/導航欄。 – KingTim

+0

顯示如何添加ChatController。 – shallowThought

回答

0

這是我提出的解決方案

Apple

If you want to display custom views in the navigation bar, you must wrap those views inside a UIBarButtonItem object before adding them to the navigation item.

For information about how navigation items work together with a navigation controller, custom view controllers, and the navigation bar to display their content, see View Controller Programming Guide for iOS .

weak var collectionView: UICollectionView? 
override func viewDidLoad() { 
    super.viewDidLoad() 
    let navigationitem = UINavigationItem(title: "") //creates a new item with no title 
    navigationitem.titleView = collectionView //your collectionview here to display as a view instead of the title that is usually there 
    self.navigationController?.navigationBar.items = [navigationitem] //adds the navigation item to the navigationbar 
} 

從文檔,我相信這應該工作。請記住讓您的收藏集查看單元格足夠小以適合導航欄。讓我知道如果它不起作用,也許我明天可以解決一些問題。

+0

這真的很有趣,我沒有意識到你必須把視圖包裝在一個酒吧按鈕項中,我會做更多的閱讀......有趣的是,因爲我在OP中引用的例子(在ob上的另一個答案obj- c)沒有那樣做就很好。我嘗試了你的代碼,不幸的是得到了一個崩潰,這裏的錯誤:***終止應用程序,由於未捕獲的異常'NSInternalInconsistencyException',原因:'不能在控制器管理的UINavigationBar上直接調用setItems:animated:'。 – KingTim

+0

谷歌的錯誤,你會立即找到解決方案。 –

+0

你能分享哪個結果爲你工作嗎?我搜索了錯誤,並在結果的第一頁上嘗試瞭解決方案,問題仍然存在。 – KingTim