Otomatik Tercih Edilen Maksimum Düzen Genişliği, 8.0'dan önceki iOS sürümlerinde mevcut değildir


322

Xcode6 beta6 ile mevcut bir iOS projesini açtım ve Xcode, hem Storyboard hem de Xib dosyaları için aşağıdaki uyarıyı listeler:

Otomatik Tercih Edilen Maksimum Düzen Genişliği, 8.0'dan önceki iOS sürümlerinde mevcut değildir

Genişliği aşağıdaki gibi açık ayarlayarak uyarıyı adreslemeye çalıştım:

Ancak bu uyarıları çözmedi. Nasıl çıkarılabilirler?


3
XCode 6.1 kullanıyorum ve tüm etiketleri Preferred Width = Explicit güncelledi. Bu benim için sorunu çözdü.
Ocak

Yanıtlar:


373

Güncelleme 3: Dağıtım hedefiniz 7.1'e ayarlanmışsa,
bu uyarı numberOfLines1 dışında herhangi bir şeye ayarlanmış etiketler tarafından da tetiklenebilir . Bu, yeni tek görünümlü projeyle tamamen tekrarlanabilir.

Yeniden Oluşturma Adımları:

  1. Yeni bir tek görünüm, objektif-c projesi oluşturun
  2. Dağıtım Hedefini 7.1 olarak ayarlayın
  3. Projenin film şeridini aç
  4. Verilen görünüm denetleyicisine bir etiket bırakın
  5. Bu etiket için numberOfLines değerini 2 olarak ayarlayın.
  6. derleme

Aşağıdaki radarı hazırladım:
rdar: // problem / 18700567

Güncelleme 2:
Maalesef bu, Xcode 6'nın yayın sürümünde tekrar bir şeydir. Başına Charles A. aşağıdaki yorum:

Bu uyarıyı yanlışlıkla kolayca tanıtabileceğinizi belirtmek gerekir ve uyarının kendisi, suçlu olan etiketi bulmaya yardımcı olmaz. Bu karmaşık bir hikaye tahtasında talihsiz bir durumdur. Film şeridini bir kaynak dosyası olarak açabilir ve <label(?!.*preferredMaxLayoutWidth)tercih edilen bir MaxLayoutWidth niteliğini / değerini atlayan etiketleri bulmak için normal ifadeyle arama yapabilirsiniz . Bu tür satırlara preferMaxLayoutWidth = "0" eklerseniz, müstehcen olarak işaretlemek ve 0 değerini ayarlamakla aynıdır.

Güncelleme 1:
Bu hata şimdi Xcode 6 GM'de düzeltildi.

Orijinal Yanıt
Bu, Xcode6-Beta6 ve XCode6-Beta7'deki bir hatadır ve şimdilik güvenle göz ardı edilebilir.

Elma Geliştirici forumlarda Bir Apple mühendisi vardı bu hata hakkında söylenecek:

Tercih edilen maksimum düzen genişliği, içeriğine uyacak şekilde otomatik olarak dikey olarak büyümesini sağlayan UILabel'da bir otomatik düzen özelliğidir. 6.0'dan önceki Xcode sürümleri, çok satırlı etiketler için tasarım sırasında geçerli sınır boyutuna tercih edilen MaxLayoutWidth değerini ayarlayacaktır. Yatay mizanpajınız değiştiyse, tercih edilenMaxLayoutWidth öğesini çalışma zamanında manuel olarak güncellemeniz gerekir.

iOS 8, çalışma zamanında tercih edilen MaxLayoutWidth öğesinin otomatik olarak hesaplanması için destek ekledi ve bu da çok satırlı etiket oluşturmayı daha da kolay hale getirdi. Bu ayar iOS 7 ile geriye doğru uyumlu değildir. Hem iOS 7 hem de iOS 8'i desteklemek için Xcode 6, boyut denetçisinde tercih edilen MaxLayoutWidth için "Otomatik" veya "Açık" seçmenizi sağlar. Malısın:

En iyi deneyim için iOS 8'i hedefliyorsanız "Otomatik" i seçin. <İOS 8'i hedefliyorsanız "Açık" ı seçin. Ardından, ayarlamak istediğiniz tercih edilen MaxLayoutWidth değerini girebilirsiniz. "Açık" seçeneği etkinleştirildiğinde, kutuyu işaretlediğiniz sırada geçerli sınır boyutu varsayılan olarak belirlenir.

