iOS-Swift:如何为头像添加弹窗放大查看的功能选项
实现iOS头像放大查看功能
1. 调整ActionSheet的「View Picture」按钮
原来的action(for:)方法是为相机/相册选择场景设计的,「查看头像」不需要复用这个方法,直接创建独立的UIAlertAction即可:
public func present(from sourceView: UIView, didSelect image: UIImage?) { let alertController = UIAlertController(title: nil, message: nil, preferredStyle: .actionSheet) if self.isMediaTypeVideo { // 原有视频相关逻辑保留 if let action = self.action(for: .camera, title: "Take Video") { alertController.addAction(action) } if let action = self.action(for: .photoLibrary, title: "Choose video") { alertController.addAction(action) } } else { // 原有拍照/选图逻辑保留 if let action = self.action(for: .camera, title: "Take a Picture") { alertController.addAction(action) } if let action = self.action(for: .photoLibrary, title: "Choose a Picture") { alertController.addAction(action) } // 添加查看头像按钮(先判断当前是否有头像,避免无效操作) if let currentAvatar = self.userAvatarImageView.image { // 替换为你项目中显示头像的UIImageView实例 let viewAction = UIAlertAction(title: "View Picture", style: .default) { [weak self] _ in self?.showAvatarPreview(with: currentAvatar) } alertController.addAction(viewAction) } } // 补充取消按钮(原有代码未展示,避免遗漏) let cancelAction = UIAlertAction(title: "Cancel", style: .cancel) alertController.addAction(cancelAction) // 弹出ActionSheet的原有逻辑保留 alertController.popoverPresentationController?.sourceView = sourceView alertController.popoverPresentationController?.sourceRect = sourceView.bounds UIApplication.shared.keyWindow?.rootViewController?.present(alertController, animated: true) }
2. 实现头像放大预览方法
创建全屏临时视图展示放大后的头像,支持点击关闭:
private func showAvatarPreview(with avatar: UIImage) { // 创建全屏背景遮罩 let previewBackground = UIView(frame: UIScreen.main.bounds) previewBackground.backgroundColor = UIColor.black.withAlphaComponent(0.8) previewBackground.tag = 999 // 标记用于后续移除 let tapGesture = UITapGestureRecognizer(target: self, action: #selector(dismissAvatarPreview)) previewBackground.addGestureRecognizer(tapGesture) // 创建头像展示视图 let avatarImageView = UIImageView(image: avatar) avatarImageView.contentMode = .scaleAspectFit avatarImageView.frame = previewBackground.bounds avatarImageView.isUserInteractionEnabled = true // 添加到窗口显示 previewBackground.addSubview(avatarImageView) UIApplication.shared.keyWindow?.addSubview(previewBackground) // 添加淡入动画 previewBackground.alpha = 0 UIView.animate(withDuration: 0.3) { previewBackground.alpha = 1 } } @objc private func dismissAvatarPreview() { guard let previewBackground = UIApplication.shared.keyWindow?.viewWithTag(999) else { return } // 淡出后移除视图 UIView.animate(withDuration: 0.3, animations: { previewBackground.alpha = 0 }) { _ in previewBackground.removeFromSuperview() } }
3. 可选优化:支持双指缩放
如果需要给预览头像添加缩放功能,可添加缩放手势:
// 在showAvatarPreview方法中给avatarImageView添加缩放手势 let pinchGesture = UIPinchGestureRecognizer(target: self, action: #selector(handlePinch(_:))) avatarImageView.addGestureRecognizer(pinchGesture) // 实现缩放逻辑 @objc private func handlePinch(_ gesture: UIPinchGestureRecognizer) { guard let view = gesture.view else { return } view.transform = view.transform.scaledBy(x: gesture.scale, y: gesture.scale) gesture.scale = 1 }
内容的提问来源于stack exchange,提问作者Mycode
相关产品推荐
相关产品推荐

