gpt4 book ai didi

ios - UIScrollView 中仅水平缩放 UIView

转载 作者:行者123 更新时间:2023-11-29 05:53:37 24 4
gpt4 key购买 nike

我尝试了其他帖子中的一些解决方案,但无法解决我要发布的问题。

我有一个自定义 UIView,它绘制一个 SoundWave,它包含一个 UIScrollView。 UIScrollView 包含一个主 UIView,其中包含另外两个自定义 UIView(标记左和右)和 UIImage View ,我在其中渲染声波。

private func initialize(){

print("\(logClassName) initialize in Frame: \(frame)")

//ScrollView
addSubview(scrollView)
scrollView.constraintToSuperViewEdges()


//WaveView
scrollView.addSubview(waveView)
waveView.topAnchor.constraint(equalTo: scrollView.topAnchor, constant: 0).isActive = true
waveView.leadingAnchor.constraint(equalTo: scrollView.leadingAnchor, constant: 0).isActive = true
waveView.trailingAnchor.constraint(equalTo: scrollView.trailingAnchor, constant: 0).isActive = true
waveView.heightAnchor.constraint(equalTo: scrollView.heightAnchor).isActive = true

waveViewWidthConstraint = waveView.widthAnchor.constraint(equalToConstant: 1000)
NSLayoutConstraint.activate([waveViewWidthConstraint])
scrollView.contentSize = CGSize(width: waveViewWidthConstraint.constant, height: 0)

//SoundWaveImageView
waveView.addSubview(soundWaveImageView)
soundWaveImageView.constraintToSuperViewEdges()


//WaveView markers
//TimeMarker
waveView.addSubview(timeMarkerView)
timeMarkerView.topAnchor.constraint(equalTo: waveView.topAnchor).isActive = true
timeMarkerView.bottomAnchor.constraint(equalTo: waveView.bottomAnchor).isActive = true
timeMarkerView.widthAnchor.constraint(equalToConstant: 1).isActive = true
timerMarkerViewLeadingContraint = timeMarkerView.leadingAnchor.constraint(equalTo: waveView.leadingAnchor, constant: 20)
NSLayoutConstraint.activate([timerMarkerViewLeadingContraint])


//LeftMarker
waveView.addSubview(leftMarkerView)
leftMarkerView.topAnchor.constraint(equalTo: waveView.topAnchor).isActive = true
leftMarkerView.bottomAnchor.constraint(equalTo: waveView.bottomAnchor).isActive = true
leftMarkerView.widthAnchor.constraint(equalToConstant: leftMarkerView.triangleWidth).isActive = true
leftMarkerViewLeadingConstraint = leftMarkerView.leadingAnchor.constraint(equalTo: waveView.leadingAnchor, constant: 0)
NSLayoutConstraint.activate([leftMarkerViewLeadingConstraint])


//RightMarker
waveView.addSubview(rightMarkerView)
rightMarkerView.topAnchor.constraint(equalTo: waveView.topAnchor).isActive = true
rightMarkerView.bottomAnchor.constraint(equalTo: waveView.bottomAnchor).isActive = true
rightMarkerView.widthAnchor.constraint(equalToConstant: rightMarkerView.triangleWidth).isActive = true
rightMarkerViewLeadingConstraint = rightMarkerView.trailingAnchor.constraint(equalTo: waveView.leadingAnchor, constant: 50)
NSLayoutConstraint.activate([rightMarkerViewLeadingConstraint])

}

如图所示,主 UIView 受到 UIScrollView 边缘的约束,宽度约束是根据需要而变化的总长度。负责此操作的函数如下:

private func updateWidthConstraintValue(_ newWidth:CGFloat){

waveViewWidthConstraint.constant = newWidth
scrollView.contentSize = CGSize(width: waveViewWidthConstraint.constant, height: 0)

}

当实现 UIScrollView 的缩放时,它可以工作,但它会垂直和水平缩放(如预期),但我只想水平实现。到目前为止我有这个:

