fix: 优化图片预览索引胶囊
This commit is contained in:
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user