(1) otomatik düzeni kullanıyorsanız, (2) çok satırlı bir etiket için "Otomatik" ayarlanmışsa [bunu etiketin boyut denetçisinde kontrol edebilirsiniz] ve (3) dağıtım hedefiniz <iOS 8.

Hata, bu uyarının otomatik olmayan belgeler için göründüğü anlaşılıyor. Bu uyarıyı görüyorsanız ve otomatik düzen kullanmıyorsanız uyarıyı yoksayabilirsiniz.

Alternatif olarak, film şeridindeki dosya denetçisini veya söz konusu xib'i kullanarak sorunu çözebilir ve "Şunun için derlemeler" i "iOS 8.0 ve Üstü için Yapılar" olarak değiştirebilirsiniz. Xcode dosya denetçisi


15
Bu uyarıyı yanlışlıkla kolayca tanıtabileceğinizi belirtmek gerekir ve uyarının kendisi, suçlu olan etiketi bulmaya yardımcı olmaz. Bu karmaşık bir hikaye tahtasında talihsiz bir durumdur. Film şeridini bir kaynak dosyası olarak açabilir ve <label(?!.*preferredMaxLayoutWidth)bir preferredMaxLayoutWidthniteliği / değeri atlayan etiketleri bulmak için normal ifadeyle arama yapabilirsiniz . Bu preferredMaxLayoutWidth="0"tür satırlara eklerseniz, müstehcen işaretleme ve değeri ayarlama ile aynıdır 0.
Charles A.

6
UILabel'i, tercih edilenMaxLayoutWidth değerini otomatik olarak alt sınıflamadan veya layoutSubviews içinde bir yere uygulamadan otomatik olarak ayarlayacak şekilde yapılandırmanın herhangi bir yolu var mı? Bu, IB'nin etkinleştirebileceği bir davranışsa, ayarlanabilecek bir özellik veya büyü değeri olduğunu gösterir. Ancak API belgelerindeki veya başlıklarındaki hiçbir şey bunu söylemez.
algal

2
@CharlesA. Boş bir proje ile test yapıyorum ve bu uyarıyı tetikleyecek başka bir etiket niteliği buldum: numberOfLines1'den başka bir şeye ayarlandıysa, ayarlayıp ayarlamadığınıza bakılmaksızın uyarı gerçekleşir preferredMaxLayoutWidth.
hatıralar

2
@ MichaelG.Emmons Garip, bunu temiz bir proje ve 7.1 olarak ayarlanmış bir dağıtım hedefi ile çoğaltamıyorum. Ben preferredMaxLayoutWidthaçık bir 0 olarak ayarladıktan sonra numberOfLinesdeğeri ne olursa olsun uyarı gider . Ama belki de bu sabah Xcode güncellemesinde düzeltildi?
Charles A.

2
Yani ... satır sayısını 1 olarak ayarlamak ve koddan değiştirmek için tek çözüm? bu profesyonel görünmüyor
jomafer

315

Sorunlu etiketleri geniş bir film şeridinde bulmak için aşağıdaki adımlarımı uygulayın.

  1. XCode'un Sorun Gezgini'nde hatayı sağ tıklayın ve "Günlükte Göster" i seçin. (Not: @Sam aşağıda önermektedir, xCode'a bakın rapor gezginine bakın . Ayrıca @Rivera, "Xcode 6.1.1'den itibaren uyarıya tıklamak otomatik olarak açılacak ve çakışan etiketi vurgulayacaktır" yorumlarına dikkat çekiyor. Bunu test etmedim ).

resim açıklamasını buraya girin

  1. Bu, film şeridi dosyanızın sonunda bir kodla ilgili hatayı gösterecektir. Değeri .storyboard'dan sonra kopyalayın

resim açıklamasını buraya girin

  1. Ardından, film şeridinizi kaynak dosya olarak gösterin. resim açıklamasını buraya girin

  2. Arama. İçeriğe bakarak buradan hangi etiketin olduğunu kolayca anlayabilmelisiniz. resim açıklamasını buraya girin

Etiketi bulduğunuzda benim için çalışan çözüm "tercih edilen genişliği" 0'a ayarlamaktı.

resim açıklamasını buraya girin

BTW, öğeyi seçip tanımlayıcı denetçisinin altına bakarak her zaman hızlı bir şekilde bir arabirim öğesinin kimliğini alabilirsiniz. Çok kullanışlı.

resim açıklamasını buraya girin


36
Bu kabul edilen cevap olmalı! Bu aslında sorunu çözer. Storyboard'da normal olarak görünmeyen diğer sorunları bulmanıza bile yardımcı olur. Bir şey: Rapor Gezgini'nin "Günlükte Göster" i sağ tıklatmaktan çok daha güvenilir olduğunu düşünüyorum
Sam Spencer

1
Bu cevabı seviyorum, çok basit ve uyarıyı düzeltti. Çok teşekkürler!
Ethan Parker

1
Thank u soooo muchhhhhh :)
SR Nayak

