fix: 优化图片预览索引胶囊

This commit is contained in:
2026-08-13 15:36:06 +08:00
parent 202b0f5e41
commit 48b6b9be22
2 changed files with 38 additions and 6 deletions
@@ -41,6 +41,7 @@ final class TravelAlbumPhotoPreviewViewController: UIViewController {
private let closeButton = UIButton(type: .system) private let closeButton = UIButton(type: .system)
private let titleLabel = UILabel() private let titleLabel = UILabel()
private let sizeLabel = UILabel() private let sizeLabel = UILabel()
private let counterContainer = UIView()
private let counterLabel = UILabel() private let counterLabel = UILabel()
private let bottomChrome = UIView() private let bottomChrome = UIView()
private let divider = UIView() private let divider = UIView()
@@ -159,10 +160,13 @@ final class TravelAlbumPhotoPreviewViewController: UIViewController {
counterLabel.textColor = UIColor.white.withAlphaComponent(0.82) counterLabel.textColor = UIColor.white.withAlphaComponent(0.82)
counterLabel.font = .monospacedDigitSystemFont(ofSize: 15, weight: .medium) counterLabel.font = .monospacedDigitSystemFont(ofSize: 15, weight: .medium)
counterLabel.textAlignment = .center counterLabel.textAlignment = .center
counterLabel.backgroundColor = UIColor(white: 0.11, alpha: 1) counterLabel.numberOfLines = 1
counterLabel.layer.cornerRadius = 17 counterLabel.accessibilityIdentifier = "travelAlbum.previewCounterLabel"
counterLabel.clipsToBounds = true counterLabel.setContentHuggingPriority(.required, for: .horizontal)
counterLabel.setContentCompressionResistancePriority(.required, for: .horizontal) counterLabel.setContentCompressionResistancePriority(.required, for: .horizontal)
counterContainer.backgroundColor = UIColor(white: 0.11, alpha: 1)
counterContainer.layer.cornerRadius = 17
counterContainer.clipsToBounds = true
variantSegmentedControl.selectedSegmentTintColor = UIColor(white: 0.22, alpha: 1) variantSegmentedControl.selectedSegmentTintColor = UIColor(white: 0.22, alpha: 1)
variantSegmentedControl.backgroundColor = UIColor(white: 0.065, alpha: 1) variantSegmentedControl.backgroundColor = UIColor(white: 0.065, alpha: 1)
@@ -200,7 +204,8 @@ final class TravelAlbumPhotoPreviewViewController: UIViewController {
view.addSubview(topChrome) view.addSubview(topChrome)
topChrome.addSubview(closeButton) topChrome.addSubview(closeButton)
topChrome.addSubview(titleStack) topChrome.addSubview(titleStack)
topChrome.addSubview(counterLabel) topChrome.addSubview(counterContainer)
counterContainer.addSubview(counterLabel)
view.addSubview(bottomChrome) view.addSubview(bottomChrome)
bottomChrome.addSubview(divider) bottomChrome.addSubview(divider)
bottomChrome.addSubview(variantControls) bottomChrome.addSubview(variantControls)
@@ -217,16 +222,20 @@ final class TravelAlbumPhotoPreviewViewController: UIViewController {
make.bottom.equalToSuperview().offset(-14) make.bottom.equalToSuperview().offset(-14)
make.size.equalTo(44) make.size.equalTo(44)
} }
counterLabel.snp.makeConstraints { make in counterContainer.snp.makeConstraints { make in
make.trailing.equalToSuperview().inset(16) make.trailing.equalToSuperview().inset(16)
make.centerY.equalTo(closeButton) make.centerY.equalTo(closeButton)
make.width.greaterThanOrEqualTo(48) make.width.greaterThanOrEqualTo(48)
make.height.equalTo(34) make.height.equalTo(34)
} }
counterLabel.snp.makeConstraints { make in
make.leading.trailing.equalToSuperview().inset(12)
make.centerY.equalToSuperview()
}
titleStack.snp.makeConstraints { make in titleStack.snp.makeConstraints { make in
make.centerY.equalTo(closeButton) make.centerY.equalTo(closeButton)
make.leading.greaterThanOrEqualTo(closeButton.snp.trailing).offset(8) make.leading.greaterThanOrEqualTo(closeButton.snp.trailing).offset(8)
make.trailing.lessThanOrEqualTo(counterLabel.snp.leading).offset(-8) make.trailing.lessThanOrEqualTo(counterContainer.snp.leading).offset(-8)
make.centerX.equalToSuperview() make.centerX.equalToSuperview()
make.width.lessThanOrEqualTo(220) make.width.lessThanOrEqualTo(220)
} }
@@ -67,6 +67,29 @@ final class TravelAlbumDetailViewControllerTests: XCTestCase {
XCTAssertEqual(failure, .failure("服务暂不可用")) XCTAssertEqual(failure, .failure("服务暂不可用"))
} }
func testPreviewCounterUsesHorizontalPaddingAndContentDrivenWidth() throws {
let controller = TravelAlbumPhotoPreviewViewController(
projects: [makePreviewProject(id: 1, fileName: "原图.jpg")],
totalCount: 10_000,
startProjectIndex: 0
)
controller.loadViewIfNeeded()
controller.view.frame = CGRect(x: 0, y: 0, width: 390, height: 844)
controller.view.layoutIfNeeded()
let counterLabel = try XCTUnwrap(
controller.view.findSubview {
$0.accessibilityIdentifier == "travelAlbum.previewCounterLabel"
} as? UILabel
)
let counterContainer = try XCTUnwrap(counterLabel.superview)
let expectedWidth = max(48, counterLabel.intrinsicContentSize.width + 24)
XCTAssertEqual(counterContainer.bounds.width, expectedWidth, accuracy: 0.5)
XCTAssertEqual(counterLabel.frame.minX, 12, accuracy: 0.5)
XCTAssertEqual(counterContainer.bounds.width - counterLabel.frame.maxX, 12, accuracy: 0.5)
}
func testPreviewSuccessfulDeletionShowsNextProjectAndPreventsDuplicateRequests() async throws { func testPreviewSuccessfulDeletionShowsNextProjectAndPreventsDuplicateRequests() async throws {
let api = TravelAlbumMockAPI() let api = TravelAlbumMockAPI()
api.deleteMaterialDelayNanoseconds = 1_000_000 api.deleteMaterialDelayNanoseconds = 1_000_000