2016-06-19 12 views
9

Uygulamamı Swift 2.3 ve Xcode 8 Beta 1 ile iOS10'a güncellemenin sürdüğü süreçte ve UITableViewHeaderFooterContentView adresinde UIButton'a geçişi engelleyen bir UITableViewHeaderFooterContentView var. UITableViewHeaderFooterView alt sınıfı.iOS10 - ContentView Engelleme UITableView Başlığında UIButton Dokunuşları

Xcode 8 Beta 1 simülatöründe, UIButton iOS9.3 üzerinde çalışır, ancak iOS10 değil.

1) Bunun için herhangi bir belge var mı?

2) Kullanıcı arabirim öğelerinin iOS10'daki yeni İçerik Görünümü'nün üstünde olmasını nasıl sağlayabilirim? (ya da UITableHeaderFooterContentView aracılığıyla dokunmalarına izin ver)

Teşekkürler!

Debug View Hierarchy of iOS9.3 and iOS10

TableHeader.xib

Tablo Başlığı

import UIKit 

class TableHeader: UITableViewHeaderFooterView { 

    @IBOutlet weak var dayLabel: UILabel! 

    @IBOutlet weak var dateLabel: UILabel! 

    @IBOutlet weak var addNewEventButton: UIButton! 

} 

Kod görünümündeki Kontrolör dateCell.addNewEventButton artık

iOS10 içinde dokunuşları alıyor UIButton olduğunu
func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { 


    let tintColor = TintManager().getTintColour() 

    let dateCell:TableHeader = tableView.dequeueReusableHeaderFooterViewWithIdentifier("TableHeader") as! TableHeader 

    //dateCell.bringSubviewToFront(dateCell.addNewEventButton) 

    dateCell.dayLabel.text = Dates.day.uppercaseString 

    dateCell.dateLabel.text = Dates.date 

     dateCell.backgroundView = UIView(frame: dateCell.frame) 
     dateCell.backgroundView!.backgroundColor = tintColor 
     dateCell.dayLabel.textColor = UIColor.whiteColor() 
     dateCell.dateLabel.textColor = UIColor.whiteColor() 
     dateCell.addNewEventButton.backgroundColor = tintColor 



    dateCell.addNewEventButton.tag = section 
    dateCell.addNewEventButton.layer.cornerRadius = 20.0 

    if (savedEventView.superview === self.view) { 
     dateCell.addNewEventButton.removeTarget(nil, action: nil, forControlEvents: .AllEvents) 
     dateCell.addNewEventButton.addTarget(self, action: #selector(ViewController.userPressedAddButtonToInsertSavedEvent(_:)), forControlEvents:.TouchUpInside) 
    } else { 
     dateCell.addNewEventButton.removeTarget(nil, action: nil, forControlEvents: .AllEvents) 
     dateCell.addNewEventButton.addTarget(self, action: #selector(ViewController.userPressedAddNewEventOnTableViewHeader(_:)), forControlEvents:.TouchUpInside) 
    } 

    return dateCell 
} 
+0

Xcode tanıtmak 3.0 hızlı düşünmek .Ben göç belgede geçmesi Lütfen 8 beta 1 – Tuple

+0

O Swift 2.3 hala Xcode uyumludur 8 Beta 1 –

+0

Evet tabii anlayışınız – Tuple

cevap

4

Hatalı görünüm aslında UITableViewHeaderFooterView'un contentView'udur (bkz. Apple Docs). Bu yüzden, dokunmalara müdahale etmeyi durdurmak için sadece sendSubview(toBack:)'u kullanabilmeniz gerekir. Bununla birlikte, iOS9 sürümünde UITableViewHeaderFooterView görüntülemenin bir NIB'den yüklenmesi durumunda contentView doğru şekilde başlatılamıyor gibi görünüyor. contentView özelliği isteğe bağlı olmasa da, aslında geçersizdir ve erişmeye çalıştığınızda bir BAD ACCESS hatası alırsınız. Salt okunur bir özellik (*) olduğu için contentView (kodda veya IB'de çıkış olarak) için bir değer ayarlayamazsınız. Bu yüzden düşünebildiğim tek çözüm, iOS 10 veya daha yeni bir sürümde çalışıyorsanız, ContentView öğesini arkaya taşıyacak kodu içermek için #available'u kullanmaktır. Ben senin alt sınıf içine alakalı kodunu koyardı:

override func awakeFromNib() { 
    if #available(iOS 10, *) { 
     self.sendSubview(toBack: contentView) 
    } 
} 

(*) vahşi spekülasyon düşkünlük, benim tahminim, Apple UITableViewCell ağır UITableViewHeaderFooterView kod tabanlı olmasıdır. IB, nesne kütüphanesinde UITableViewCells'a sahip olduğundan (ve bunların hücrenin contentView'u içerdiğine dikkat edin), hücrenin içeriğinin doğru bir şekilde örneklendiğinden emin olabilirsiniz. Ancak nesne kitaplığında UITableViewHeaderFooterView olmadığı için, contentView doğru şekilde yüklenemedi. IOS10'da boş bir contentView örneği oluşturarak düzeltildi. Yazık onlar da kütüphaneye UITableViewHeaderFooterView eklemedi.

+0

doğru kullanıyorum hiçbir sorun vardı benim anlayış var senin iOS9 ile kod. - (UIView *) tableView: Böyle bir şey (UITableView *) tableView viewForHeaderInSection: (NSInteger) headerIndex { ... NSArray * Uç = [[NSBundle mainBundle] loadNibNamed ... ... [headerView sendSubviewToBack: [headerView contentView]]; ... } – Darko

+0

@Darko İlginç. Ben nib kaydettim ve sonra dequeued eğer sorun oluştu; Uçu doğrudan yüklemeyi denemedim. Fakat her ikisi de saldırgan 'init (kodlayıcı:)' başlatıcısını kullanmalıdır, bu yüzden belki biraz daha araştırmam gerekiyor. Ya da Nesne-C'ye, nil değerlerin daha toleranslı olması ile bağlantılı olabilir. – pbasdf

+0

Mümkün. IOS 9 ile test ettim ve işe yarıyor ama sadece güvenli tarafta olmanın yanı sıra bu kodu kullanmadan önce iOS versiyonunu kontrol ediyorum, acımadı :) – Darko