2
Neden arabirim oluşturucuda gösterilen genişlik yerine tercih edilen genişliği sıfıra ayarlıyorsunuz?
Biclops

9
Müthiş cevap! Nesne kimliğini doğrudan Storyboard'un IB görünümünden arayabilirsiniz. Sadece bir Ctrl-f yapın. Kaynak kodu olarak açmaya gerek yoktur ve daha sonra tercih edilen genişliği değiştirmek için IB görünümüne geri dönmek zorunda kalırsınız.
AndroidDev

36

Film şeridini kaynak olarak açmadan bu sorunu çözebilirsiniz . Bu uyarı, numberOfLines! = 1 ise ve dağıtım hedefi <8.0 ise UILabels tarafından tetiklenir.

NASIL BULUNUR?

  1. Sorun Gezgini'ne (CMD + 8) gidin ve uyarı ile oluşturulmuş en son sürümü seçin resim açıklamasını buraya girin
  2. Uyarıları bulun ( " Otomatik Tercih Edilen Maksimum Düzen " i arayın ) ve sağdaki genişlet düğmesine basın
    resim açıklamasını buraya girin
  3. UILabel'ın Nesne Kimliğini Bulmaresim açıklamasını buraya girin
  4. Film şeridini açın ve ARAMA nesne için (CMD + f). Bu olacak SEÇ VE HIGHLIGHT UILabel
  5. Tercih Edilen Genişliği Ayarla = 0 Diğerlerinin önerdiği gibi "Açık"

23

Çözüm oldukça basit

İOS 8 ve Üstü için Builds'ı etkinleştirmeniz yeterlidir

resim açıklamasını buraya girin


oldukça basit ve yıkıcı.
İOS

6
@aryaxt Yanlış olduğunu söylediğim için üzgünüm. Proje ayarlarında dağıtım hedefini iOS 7 veya daha düşük bir değere ayarlayabilir ve IB Belgelerindeki Yapıları iOS 8 ve sonraki sürümleri olarak değiştirebilirsiniz; bu, iOS 7'de çalışır. Buradan kontrol edebilirsiniz developer.apple.com/library/ios/recipes/…
Alejandro Luengo

1
Her zaman olduğu gibi en iyi cevap kabul edilen değil ... :) Şerefe!
HepaKKes

İOS9.3 ve sonraki sürümler için GÜNCELLEME: iOS7 cihazları artık yukarıdaki ayarlarla film şeridi oluşturmuyor. Bu, 9.3 güncellemesinden önce çalışırdı. Apple, yayın öncesi otomatik süreçlerinde bir şey değiştirmiş gibi görünüyor.
pechar

4

Şimdi Xcode sürümüm 6.1. Ama bu uyarıyı da aldım. bu beni çok kızdırıyor. Aramadan sonra tekrar tekrar ve çözümü buldum.

Sebep: Storyboard'da UILabel Lines> 1 ayarlamış olmalısınız.

Çözüm: UILabel Lines özniteliğinizi Storyboard'da 1 olarak ayarlayın. Xcode'unuzu yeniden başlatın. Benim için çalışıyor, umarım daha fazla insana yardımcı olabilir.

Gerçekten kelimelerinizi 1 satırdan fazla göstermeniz gerekiyorsa. kodda yapmalısınız.