func scrollViewDidZoom(_ scrollView: UIScrollView) {

print("\(logClassName) TEST -> scrollView did zoom \(scrollView.zoomScale)")
expandHorizontally(withScale: scrollView.zoomScale)
//scrollView.contentOffset = CGPoint(x: scrollView.contentOffset.x, y: 0)
//scrollView.contentSize = CGSize(width: scrollView.contentSize.width, height: scrollView.frame.height)
}

func viewForZooming(in scrollView: UIScrollView) -> UIView? {

return waveView

}

private func expandHorizontally(withScale scale:CGFloat){

let scaledWidth = currentWaveViewWidth * scale
print("\(logClassName) TEST -> scaledWidth = \(scaledWidth)")

updateWidthConstraintValue(scaledWidth)
// Adjust content size and content offset
scrollView.contentSize = CGSize(width: waveViewWidthConstraint.constant,
height: 0);
scrollView.contentOffset = CGPoint(x: scrollView.contentOffset.x,
y: scrollView.contentOffset.y);

}

UI 变量的声明如下:

lazy private (set) var scrollView:UIScrollView = {

let rtView = UIScrollView()

rtView.translatesAutoresizingMaskIntoConstraints = false
rtView.backgroundColor = .clear

rtView.bounces = false
rtView.bouncesZoom = false

rtView.minimumZoomScale = 1
rtView.maximumZoomScale = 3

rtView.delegate = self

return rtView

}()

private (set) lazy var waveView:UIView = {

let rtView = UIView()

rtView.translatesAutoresizingMaskIntoConstraints = false
rtView.backgroundColor = .clear
rtView.addGestureRecognizer(UITapGestureRecognizer(target: self,
action: #selector(waveViewDidTouch)))

return rtView

}()
private (set) var waveViewWidthConstraint = NSLayoutConstraint()

private (set) lazy var soundWaveImageView:UIImageView = {

let rtView = UIImageView()

rtView.translatesAutoresizingMaskIntoConstraints = false

return rtView

}()

private (set) lazy var timeMarkerView:UIView = {
let rtView = UIView()

rtView.translatesAutoresizingMaskIntoConstraints = false
rtView.backgroundColor = UIColor.AppColors.defaultTint

return rtView
}()
private var timerMarkerViewLeadingContraint = NSLayoutConstraint()

private (set) lazy var leftMarkerView:MarkerView = {

let rtView = MarkerView(title: AppHelper.printLocalized(withKey: "messages.start", targetSpecific: false), markerDirection: .right)

rtView.translatesAutoresizingMaskIntoConstraints = false
rtView.delegate = self

return rtView

}()
private var leftMarkerViewLeadingConstraint = NSLayoutConstraint()

private (set) lazy var rightMarkerView:MarkerView = {

let rtView = MarkerView(title: AppHelper.printLocalized(withKey: "messages.end", targetSpecific: false), markerDirection: .left)

rtView.translatesAutoresizingMaskIntoConstraints = false
rtView.delegate = self

return rtView

}()
private var rightMarkerViewLeadingConstraint = NSLayoutConstraint()

我尝试将所有相关信息放入其中,因为它是一个大类。

最佳答案

谢谢 LaurentMaquet,我已经找到了一个临时解决方案。在某个时候,我将发布最终的 soundWaveView,因为它目前正在开发中。

所做的更改是:

1- 为 soundWave 创建自定义类。

class WaveView:UIView{
var unzoomedViewHeight: CGFloat = 0

override var transform: CGAffineTransform{
get{ return super.transform }
set{
var t = newValue
t.d = 1.0
t.ty = (1.0 - t.a) * unzoomedViewHeight/2
super.transform = t
}
}

override func layoutSubviews() {
super.layoutSubviews()

unzoomedViewHeight = frame.size.height
print("\(logClassName) did layout to \(AppHelper.traitStatus) -> frame = \(frame)")

}

}

2-使我的 soundView 变量成为 SoundView

private (set) lazy var waveView:WaveView = {

let rtView = WaveView()

rtView.translatesAutoresizingMaskIntoConstraints = false
rtView.backgroundColor = .clear
rtView.addGestureRecognizer(UITapGestureRecognizer(target: self,
action: #selector(waveViewDidTouch)))

return rtView

}()

结果

enter image description here

enter image description here

关于ios - UIScrollView 中仅水平缩放 UIView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55413000/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com