Fix monospace fonts not adjusting for Dynamic Type
This commit is contained in:
parent
df7b62e14b
commit
1f6074e539
|
@ -14,6 +14,7 @@ import WebURLFoundationExtras
|
||||||
struct HTMLConverter {
|
struct HTMLConverter {
|
||||||
|
|
||||||
static let defaultFont = UIFont.systemFont(ofSize: 17)
|
static let defaultFont = UIFont.systemFont(ofSize: 17)
|
||||||
|
static let defaultMonospaceFont = UIFont.monospacedSystemFont(ofSize: 17, weight: .regular)
|
||||||
static let defaultColor = UIColor.label
|
static let defaultColor = UIColor.label
|
||||||
static let defaultParagraphStyle: NSParagraphStyle = {
|
static let defaultParagraphStyle: NSParagraphStyle = {
|
||||||
let style = NSMutableParagraphStyle()
|
let style = NSMutableParagraphStyle()
|
||||||
|
@ -23,6 +24,7 @@ struct HTMLConverter {
|
||||||
}()
|
}()
|
||||||
|
|
||||||
var font: UIFont = defaultFont
|
var font: UIFont = defaultFont
|
||||||
|
var monospaceFont: UIFont = defaultMonospaceFont
|
||||||
var color: UIColor = defaultColor
|
var color: UIColor = defaultColor
|
||||||
var paragraphStyle: NSParagraphStyle = defaultParagraphStyle
|
var paragraphStyle: NSParagraphStyle = defaultParagraphStyle
|
||||||
|
|
||||||
|
@ -90,11 +92,10 @@ struct HTMLConverter {
|
||||||
case "del":
|
case "del":
|
||||||
attributed.addAttribute(.strikethroughStyle, value: NSUnderlineStyle.single.rawValue, range: attributed.fullRange)
|
attributed.addAttribute(.strikethroughStyle, value: NSUnderlineStyle.single.rawValue, range: attributed.fullRange)
|
||||||
case "code":
|
case "code":
|
||||||
// TODO: this probably breaks with dynamic type
|
attributed.addAttribute(.font, value: monospaceFont, range: attributed.fullRange)
|
||||||
attributed.addAttribute(.font, value: UIFont.monospacedSystemFont(ofSize: font.pointSize, weight: .regular), range: attributed.fullRange)
|
|
||||||
case "pre":
|
case "pre":
|
||||||
attributed.append(NSAttributedString(string: "\n\n"))
|
attributed.append(NSAttributedString(string: "\n\n"))
|
||||||
attributed.addAttribute(.font, value: UIFont.monospacedSystemFont(ofSize: font.pointSize, weight: .regular), range: attributed.fullRange)
|
attributed.addAttribute(.font, value: monospaceFont, range: attributed.fullRange)
|
||||||
case "ol", "ul":
|
case "ol", "ul":
|
||||||
attributed.append(NSAttributedString(string: "\n\n"))
|
attributed.append(NSAttributedString(string: "\n\n"))
|
||||||
attributed.trimLeadingCharactersInSet(.whitespacesAndNewlines)
|
attributed.trimLeadingCharactersInSet(.whitespacesAndNewlines)
|
||||||
|
@ -106,7 +107,7 @@ struct HTMLConverter {
|
||||||
let index = (try? node.elementSiblingIndex()) ?? 0
|
let index = (try? node.elementSiblingIndex()) ?? 0
|
||||||
// we use the monospace digit font so that the periods of all the list items line up
|
// we use the monospace digit font so that the periods of all the list items line up
|
||||||
// TODO: this probably breaks with dynamic type
|
// TODO: this probably breaks with dynamic type
|
||||||
bullet = NSAttributedString(string: "\(index + 1).\t", attributes: [.font: UIFont.monospacedDigitSystemFont(ofSize: font.pointSize, weight: .regular), .foregroundColor: color])
|
bullet = NSAttributedString(string: "\(index + 1).\t", attributes: [.font: monospaceFont, .foregroundColor: color])
|
||||||
} else if parentTag == "ul" {
|
} else if parentTag == "ul" {
|
||||||
bullet = NSAttributedString(string: "\u{2022}\t", attributes: [.font: font, .foregroundColor: color])
|
bullet = NSAttributedString(string: "\u{2022}\t", attributes: [.font: font, .foregroundColor: color])
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -33,6 +33,7 @@ class FeaturedProfileCollectionViewCell: UICollectionViewCell {
|
||||||
displayNameLabel.adjustsFontForContentSizeCategory = true
|
displayNameLabel.adjustsFontForContentSizeCategory = true
|
||||||
|
|
||||||
noteTextView.defaultFont = .preferredFont(forTextStyle: .body)
|
noteTextView.defaultFont = .preferredFont(forTextStyle: .body)
|
||||||
|
noteTextView.monospaceFont = UIFontMetrics.default.scaledFont(for: .monospacedSystemFont(ofSize: 17, weight: .regular))
|
||||||
noteTextView.adjustsFontForContentSizeCategory = true
|
noteTextView.adjustsFontForContentSizeCategory = true
|
||||||
noteTextView.textContainer.lineBreakMode = .byTruncatingTail
|
noteTextView.textContainer.lineBreakMode = .byTruncatingTail
|
||||||
noteTextView.textContainerInset = UIEdgeInsets(top: 16, left: 4, bottom: 16, right: 4)
|
noteTextView.textContainerInset = UIEdgeInsets(top: 16, left: 4, bottom: 16, right: 4)
|
||||||
|
|
|
@ -42,6 +42,7 @@ class TimelineViewController: UIViewController, TimelineLikeCollectionViewContro
|
||||||
}
|
}
|
||||||
self.filterer = Filterer(mastodonController: mastodonController, context: filterContext)
|
self.filterer = Filterer(mastodonController: mastodonController, context: filterContext)
|
||||||
self.filterer.htmlConverter.font = TimelineStatusCollectionViewCell.contentFont
|
self.filterer.htmlConverter.font = TimelineStatusCollectionViewCell.contentFont
|
||||||
|
self.filterer.htmlConverter.monospaceFont = TimelineStatusCollectionViewCell.monospaceFont
|
||||||
self.filterer.htmlConverter.paragraphStyle = TimelineStatusCollectionViewCell.contentParagraphStyle
|
self.filterer.htmlConverter.paragraphStyle = TimelineStatusCollectionViewCell.contentParagraphStyle
|
||||||
|
|
||||||
super.init(nibName: nil, bundle: nil)
|
super.init(nibName: nil, bundle: nil)
|
||||||
|
|
|
@ -61,6 +61,7 @@ class ConfirmReblogStatusPreviewView: UIView {
|
||||||
|
|
||||||
let contentView = StatusContentTextView()
|
let contentView = StatusContentTextView()
|
||||||
contentView.defaultFont = .preferredFont(forTextStyle: .caption2)
|
contentView.defaultFont = .preferredFont(forTextStyle: .caption2)
|
||||||
|
contentView.monospaceFont = UIFontMetrics(forTextStyle: .caption2).scaledFont(for: .monospacedSystemFont(ofSize: 17, weight: .regular))
|
||||||
contentView.isUserInteractionEnabled = false
|
contentView.isUserInteractionEnabled = false
|
||||||
contentView.isScrollEnabled = false
|
contentView.isScrollEnabled = false
|
||||||
contentView.backgroundColor = nil
|
contentView.backgroundColor = nil
|
||||||
|
|
|
@ -27,6 +27,10 @@ class ContentTextView: LinkTextView, BaseEmojiLabel {
|
||||||
_read { yield htmlConverter.font }
|
_read { yield htmlConverter.font }
|
||||||
_modify { yield &htmlConverter.font }
|
_modify { yield &htmlConverter.font }
|
||||||
}
|
}
|
||||||
|
var monospaceFont: UIFont {
|
||||||
|
_read { yield htmlConverter.monospaceFont }
|
||||||
|
_modify { yield &htmlConverter.monospaceFont }
|
||||||
|
}
|
||||||
var defaultColor: UIColor {
|
var defaultColor: UIColor {
|
||||||
_read { yield htmlConverter.color }
|
_read { yield htmlConverter.color }
|
||||||
_modify { yield &htmlConverter.color }
|
_modify { yield &htmlConverter.color }
|
||||||
|
|
|
@ -35,6 +35,7 @@ class InstanceTableViewCell: UITableViewCell {
|
||||||
adultLabel.layer.cornerRadius = 0.5 * adultLabel.bounds.height
|
adultLabel.layer.cornerRadius = 0.5 * adultLabel.bounds.height
|
||||||
|
|
||||||
descriptionTextView.defaultFont = .preferredFont(forTextStyle: .body)
|
descriptionTextView.defaultFont = .preferredFont(forTextStyle: .body)
|
||||||
|
descriptionTextView.monospaceFont = UIFontMetrics.default.scaledFont(for: .monospacedSystemFont(ofSize: 17, weight: .regular))
|
||||||
descriptionTextView.adjustsFontForContentSizeCategory = true
|
descriptionTextView.adjustsFontForContentSizeCategory = true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -184,6 +184,7 @@ private class ProfileFieldValueView: UIView {
|
||||||
|
|
||||||
textView.isSelectable = false
|
textView.isSelectable = false
|
||||||
textView.defaultFont = .preferredFont(forTextStyle: .body)
|
textView.defaultFont = .preferredFont(forTextStyle: .body)
|
||||||
|
textView.monospaceFont = UIFontMetrics.default.scaledFont(for: .monospacedSystemFont(ofSize: 17, weight: .regular))
|
||||||
textView.adjustsFontForContentSizeCategory = true
|
textView.adjustsFontForContentSizeCategory = true
|
||||||
textView.setTextFromHtml(field.value)
|
textView.setTextFromHtml(field.value)
|
||||||
textView.setEmojis(account.emojis, identifier: account.id)
|
textView.setEmojis(account.emojis, identifier: account.id)
|
||||||
|
|
|
@ -82,6 +82,7 @@ class ProfileHeaderView: UIView {
|
||||||
relationshipLabel.adjustsFontForContentSizeCategory = true
|
relationshipLabel.adjustsFontForContentSizeCategory = true
|
||||||
|
|
||||||
noteTextView.defaultFont = .preferredFont(forTextStyle: .body)
|
noteTextView.defaultFont = .preferredFont(forTextStyle: .body)
|
||||||
|
noteTextView.monospaceFont = UIFontMetrics.default.scaledFont(for: .monospacedSystemFont(ofSize: 17, weight: .regular))
|
||||||
noteTextView.adjustsFontForContentSizeCategory = true
|
noteTextView.adjustsFontForContentSizeCategory = true
|
||||||
|
|
||||||
pagesSegmentedControl = ScrollingSegmentedControl(frame: .zero)
|
pagesSegmentedControl = ScrollingSegmentedControl(frame: .zero)
|
||||||
|
|
|
@ -64,7 +64,8 @@ class ConversationMainStatusTableViewCell: BaseStatusTableViewCell {
|
||||||
contentWarningLabel.font = .preferredFont(forTextStyle: .body).withTraits(.traitBold)!
|
contentWarningLabel.font = .preferredFont(forTextStyle: .body).withTraits(.traitBold)!
|
||||||
contentWarningLabel.adjustsFontForContentSizeCategory = true
|
contentWarningLabel.adjustsFontForContentSizeCategory = true
|
||||||
|
|
||||||
contentTextView.defaultFont = UIFontMetrics(forTextStyle: .body).scaledFont(for: .systemFont(ofSize: 18))
|
contentTextView.defaultFont = UIFontMetrics.default.scaledFont(for: .systemFont(ofSize: 18))
|
||||||
|
contentTextView.monospaceFont = UIFontMetrics.default.scaledFont(for: .monospacedSystemFont(ofSize: 18, weight: .regular))
|
||||||
contentTextView.adjustsFontForContentSizeCategory = true
|
contentTextView.adjustsFontForContentSizeCategory = true
|
||||||
contentTextView.dataDetectorTypes = [.flightNumber, .address, .shipmentTrackingNumber, .phoneNumber]
|
contentTextView.dataDetectorTypes = [.flightNumber, .address, .shipmentTrackingNumber, .phoneNumber]
|
||||||
if #available(iOS 16.0, *) {
|
if #available(iOS 16.0, *) {
|
||||||
|
|
|
@ -16,7 +16,8 @@ private let hashtagIcon = UIImage(systemName: "number")
|
||||||
class TimelineStatusCollectionViewCell: UICollectionViewListCell, StatusCollectionViewCell {
|
class TimelineStatusCollectionViewCell: UICollectionViewListCell, StatusCollectionViewCell {
|
||||||
|
|
||||||
static let separatorInsets = NSDirectionalEdgeInsets(top: 0, leading: 16, bottom: 0, trailing: 0)
|
static let separatorInsets = NSDirectionalEdgeInsets(top: 0, leading: 16, bottom: 0, trailing: 0)
|
||||||
static let contentFont = UIFontMetrics(forTextStyle: .body).scaledFont(for: .systemFont(ofSize: 16))
|
static let contentFont = UIFontMetrics.default.scaledFont(for: .systemFont(ofSize: 16))
|
||||||
|
static let monospaceFont = UIFontMetrics.default.scaledFont(for: .monospacedSystemFont(ofSize: 16, weight: .regular))
|
||||||
static let contentParagraphStyle = HTMLConverter.defaultParagraphStyle
|
static let contentParagraphStyle = HTMLConverter.defaultParagraphStyle
|
||||||
|
|
||||||
// MARK: Subviews
|
// MARK: Subviews
|
||||||
|
@ -167,6 +168,7 @@ class TimelineStatusCollectionViewCell: UICollectionViewListCell, StatusCollecti
|
||||||
|
|
||||||
let contentContainer = StatusContentContainer().configure {
|
let contentContainer = StatusContentContainer().configure {
|
||||||
$0.contentTextView.defaultFont = TimelineStatusCollectionViewCell.contentFont
|
$0.contentTextView.defaultFont = TimelineStatusCollectionViewCell.contentFont
|
||||||
|
$0.contentTextView.monospaceFont = TimelineStatusCollectionViewCell.monospaceFont
|
||||||
$0.contentTextView.paragraphStyle = TimelineStatusCollectionViewCell.contentParagraphStyle
|
$0.contentTextView.paragraphStyle = TimelineStatusCollectionViewCell.contentParagraphStyle
|
||||||
$0.setContentHuggingPriority(.defaultLow, for: .vertical)
|
$0.setContentHuggingPriority(.defaultLow, for: .vertical)
|
||||||
}
|
}
|
||||||
|
|
|
@ -85,7 +85,8 @@ class TimelineStatusTableViewCell: BaseStatusTableViewCell {
|
||||||
]), size: 0)
|
]), size: 0)
|
||||||
contentWarningLabel.adjustsFontForContentSizeCategory = true
|
contentWarningLabel.adjustsFontForContentSizeCategory = true
|
||||||
|
|
||||||
contentTextView.defaultFont = UIFontMetrics(forTextStyle: .body).scaledFont(for: .systemFont(ofSize: 16))
|
contentTextView.defaultFont = UIFontMetrics.default.scaledFont(for: .systemFont(ofSize: 16))
|
||||||
|
contentTextView.monospaceFont = UIFontMetrics.default.scaledFont(for: .monospacedSystemFont(ofSize: 16, weight: .regular))
|
||||||
contentTextView.adjustsFontForContentSizeCategory = true
|
contentTextView.adjustsFontForContentSizeCategory = true
|
||||||
|
|
||||||
// todo: double check this on RTL layouts
|
// todo: double check this on RTL layouts
|
||||||
|
|
Loading…
Reference in New Issue