//the words will show in UILabel
NSString *testString = @"Today I wanna set the line to multiple lines. bla bla ......  Today I wanna set the line to multiple lines. bla bla ......"
[self.UserNameLabel setNumberOfLines:0];
self.UserNameLabel.lineBreakMode = NSLineBreakByWordWrapping;
UIFont *font = [UIFont systemFontOfSize:12];
//Here I set the Label max width to 200, height to 60
CGSize size = CGSizeMake(200, 60);
CGRect labelRect = [testString boundingRectWithSize:size options:NSStringDrawingUsesLineFragmentOrigin attributes:[NSDictionary dictionaryWithObject:font forKey:NSFontAttributeName] context:nil];
self.UserNameLabel.frame = CGRectMake(self.UserNameLabel.frame.origin.x, self.UserNameLabel.frame.origin.y, labelRect.size.width, labelRect.size.height);
self.UserNameLabel.text = testString;

3
"Eğer kelimelerinizi gerçekten 1 satırdan fazla göstermeniz gerekiyorsa bunu kodda yapmalısınız." Bu bir trol, değil mi?
webstersx

@webstersx bence ciddi
Jasper

4

Özetlemek gerekirse, benim için yukarıdaki iki talimatı takip ederek numberOfLines = 0 ila 1 veya daha büyük olan herhangi bir örneği değiştirmek ve film şeridi kaynağındaki bir etiketin her örneğine manuel olarak preferMaxLayoutWidth = "0" eklemek tüm uyarılarımı düzeltti.


Dostum sen bir sihirbazsın! Beklendiği gibi bir UIScrollerView ile bile çalışır. Şimdiye kadar EN İYİ ÇÖZÜM çünkü Nib'in konuşlandırılmasının hedefini iOS7.0'da bırakabildim
Yaro

3

Ben 50 bir üne sahip olmadığı için Stackoverflow ikinci en iyi cevap bana yorum izin vermeyeceğim. Storyboard'da suçlu etiketini bulmak için başka bir numara buldum.

Etiketin kimliğini öğrendikten sonra, film şeridinizi görünüm denetleyicileri görüntülenen ayrı bir sekmede açın ve sadece F komutunu ve V komutunu yapın ve sizi doğrudan o etikete götürür :)


Projede etiket kimliği aramak istiyorsunuz.
Borzh

2

W / H seçiminde vardı orijinal düzeni seçerek çalıştım. Film şeridi beklendiği gibi çalışıyor ve hata gitti.

Ayrıca iOS 8.0 için geliştirdiğinizden emin olun. Projenin genel ayarlarından kontrol edin.

Burası basmanız gereken yer.


1

Ben bu sorunu vardı ve bir etiket için max belirlemek için kısıtlamalar ekleyerek düzeltmek mümkün.

Çok satırlı bir etiketi bırakırken, üst görünümün içindeki genişliği zorlamak için ayarlanmış bir kısıtlama yoktur. Yeni PreferredMaxWidth devreye giriyor. İOS 7 ve önceki sürümlerde maksimum genişliği kendiniz tanımlamanız gerekir. Etiketin sol ve sağ tarafına 10 piksellik bir kısıtlama ekledim.

Sorunu da gideren bir <= genişlik kısıtlaması da ekleyebilirsiniz.

Yani bu aslında bir hata değil, sadece maksimum genişliği kendiniz tanımlamanız gerekiyor. Diğer yanıtta belirtilen açık seçenek de bu genişlik değerini ayarlarken çalışacaktır, ancak maksimum genişliğin üst genişliğe göre (açıkça genişliği ayarladığınız gibi) değişmesini istiyorsanız bu değeri değiştirmeniz gerekecektir.

Yukarıdaki çözümüm, üst görünüm ne kadar büyük olursa olsun genişliğin her zaman korunmasını sağlar.


1

Bazı nedenlerden dolayı, iOS Dağıtım Hedefi'ni 8.0 veya daha yüksek bir değere değiştirseniz bile, Xib dosyaları bu değişikliği kabul etmez ve Dosya denetçisinde önceki ayarlarla kalır

İOS Dağıtım hedefini değiştirdikten sonra Xib'deki dosya denetçisi

Bu nedenle, her Xib için manuel olarak değiştirmelisiniz Manuel değişiklikten sonra

Bir kez bittiğinde, uyarı kaybolacaktır :-)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.