Cleans up code that generates HTML labels.
Adds Label for speed. Makes the Monster Card refresh the monster from CoreData when the view is shown.
This commit is contained in:
@@ -193,7 +193,7 @@
|
|||||||
<rect key="frame" x="0.0" y="0.0" width="414" height="896"/>
|
<rect key="frame" x="0.0" y="0.0" width="414" height="896"/>
|
||||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="pZa-ia-7UT">
|
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" textAlignment="natural" lineBreakMode="wordWrap" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="pZa-ia-7UT">
|
||||||
<rect key="frame" x="8" y="96" width="398" height="14.5"/>
|
<rect key="frame" x="8" y="96" width="398" height="14.5"/>
|
||||||
<fontDescription key="fontDescription" type="system" pointSize="12"/>
|
<fontDescription key="fontDescription" type="system" pointSize="12"/>
|
||||||
<color key="textColor" systemColor="secondaryLabelColor"/>
|
<color key="textColor" systemColor="secondaryLabelColor"/>
|
||||||
@@ -205,14 +205,20 @@
|
|||||||
<constraint firstAttribute="height" constant="10" id="1yt-3D-aZx"/>
|
<constraint firstAttribute="height" constant="10" id="1yt-3D-aZx"/>
|
||||||
</constraints>
|
</constraints>
|
||||||
</imageView>
|
</imageView>
|
||||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="p05-uG-AlV">
|
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" textAlignment="natural" lineBreakMode="wordWrap" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Ae7-YW-3xk">
|
||||||
|
<rect key="frame" x="8" y="161.5" width="398" height="17"/>
|
||||||
|
<fontDescription key="fontDescription" type="system" pointSize="14"/>
|
||||||
|
<nil key="textColor"/>
|
||||||
|
<nil key="highlightedColor"/>
|
||||||
|
</label>
|
||||||
|
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" textAlignment="natural" lineBreakMode="wordWrap" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="p05-uG-AlV">
|
||||||
<rect key="frame" x="8" y="136.5" width="398" height="17"/>
|
<rect key="frame" x="8" y="136.5" width="398" height="17"/>
|
||||||
<fontDescription key="fontDescription" type="system" pointSize="14"/>
|
<fontDescription key="fontDescription" type="system" pointSize="14"/>
|
||||||
<nil key="textColor"/>
|
<nil key="textColor"/>
|
||||||
<nil key="highlightedColor"/>
|
<nil key="highlightedColor"/>
|
||||||
</label>
|
</label>
|
||||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Ae7-YW-3xk">
|
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" textAlignment="natural" lineBreakMode="wordWrap" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="0HK-T4-KQW" userLabel="Monster Speed">
|
||||||
<rect key="frame" x="8" y="161.5" width="398" height="17"/>
|
<rect key="frame" x="8" y="186.5" width="398" height="17"/>
|
||||||
<fontDescription key="fontDescription" type="system" pointSize="14"/>
|
<fontDescription key="fontDescription" type="system" pointSize="14"/>
|
||||||
<nil key="textColor"/>
|
<nil key="textColor"/>
|
||||||
<nil key="highlightedColor"/>
|
<nil key="highlightedColor"/>
|
||||||
@@ -221,17 +227,20 @@
|
|||||||
<viewLayoutGuide key="safeArea" id="WIX-Yu-LXJ"/>
|
<viewLayoutGuide key="safeArea" id="WIX-Yu-LXJ"/>
|
||||||
<color key="backgroundColor" systemColor="systemBackgroundColor"/>
|
<color key="backgroundColor" systemColor="systemBackgroundColor"/>
|
||||||
<constraints>
|
<constraints>
|
||||||
|
<constraint firstItem="WIX-Yu-LXJ" firstAttribute="trailing" secondItem="0HK-T4-KQW" secondAttribute="trailing" constant="8" id="08t-ag-Qe6"/>
|
||||||
<constraint firstItem="WIX-Yu-LXJ" firstAttribute="trailing" secondItem="pZa-ia-7UT" secondAttribute="trailing" constant="8" id="8F1-nO-xrO"/>
|
<constraint firstItem="WIX-Yu-LXJ" firstAttribute="trailing" secondItem="pZa-ia-7UT" secondAttribute="trailing" constant="8" id="8F1-nO-xrO"/>
|
||||||
<constraint firstItem="pZa-ia-7UT" firstAttribute="leading" secondItem="WIX-Yu-LXJ" secondAttribute="leading" constant="8" id="9Yo-N3-VeP"/>
|
<constraint firstItem="pZa-ia-7UT" firstAttribute="leading" secondItem="WIX-Yu-LXJ" secondAttribute="leading" constant="8" id="9Yo-N3-VeP"/>
|
||||||
<constraint firstItem="Ae7-YW-3xk" firstAttribute="top" secondItem="p05-uG-AlV" secondAttribute="bottom" constant="8" id="Dyg-fV-XyM"/>
|
<constraint firstItem="Ae7-YW-3xk" firstAttribute="top" secondItem="p05-uG-AlV" secondAttribute="bottom" constant="8" id="Dyg-fV-XyM"/>
|
||||||
<constraint firstItem="pZa-ia-7UT" firstAttribute="top" secondItem="WIX-Yu-LXJ" secondAttribute="top" constant="8" id="GZ7-bL-EbS"/>
|
<constraint firstItem="pZa-ia-7UT" firstAttribute="top" secondItem="WIX-Yu-LXJ" secondAttribute="top" constant="8" id="GZ7-bL-EbS"/>
|
||||||
<constraint firstItem="WIX-Yu-LXJ" firstAttribute="trailing" secondItem="p05-uG-AlV" secondAttribute="trailing" constant="8" id="JQZ-8U-oYy"/>
|
<constraint firstItem="WIX-Yu-LXJ" firstAttribute="trailing" secondItem="p05-uG-AlV" secondAttribute="trailing" constant="8" id="JQZ-8U-oYy"/>
|
||||||
|
<constraint firstItem="0HK-T4-KQW" firstAttribute="leading" secondItem="WIX-Yu-LXJ" secondAttribute="leading" constant="8" id="NhK-Ck-rZi"/>
|
||||||
<constraint firstItem="Ae7-YW-3xk" firstAttribute="leading" secondItem="WIX-Yu-LXJ" secondAttribute="leading" constant="8" id="S9u-eI-fvZ"/>
|
<constraint firstItem="Ae7-YW-3xk" firstAttribute="leading" secondItem="WIX-Yu-LXJ" secondAttribute="leading" constant="8" id="S9u-eI-fvZ"/>
|
||||||
<constraint firstItem="p05-uG-AlV" firstAttribute="leading" secondItem="WIX-Yu-LXJ" secondAttribute="leading" constant="8" id="Xz5-d5-Czj"/>
|
<constraint firstItem="p05-uG-AlV" firstAttribute="leading" secondItem="WIX-Yu-LXJ" secondAttribute="leading" constant="8" id="Xz5-d5-Czj"/>
|
||||||
<constraint firstItem="WIX-Yu-LXJ" firstAttribute="trailing" secondItem="WYM-ya-Yje" secondAttribute="trailing" constant="8" id="aMh-HD-dBC"/>
|
<constraint firstItem="WIX-Yu-LXJ" firstAttribute="trailing" secondItem="WYM-ya-Yje" secondAttribute="trailing" constant="8" id="aMh-HD-dBC"/>
|
||||||
<constraint firstItem="WIX-Yu-LXJ" firstAttribute="trailing" secondItem="Ae7-YW-3xk" secondAttribute="trailing" constant="8" id="fhK-dn-EfH"/>
|
<constraint firstItem="WIX-Yu-LXJ" firstAttribute="trailing" secondItem="Ae7-YW-3xk" secondAttribute="trailing" constant="8" id="fhK-dn-EfH"/>
|
||||||
<constraint firstItem="p05-uG-AlV" firstAttribute="top" secondItem="WYM-ya-Yje" secondAttribute="bottom" constant="8" id="k9C-fg-kcY"/>
|
<constraint firstItem="p05-uG-AlV" firstAttribute="top" secondItem="WYM-ya-Yje" secondAttribute="bottom" constant="8" id="k9C-fg-kcY"/>
|
||||||
<constraint firstItem="WYM-ya-Yje" firstAttribute="top" secondItem="pZa-ia-7UT" secondAttribute="bottom" constant="8" id="mO1-0h-hFW"/>
|
<constraint firstItem="WYM-ya-Yje" firstAttribute="top" secondItem="pZa-ia-7UT" secondAttribute="bottom" constant="8" id="mO1-0h-hFW"/>
|
||||||
|
<constraint firstItem="0HK-T4-KQW" firstAttribute="top" secondItem="Ae7-YW-3xk" secondAttribute="bottom" constant="8" id="t7c-uP-x4v"/>
|
||||||
<constraint firstItem="WYM-ya-Yje" firstAttribute="leading" secondItem="WIX-Yu-LXJ" secondAttribute="leading" constant="8" id="wB4-zH-APV"/>
|
<constraint firstItem="WYM-ya-Yje" firstAttribute="leading" secondItem="WIX-Yu-LXJ" secondAttribute="leading" constant="8" id="wB4-zH-APV"/>
|
||||||
</constraints>
|
</constraints>
|
||||||
</view>
|
</view>
|
||||||
@@ -246,6 +255,7 @@
|
|||||||
<outlet property="monsterArmorClass" destination="p05-uG-AlV" id="ISg-8R-AnX"/>
|
<outlet property="monsterArmorClass" destination="p05-uG-AlV" id="ISg-8R-AnX"/>
|
||||||
<outlet property="monsterHitPoints" destination="Ae7-YW-3xk" id="3og-CQ-jGe"/>
|
<outlet property="monsterHitPoints" destination="Ae7-YW-3xk" id="3og-CQ-jGe"/>
|
||||||
<outlet property="monsterMeta" destination="pZa-ia-7UT" id="QEV-cs-IEk"/>
|
<outlet property="monsterMeta" destination="pZa-ia-7UT" id="QEV-cs-IEk"/>
|
||||||
|
<outlet property="monsterSpeed" destination="0HK-T4-KQW" id="V8T-ZK-2aB"/>
|
||||||
</connections>
|
</connections>
|
||||||
</viewController>
|
</viewController>
|
||||||
<placeholder placeholderIdentifier="IBFirstResponder" id="lvO-c7-FKV" userLabel="First Responder" customClass="UIResponder" sceneMemberID="firstResponder"/>
|
<placeholder placeholderIdentifier="IBFirstResponder" id="lvO-c7-FKV" userLabel="First Responder" customClass="UIResponder" sceneMemberID="firstResponder"/>
|
||||||
|
|||||||
@@ -12,11 +12,13 @@
|
|||||||
@implementation HTMLHelper
|
@implementation HTMLHelper
|
||||||
|
|
||||||
+ (NSAttributedString*)attributedStringFromHTML:(NSString *)htmlString {
|
+ (NSAttributedString*)attributedStringFromHTML:(NSString *)htmlString {
|
||||||
|
NSData *data = [htmlString dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES];
|
||||||
return [[NSAttributedString alloc] initWithData:[htmlString dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES]
|
NSDictionary *options = @{NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType,
|
||||||
options:@{NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType,
|
NSCharacterEncodingDocumentAttribute: @(NSUTF8StringEncoding)};
|
||||||
NSCharacterEncodingDocumentAttribute: @(NSUTF8StringEncoding)}
|
return [[NSAttributedString alloc] initWithData:data
|
||||||
documentAttributes:nil error:nil];
|
options:options
|
||||||
|
documentAttributes:nil
|
||||||
|
error:nil];
|
||||||
}
|
}
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|||||||
@@ -278,9 +278,28 @@ NSString* const kMonsterSizeGargantuan = @"gargantuan";
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//getSpeedText
|
|
||||||
-(NSString*)speedDescription {
|
-(NSString*)speedDescription {
|
||||||
@throw [[NSException alloc] initWithName:@"unimplemented" reason:@"Method not implemented." userInfo:nil];
|
if (self.hasCustomSpeed) {
|
||||||
|
return self.customSpeed;
|
||||||
|
} else {
|
||||||
|
NSMutableArray* parts = [[NSMutableArray alloc] init];
|
||||||
|
if (self.baseSpeed > 0) {
|
||||||
|
[parts addObject:[NSString stringWithFormat:@"%d ft.", self.baseSpeed]];
|
||||||
|
}
|
||||||
|
if (self.burrowSpeed > 0) {
|
||||||
|
[parts addObject:[NSString stringWithFormat:@"burrow %d ft.", self.burrowSpeed]];
|
||||||
|
}
|
||||||
|
if (self.climbSpeed > 0) {
|
||||||
|
[parts addObject:[NSString stringWithFormat:@"climb %d ft.", self.climbSpeed]];
|
||||||
|
}
|
||||||
|
if (self.flySpeed > 0) {
|
||||||
|
[parts addObject:[NSString stringWithFormat:@"fly %d ft.%@", self.flySpeed, self.canHover ? @" (hover)" : @""]];
|
||||||
|
}
|
||||||
|
if (self.swimSpeed > 0) {
|
||||||
|
[parts addObject:[NSString stringWithFormat:@"swim %d ft.", self.swimSpeed]];
|
||||||
|
}
|
||||||
|
return [parts componentsJoinedByString:@" "];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
-(NSString*)strengthDescription {
|
-(NSString*)strengthDescription {
|
||||||
|
|||||||
@@ -17,6 +17,7 @@ NS_ASSUME_NONNULL_BEGIN
|
|||||||
@property (weak, nonatomic) IBOutlet UILabel *monsterMeta;
|
@property (weak, nonatomic) IBOutlet UILabel *monsterMeta;
|
||||||
@property (weak, nonatomic) IBOutlet UILabel *monsterArmorClass;
|
@property (weak, nonatomic) IBOutlet UILabel *monsterArmorClass;
|
||||||
@property (weak, nonatomic) IBOutlet UILabel *monsterHitPoints;
|
@property (weak, nonatomic) IBOutlet UILabel *monsterHitPoints;
|
||||||
|
@property (weak, nonatomic) IBOutlet UILabel *monsterSpeed;
|
||||||
|
|
||||||
@property Monster* monster;
|
@property Monster* monster;
|
||||||
|
|
||||||
|
|||||||
@@ -9,24 +9,43 @@
|
|||||||
#import "MonsterViewController.h"
|
#import "MonsterViewController.h"
|
||||||
#import "EditMonsterViewController.h"
|
#import "EditMonsterViewController.h"
|
||||||
#import "HTMLHelper.h"
|
#import "HTMLHelper.h"
|
||||||
|
#import "AppDelegate.h"
|
||||||
|
|
||||||
@interface MonsterViewController ()
|
@interface MonsterViewController ()
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
||||||
@implementation MonsterViewController
|
NSString *const defaultFontFamily = @"helvetica";
|
||||||
|
NSString *const defaultFontSize = @"12pt";
|
||||||
|
NSString *const defaultTextColor = @"#9B2818";
|
||||||
|
|
||||||
|
NSString* makeHTMLFragmentString(NSString* format, ...) {
|
||||||
|
va_list args;
|
||||||
|
va_start(args, format);
|
||||||
|
NSString *childString = [[NSString alloc] initWithFormat:format arguments:args];
|
||||||
|
va_end(args);
|
||||||
|
|
||||||
|
NSString *formattedString = [NSString stringWithFormat:@"<span style=\"font-family: %@; font-size: %@; color: %@;\">%@</span>", defaultFontFamily, defaultFontSize, defaultTextColor, childString];
|
||||||
|
return formattedString;
|
||||||
|
}
|
||||||
|
|
||||||
|
@implementation MonsterViewController {
|
||||||
|
NSManagedObjectContext *_context;
|
||||||
|
}
|
||||||
|
|
||||||
- (void)viewDidLoad {
|
- (void)viewDidLoad {
|
||||||
[super viewDidLoad];
|
[super viewDidLoad];
|
||||||
|
AppDelegate *appDelegate = (AppDelegate*)UIApplication.sharedApplication.delegate;
|
||||||
|
_context = appDelegate.persistentContainer.viewContext;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)viewWillAppear:(BOOL)animated {
|
||||||
|
[_context refreshObject:self.monster mergeChanges:NO];
|
||||||
if (self.monsterName != nil) {
|
if (self.monsterName != nil) {
|
||||||
self.monsterName.text = self.monster.name;
|
self.monsterName.text = self.monster.name;
|
||||||
} else if (self.navigationItem != nil) {
|
} else if (self.navigationItem != nil) {
|
||||||
self.navigationItem.title = self.monster.name;
|
self.navigationItem.title = self.monster.name;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
- (void)viewWillAppear:(BOOL)animated {
|
|
||||||
// TODO: get the latest version of this monster from CoreData
|
|
||||||
if (self.monsterName != nil) {
|
if (self.monsterName != nil) {
|
||||||
self.monsterName.text = self.monster.name;
|
self.monsterName.text = self.monster.name;
|
||||||
} else if (self.navigationItem != nil) {
|
} else if (self.navigationItem != nil) {
|
||||||
@@ -49,7 +68,7 @@
|
|||||||
if (armorClassDescription == nil) {
|
if (armorClassDescription == nil) {
|
||||||
self.monsterArmorClass.text = @"";
|
self.monsterArmorClass.text = @"";
|
||||||
} else {
|
} else {
|
||||||
self.monsterArmorClass.attributedText = [HTMLHelper attributedStringFromHTML:[NSString stringWithFormat:@"<span style=\"font-family: helvetica; font-size: 12pt; color: #9B2818;\"><b>Armor Class</b> %@</span>", armorClassDescription]];
|
self.monsterArmorClass.attributedText = [HTMLHelper attributedStringFromHTML:makeHTMLFragmentString(@"<b>Armor Class</b> %@</span>", armorClassDescription)];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (self.monsterHitPoints != nil) {
|
if (self.monsterHitPoints != nil) {
|
||||||
@@ -57,7 +76,15 @@
|
|||||||
if (hitPointsDescription == nil) {
|
if (hitPointsDescription == nil) {
|
||||||
self.monsterHitPoints.text = @"";
|
self.monsterHitPoints.text = @"";
|
||||||
} else {
|
} else {
|
||||||
self.monsterHitPoints.attributedText = [HTMLHelper attributedStringFromHTML:[NSString stringWithFormat:@"<span style=\"font-family: helvetica; font-size: 12pt; color: #9B2818;\"><b>Hit Points</b> %@</span>", hitPointsDescription]];
|
self.monsterHitPoints.attributedText = [HTMLHelper attributedStringFromHTML:makeHTMLFragmentString(@"<b>Hit Points</b> %@", hitPointsDescription)];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (self.monsterSpeed != nil) {
|
||||||
|
NSString *speedDescription = self.monster.speedDescription;
|
||||||
|
if (speedDescription == nil) {
|
||||||
|
self.monsterSpeed.text = @"";
|
||||||
|
} else {
|
||||||
|
self.monsterSpeed.attributedText = [HTMLHelper attributedStringFromHTML:makeHTMLFragmentString(@"<b>Speed</b> %@", speedDescription)];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user