Vraag Laat lettertype groeien samen met UILabel (verkleind door Auto Layout) - hoe doe je dat in Interface Builder?


In een eenvoudige iPhone-app Ik toon een lettertegel (aangepast) UIView met een afbeelding en 2 labels) met de volgende code in viewDidLoad:

app screenshot

DraggedTile *tile = [[[NSBundle mainBundle] loadNibNamed:@"DraggedTile"
                                                   owner:self
                                                 options:nil] firstObject];
tile.frame = CGRectMake(10 + arc4random_uniform(100),
                        10 + arc4random_uniform(100),
                        kWidth,
                        kHeight);
[self.view addSubview:tile];

Dit werkt goed, maar ik zou graag de lettertegel laten groeien - als ik grotere breedte- en hoogteparameters toevoeg aan de CGRectMake.

Dus in Xcode 5.1 Interface Builder open ik de DraggedTile.xib en schakel "Auto Layout" in.

Dan voor de image en letter Ik voeg beperkingen toe aan de linker-, boven-, rechter- en onderranden van het bovenliggende element.

Voor de letter label Ik heb ook "Lijnen" ingesteld op 0 en "Inhoudscompressie Weerstand Prioriteit" op 1000 (hier volledig scherm 1 en volledig scherm 2):

Xcode screenshot

Xcode screenshot

Vervolgens pas ik de code aan om een ​​grotere breedte en hoogte te gebruiken:

tile.frame = CGRectMake(10 + arc4random_uniform(100),
                        10 + arc4random_uniform(100),
                        2 * kWidth,
                        2 * kHeight);

Hier is het resultaat:

app screenshot

Zowel de achtergrond image en de letter label lijkt te zijn gegroeid zoals bedoeld.

De lettergrootte van het label is echter niet gegroeid.

Ik heb rond gezocht en ik denk dat ik zoiets nodig heb tile.letter.adjustsFontSizeToFitWidth = YES. Maar tegelijkertijd kan ik het niet gebruiken met "Auto Layout" op ...

Dus mijn vraag is als er een optie in de "Interface Builder" beschikbaar is om ook de lettertypegrootte te laten groeien?

BIJWERKEN:

Ik heb de suggestie van ismailgulek geprobeerd om de lettergrootte in te stellen op 200 in Interface Builder en in de code  tile.letter.adjustsFontSizeToFitWidth = YES en het ziet er veelbelovend uit (hier volledig scherm):

Xcode screenshot

maar ik heb nu het probleem dat ik 40px als de letter.bottom beperking in Interface Builder. Maar wat als ik een groter tegelframe nodig heb? Is er een manier om het percentage in plaats van absolute pixelwaarde in die beperking te gebruiken?

En nog een vraag is als het mogelijk is om de adjustsFontSizeToFitWidth ergens in de Interface Builder of moet ik daarvoor de broncode gebruiken? Ik heb geprobeerd een sleutel toe te voegen aan de "User Defined Runtime Attributes" - maar dan crasht de app tijdens de runtime:

Xcode screenshot


23
2018-03-27 13:16


oorsprong


antwoorden:


adjustsFontSizeToFitWidth eigendom van UILabel zal niet opgroeien met de lettergrootte, het is alleen voor het verminderen volgens de documentatie: Normaal gesproken is de labeltekst getekend met de font u specificeert in de eigenschap font. Als deze eigenschap is ingesteld op YESAls de tekst in de teksteigenschap echter de begrenzingsrechthoek van het label overschrijdt, begint de ontvanger de lettergrootte te verkleinen totdat de tekenreeks past of de minimale tekengrootte wordt bereikt.

Maar als u de tekengrootte groot genoeg maakt (zeg 200) en instelt adjustsFontSizeToFitWidth naar YES, ik denk dat je interessant waardevolle resultaten zou krijgen.

En vergeet niet om in te stellen Baseline als Align Centers, anders wordt uw tekst mogelijk niet goed gezien.

Informeer ons alstublieft over uw resultaten.


26
2018-03-28 00:19



Voor diegenen die hier bij de titel komen en een a nodig hebben eenvoudige oplossing (na uur van onderzoeken):

Probleem voorbeeld: Als u de automatische lay-out gebruikt en de hoogte van de UILabel in verhouding tot de hoogte van het scherm instelt, krijgt u een frame dat laag is voor de iPhone (liggend) en hoog voor de iPad. Hoe kan de lettertypehoogte automatisch worden aangepast?

Oplossing: in Interface Builder,

  1. set "Autoshrink" in "Minimale lettergrootte" en stel iets in voor de grootte (het beïnvloedt te brede teksten, maar vereist voor onze oplossing).
  2. set "Lijnen" is 0en maak de tekengrootte aan hoger dan het frame dat u op de iPad krijgt.

Hierdoor wordt het lettertype naar wordt automatisch verhoogd tot de huidige hoogte.


14
2018-02-02 03:19



Je kunt bereiken wat je wilt door Autoshrink in je storyboard in te stellen. Hierdoor krimpt het label tot een minimale schaal / expliciete grootte wanneer de schermgrootte kleiner wordt. Laat het werken op de grootste schermgrootte en zorg er vervolgens voor dat het krimpt tot het formaat dat u wilt in het voorbeeld van het storyboard.


2
2018-05-05 19:11



U kunt de klasse in Interface Builder vervangen door uw eigen afgeleide klasse en daar de grootte wijzigen.

Voorbeeld:

/**
MYLabel does exactly the same like UILabel, except that the font size will automatically shrink 
if the code is executed on an iPhone.
*/

class MYLabel: UILabel {

    var onlyOnceToken: dispatch_once_t = 0

    override func drawRect(rect: CGRect) {

        dispatch_once(&onlyOnceToken) {

            if let usedFont:UIFont = self.font {

                // define your reference size here
                let iPadHeight:CGFloat = 768
                let screenBounds = UIScreen.mainScreen().bounds
                let scale:CGFloat =  screenBounds.height / iPadHeight
                self.font = UIFont(name: usedFont.fontName, size: CGFloat(usedFont.pointSize) * scale)
            }
        }

        super.drawRect(rect)
    }
}

Vanaf nu moet je alleen de UILabel les met mylabel in de identiteitsinspecteur van IB en al uw lettertypen worden automatisch proportioneel aangepast aan de hoogte van uw apparaten.

Als je het gewoon samen met de labelgrootte wilt laten groeien, vervang dan

let screenBounds = UIScreen.mainScreen().bounds

met

let screenBounds = self.bounds.height

of een andere aangepaste schaalformule. UIFont biedt u extra meeteigenschappen die u veel kunt doen met deze aanpak.


1
2018-06-11 10:07



Het lettertype zal niet automatisch groeien.
Je zou het zelf moeten verhogen / verlagen, in IB of programmatisch.


0
2018-03-27 19:54