精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

在 SwiftUI 中創建一個環形 Slider

開發 前端
本文展示了如何定義響應拖動手勢的圓環滑塊控件。可以設置滑塊視圖的大小,并且滑塊按預期工作。可以向控件添加更多參數以設置顏色或圓環內顯示的值的格式。 GitHub 上提供了 Circular Slider 的代碼。

前言

Slider 控件是一種允許用戶從一系列值中選擇一個值的 UI 控件。在 SwiftUI 中,它通常呈現為直線上的拇指選擇器。有時將這種類型的選擇器呈現為一個圓圈,拇指繞著圓周移動可能會更好。本文介紹如何在 SwiftUI 中定義一個環形的 Slider。

初始化環形輪廓

從ZStack中的三個圓環開始。一個灰色的圓環代表滑塊的路徑輪廓,一個淡紅色的圓弧代表沿著圓環的進度,一個圓圈代表當前光標或拇指的位置。將滑塊的范圍設置為0.0到1.0,并硬編碼一個直徑和一個的當前位置進度 - 0.33。

struct CircularSliderView1: View {
let progress = 0.33
let ringDiameter = 300.0

private var rotationAngle: Angle {
return Angle(degrees: (360.0 * progress))
}

var body: some View {
VStack {
ZStack {
Circle()
.stroke(Color(hue: 0.0, saturation: 0.0, brightness: 0.9), lineWidth: 20.0)
Circle()
.trim(from: 0, to: progress)
.stroke(Color(hue: 0.0, saturation: 0.5, brightness: 0.9),
style: StrokeStyle(lineWidth: 20.0, lineCap: .round)
)
.rotationEffect(Angle(degrees: -90))
Circle()
.fill(Color.white)
.frame(width: 21, height: 21)
.offset(y: -ringDiameter / 2.0)
.rotationEffect(rotationAngle)
}
.frame(width: ringDiameter, height: ringDiameter)

Spacer()
}
.padding(80)
}
}

圖片

將進度值和拇指位置綁定

將進度變量更改為狀態[1]變量并添加默認 Slider。這個 Slider 用于修改進度值,并在圓形滑塊上實現足夠的代碼以使拇指和進度弧響應。當前值顯示在環形 Slider 的中心。

struct CircularSliderView2: View {
@State var progress = 0.33
let ringDiameter = 300.0

private var rotationAngle: Angle {
return Angle(degrees: (360.0 * progress))
}

var body: some View {
ZStack {
Color(hue: 0.58, saturation: 0.04, brightness: 1.0)
.edgesIgnoringSafeArea(.all)

VStack {
ZStack {
Circle()
.stroke(Color(hue: 0.0, saturation: 0.0, brightness: 0.9), lineWidth: 20.0)
.overlay() {
Text("\(progress, specifier: "%.1f")")
.font(.system(size: 78, weight: .bold, design:.rounded))
}
Circle()
.trim(from: 0, to: progress)
.stroke(Color(hue: 0.0, saturation: 0.5, brightness: 0.9),
style: StrokeStyle(lineWidth: 20.0, lineCap: .round)
)
.rotationEffect(Angle(degrees: -90))
Circle()
.fill(Color.white)
.shadow(radius: 3)
.frame(width: 21, height: 21)
.offset(y: -ringDiameter / 2.0)
.rotationEffect(rotationAngle)
}
.frame(width: ringDiameter, height: ringDiameter)


VStack {
Text("Progress: \(progress, specifier: "%.1f")")
Slider(value: $progress,
in: 0...1,
minimumValueLabel: Text("0.0"),
maximumValueLabel: Text("1.0")
) {}
}
.padding(.vertical, 40)

Spacer()
}
.padding(.vertical, 40)
.padding()
}
}
}

圖片

添加觸摸手勢

DragGesture[2] 被添加到滑塊圓圈,并且使用臨時文本視圖顯示拖動手勢的當前位置。可以看到 x 和 y 坐標圍繞包含環形  Slider 的位置中心的變化情況。

struct CircularSliderView3: View {
@State var progress = 0.33
let ringDiameter = 300.0

@State var loc = CGPoint(x: 0, y: 0)

private var rotationAngle: Angle {
return Angle(degrees: (360.0 * progress))
}

private func changeAngle(location: CGPoint) {
loc = location
}

var body: some View {
ZStack {
Color(hue: 0.58, saturation: 0.04, brightness: 1.0)
.edgesIgnoringSafeArea(.all)

VStack {
ZStack {
Circle()
.stroke(Color(hue: 0.0, saturation: 0.0, brightness: 0.9), lineWidth: 20.0)
.overlay() {
Text("\(progress, specifier: "%.1f")")
.font(.system(size: 78, weight: .bold, design:.rounded))
}
Circle()
.trim(from: 0, to: progress)
.stroke(Color(hue: 0.0, saturation: 0.5, brightness: 0.9),
style: StrokeStyle(lineWidth: 20.0, lineCap: .round)
)
.rotationEffect(Angle(degrees: -90))
Circle()
.fill(Color.blue)
.shadow(radius: 3)
.frame(width: 21, height: 21)
.offset(y: -ringDiameter / 2.0)
.rotationEffect(rotationAngle)
.gesture(
DragGesture(minimumDistance: 0.0)
.onChanged() { value in
changeAngle(location: value.location)
}
)
}
.frame(width: ringDiameter, height: ringDiameter)

Spacer().frame(height:50)

Text("Location = (\(loc.x, specifier: "%.1f"), \(loc.y, specifier: "%.1f"))")

Spacer()
}
.padding(.vertical, 40)
.padding()
}
}
}

圖片

為不同的坐標值設置滑塊位置

圓形滑塊上有兩個表示進度的值,用于顯示進度弧度的progress值和用于顯示滑塊光標的rotationAngle。應該只有一個屬性來保存滑塊進度。視圖被提取到一個單獨的結構中,該結構具有圓形滑塊上進度的一個綁定值。

滑塊的range的可選參數也是可用的。這需要對進度進行一些調整,以計算已設置的角度以及拇指在圓形滑塊上位置的旋轉角度。另外調用onAppear根據View出現前的進度值計算旋轉角度。

struct CircularSliderView: View {
@Binding var progress: Double

@State private var rotationAngle = Angle(degrees: 0)
private var minValue = 0.0
private var maxValue = 1.0

init(value progress: Binding<Double>, in bounds: ClosedRange<Int> = 0...1) {
self._progress = progress

self.minValue = Double(bounds.first ?? 0)
self.maxValue = Double(bounds.last ?? 1)
self.rotationAngle = Angle(degrees: progressFraction * 360.0)
}

private var progressFraction: Double {
return ((progress - minValue) / (maxValue - minValue))
}

private func changeAngle(location: CGPoint) {
// 為位置創建一個向量(在 iOS 上反轉 y 坐標系統)
let vector = CGVector(dx: location.x, dy: -location.y)

// 計算向量的角度
let angleRadians = atan2(vector.dx, vector.dy)

// 將角度轉換為 0 到 360 的范圍(而不是負角度)
let positiveAngle = angleRadians < 0.0 ? angleRadians + (2.0 * .pi) : angleRadians

// 根據角度更新滑塊進度值
progress = ((positiveAngle / (2.0 * .pi)) * (maxValue - minValue)) + minValue
rotationAngle = Angle(radians: positiveAngle)
}

var body: some View {
GeometryReader { gr in
let radius = (min(gr.size.width, gr.size.height) / 2.0) * 0.9
let sliderWidth = radius * 0.1

VStack(spacing:0) {
ZStack {
Circle()
.stroke(Color(hue: 0.0, saturation: 0.0, brightness: 0.9),
style: StrokeStyle(lineWidth: sliderWidth))
.overlay() {
Text("\(progress, specifier: "%.1f")")
.font(.system(size: radius * 0.7, weight: .bold, design:.rounded))
}
// 取消注釋以顯示刻度線
//Circle()
// .stroke(Color(hue: 0.0, saturation: 0.0, brightness: 0.6),
// style: StrokeStyle(lineWidth: sliderWidth * 0.75,
// dash: [2, (2 * .pi * radius)/24 - 2]))
// .rotationEffect(Angle(degrees: -90))
Circle()
.trim(from: 0, to: progressFraction)
.stroke(Color(hue: 0.0, saturation: 0.5, brightness: 0.9),
style: StrokeStyle(lineWidth: sliderWidth, lineCap: .round)
)
.rotationEffect(Angle(degrees: -90))
Circle()
.fill(Color.white)
.shadow(radius: (sliderWidth * 0.3))
.frame(width: sliderWidth, height: sliderWidth)
.offset(y: -radius)
.rotationEffect(rotationAngle)
.gesture(
DragGesture(minimumDistance: 0.0)
.onChanged() { value in
changeAngle(location: value.location)
}
)
}
.frame(width: radius * 2.0, height: radius * 2.0, alignment: .center)
.padding(radius * 0.1)
}

.onAppear {
self.rotationAngle = Angle(degrees: progressFraction * 360.0)
}
}
}
}

CircularSliderView 的三種不同視圖被添加到View中以測試和演示 Circular Slider 視圖的不同功能。

struct CircularSliderView5: View {
@State var progress1 = 0.75
@State var progress2 = 37.5
@State var progress3 = 7.5

var body: some View {
ZStack {
Color(hue: 0.58, saturation: 0.06, brightness: 1.0)
.edgesIgnoringSafeArea(.all)

VStack {
CircularSliderView(value: $progress1)
.frame(width:250, height: 250)

HStack {
CircularSliderView(value: $progress2, in: 1...10)

CircularSliderView(value: $progress3, in: 0...100)
}

Spacer()
}
.padding()
}
}
}

圖片

總結

本文展示了如何定義響應拖動手勢的圓環滑塊控件。可以設置滑塊視圖的大小,并且滑塊按預期工作。可以向控件添加更多參數以設置顏色或圓環內顯示的值的格式。 GitHub 上提供了 Circular Slider[3] 的代碼。

參考資料

[1]state: https://developer.apple.com/documentation/swiftui/state?。

[2]DragGesture: https://developer.apple.com/documentation/swiftui/draggesture/?。

[3]Circular Slider: https://github.com/SwiftCommunityRes/swift?。

責任編輯:姜華 來源: Swift社區
相關推薦

2022-11-07 08:42:50

iOS 16SwiftUI

2015-08-06 13:44:21

swiftcocoapods

2023-11-03 11:57:04

2024-04-01 08:18:52

CSSHTMLWeb

2020-09-29 07:24:14

Python字典數據

2022-11-18 09:03:09

SwiftUIiOS16

2011-03-10 10:45:47

Azure“Hello Worl

2009-09-22 11:54:42

ibmdwPHP

2023-12-29 09:01:10

SwiftUI空狀態Product?

2023-11-20 09:55:34

音頻圖表SwiftUI

2022-01-17 09:22:42

SwiftUI App Store開源

2011-09-08 10:46:12

Widget

2024-05-06 00:00:00

Android系統通信

2017-02-10 20:00:17

Linux共享目錄命令

2021-01-04 09:12:31

集合變量

2022-11-11 09:01:08

SwiftUI條形圖子視圖

2021-04-14 15:25:39

Linux加密文件保險庫

2022-02-10 22:34:51

對象JVM收集器

2017-08-17 14:38:39

JavaAbstract抽象

2016-03-08 09:52:22

xcode插件開發
點贊
收藏

51CTO技術棧公眾號

日韩精品欧美激情| 伊人性伊人情综合网| 国产精品国内视频| 欧美一级片在线视频| 岛国av一区| 欧美在线视频你懂得| 国产小视频免费| 能在线看的av| 国产精品一区专区| 国产成人欧美在线观看| 欧美成欧美va| 成人亚洲一区| 亚洲精品福利视频| 在线观看日本www| 日韩伦理三区| 亚洲高清视频的网址| 亚洲国产精品综合| 天堂国产一区二区三区| 黑人巨大精品欧美一区| 日本精品久久中文字幕佐佐木| 欧美性x x x| 美女亚洲一区| 精品捆绑美女sm三区| 日本三区在线观看| 菠萝蜜视频在线观看www入口| 国产精品青草久久| 日本视频一区二区不卡| 五月激情丁香婷婷| 国产成人亚洲精品狼色在线| 国产精品久久久久久久久久新婚| 日韩三级一区二区三区| 欧美久久影院| 久久久97精品| 国内毛片毛片毛片毛片毛片| 自拍亚洲一区| 国产视频久久久久| 三叶草欧洲码在线| 国产精品毛片视频| 日韩欧美成人激情| 中文字幕一区二区三区四| 91伊人久久| 色狠狠色噜噜噜综合网| 日本三级免费观看| 蜜桃视频在线观看免费视频| 亚洲国产成人av网| 黄色三级中文字幕| 伊人222成人综合网| 中文字幕一区二区三区蜜月| 日韩免费一区二区三区| 黄视频在线观看免费| 91蜜桃网址入口| 精品无码久久久久久久动漫| 天堂中文在线资源| 99久久婷婷国产综合精品| 国产精品免费一区二区三区四区| 精品久久久免费视频| 国产精品18久久久久久久久| 96sao精品视频在线观看| 97人妻精品一区二区三区| 久久福利资源站| 欧美激情图片区| 91麻豆精品国产91久久综合| 日韩成人精品一区| 久久久国产精品视频| 黄色录像二级片| 欧美一区成人| 性欧美办公室18xxxxhd| 亚洲 欧美 中文字幕| 日韩高清一级片| 国产免费一区视频观看免费| 国产一区二区波多野结衣 | 午夜精品一区二区三区在线视| jizz国产免费| 久久久久久久欧美精品| 国产欧美精品一区二区三区-老狼| 亚洲中文字幕一区二区| 国产乱人伦精品一区二区在线观看| 亚洲综合在线中文字幕| 亚洲欧美日韩精品久久久 | 99r国产精品视频| 亚洲av无码专区在线| 成人动漫一区二区三区| 欧美一区1区三区3区公司 | 国产一级二级三级在线观看| 国产精品美女久久久久aⅴ | 黄污视频在线观看| 色噜噜狠狠色综合中国| 国产乱叫456| 久久亚洲黄色| 日韩性生活视频| 久草视频精品在线| 视频在线观看一区| 91网免费观看| 男女网站在线观看| 日韩毛片高清在线播放| 怡红院av亚洲一区二区三区h| 欧美三区四区| 精品sm在线观看| 女人十八毛片嫩草av| 一区三区视频| 成人xvideos免费视频| 欧美熟妇另类久久久久久不卡 | 国产盗摄一区二区三区| 欧美一区二区视频在线| 欧洲成人综合网| 欧美性xxxxx极品少妇| 国产艳妇疯狂做爰视频| 欧美激情黄色片| 欧美在线xxx| 国内精品久久久久久久久久久| 久久婷婷成人综合色| 日本久久久网站| 天天综合在线观看| 亚洲精品少妇网址| 久久精品久久精品久久| 精品一区二区久久久| 欧美一级二级三级九九九| 超碰在线最新网址| 欧美二区乱c少妇| 国产毛片久久久久久久| 亚洲免费观看| 444亚洲人体| 欧美jizzhd69巨大| 在线精品亚洲一区二区不卡| yy1111111| 激情欧美一区| 97视频中文字幕| 日本三级视频在线播放| 欧美亚洲国产一区二区三区va | 一区二区三区四区蜜桃| 国产乱女淫av麻豆国产| 不卡日本视频| 国产成人+综合亚洲+天堂| 人妻一区二区三区| 亚洲一二三区在线观看| 欧美xxxx日本和非洲| 国产精品久久久久久影院8一贰佰| 国产精品va在线| 国产私拍精品| 91福利区一区二区三区| 美女爆乳18禁www久久久久久 | 在线免费视频一区| 精品视频99| 国产精品美女av| 成人免费在线电影| 欧美色精品天天在线观看视频| 免费看黄色的视频| 日韩综合在线视频| 日韩高清av电影| www.国产精品| 精品国产一区二区三区久久狼黑人 | 欧美一区二区三区视频在线观看| 欧美h片在线观看| 国产乱码字幕精品高清av| 男人天堂成人网| 亚洲午夜精品| 性欧美暴力猛交69hd| 天天躁日日躁狠狠躁伊人| 欧美日韩国产精品一区二区三区四区 | 国产欧美1区2区3区| 另类小说第一页| 色琪琪久久se色| 91久久综合亚洲鲁鲁五月天| 色呦呦在线看| 亚洲黄色在线观看| 中文在线第一页| 国产精品欧美一级免费| 亚洲一二三av| 影音先锋亚洲精品| 欧美高清性xxxxhd| 国产麻豆一区| 欧美大片第1页| 婷婷丁香花五月天| 在线免费观看一区| 国产午夜精品理论片在线| 国产91精品在线观看| 国产精品333| 国产欧美日韩精品一区二区三区| 成人久久久久爱| 日本性爱视频在线观看| 亚洲免费中文字幕| 91福利在线观看视频| 亚洲大片免费看| 无码人妻aⅴ一区二区三区69岛| 国产在线一区二区| 国产免费毛卡片| 99精品在线免费在线观看| 97自拍视频| 中文在线免费视频| 久久亚洲欧美日韩精品专区 | 中文字幕码精品视频网站| 亚洲精品久久7777| 成人性生交大免费看| 国产一区二区三区久久久| 国产伦精品一区二区三区四区视频_| 国产欧美日韩精品一区二区免费| 99re视频| a成人v在线| 91sa在线看| 1769免费视频在线观看| 亚洲视屏在线播放| 精品人妻一区二区三区蜜桃| 在线亚洲人成电影网站色www| wwwav国产| 中文字幕免费在线观看视频一区| 日批免费观看视频| 捆绑调教一区二区三区| 日本www在线播放| 午夜日本精品| 一区二区精品在线| 亚洲老女人视频免费| 99在线影院| 中文成人在线| 国产ts一区二区| 高清毛片在线观看| 欧美成人免费一级人片100| 黄色av网站在线| 亚洲精品一区二区三区精华液 | 国产毛片精品视频| 欧美成人福利在线观看| 久久黄色影院| 欧美牲交a欧美牲交| 国语自产精品视频在线看8查询8| 在线丝袜欧美日韩制服| 国产a久久精品一区二区三区| 国产精品一区视频网站| 精品一区二区三区中文字幕视频| 国产美女被下药99| 成人午夜精品| 国产va免费精品高清在线| 涩涩视频在线| 亚州av一区二区| 成人综合av网| 91麻豆免费在线视频| 中文字幕日韩综合av| 日本一卡二卡四卡精品| 亚洲二区在线播放视频| 亚洲女人18毛片水真多| 欧美成人性福生活免费看| 国产精品综合在线| 777午夜精品免费视频| 91成年人视频| 91精品国产欧美一区二区18| 国产精品伦一区二区三区| 欧美日韩另类一区| 91成人一区二区三区| 7777女厕盗摄久久久| 国产美女免费视频| 91精品国产欧美一区二区18| 国产成人a人亚洲精品无码| 欧美一级在线免费| 朝桐光av在线一区二区三区| 精品毛片乱码1区2区3区| 成人精品在线播放| 亚洲韩国欧洲国产日产av | 国产精品影视天天线| 午夜激情视频网| 国产电影一区二区三区| 中文字幕精品视频在线| 久久一区二区三区国产精品| 级毛片内射视频| 综合久久久久久| 久久国产在线视频| 婷婷成人综合网| 精品人妻一区二区三区潮喷在线| 欧美日韩中文一区| 国产熟女一区二区丰满| 欧美精品一区二区久久婷婷| 免费毛片在线| 最新日韩中文字幕| 1024在线播放| 欧日韩在线观看| 欧美久久久网站| y111111国产精品久久婷婷| 欧美大胆a级| 鲁片一区二区三区| 亚洲三级网页| 中文字幕av导航| 日韩亚洲在线| 校园春色 亚洲色图| 国产成人免费高清| 少妇户外露出[11p]| 国产精品久久久久国产精品日日 | 欧美日韩国产一区二区三区| 天干夜夜爽爽日日日日| 9191精品国产综合久久久久久| 国产77777| 最近2019中文字幕mv免费看 | 国产精品日韩电影| 欧美h版在线观看| 女同一区二区| 欧美成人高清| 亚欧在线免费观看| 成人禁用看黄a在线| 九一在线免费观看| 亚洲电影一区二区三区| 一级黄色免费看| 日韩精品有码在线观看| 菠萝菠萝蜜在线观看| 日本亚洲精品在线观看| jizz性欧美2| 在线精品日韩| 日日摸夜夜添夜夜添亚洲女人| 国产精品19p| 国产精品午夜在线| 午夜影院在线看| 日韩精品影音先锋| 天堂а√在线资源在线| 欧美亚洲国产成人精品| 一区二区三区自拍视频| 亚洲国产精品久久久久久女王| 影音先锋久久资源网| 手机在线免费毛片| 国产精品久久久久影视| 亚洲熟妇无码乱子av电影| 亚洲成人av在线播放| 91三级在线| 91精品综合久久久久久五月天| 国产欧美高清视频在线| 国产视频一视频二| 成人精品免费看| 黄色一级片在线| 欧美一级高清片在线观看| 无遮挡的视频在线观看 | 日韩精品成人| 99亚洲精品视频| 麻豆精品在线播放| 欧美熟妇激情一区二区三区| 色综合久久中文综合久久97| 天堂在线视频免费观看| 国产最新精品视频| 国产精品99久久免费观看| 成人一区二区av| 国产乱码精品一品二品| 国产尤物在线播放| 欧美日产在线观看| 18视频免费网址在线观看| 国产精品国产三级国产aⅴ9色| 免费视频国产一区| 国产91在线视频观看| 久久亚洲一区二区三区四区| 天堂中文在线网| 国产丝袜一区二区三区免费视频| 国产福利在线免费观看| 国产精品久久7| 在线成人欧美| 中文字幕丰满孑伦无码专区| 精品久久香蕉国产线看观看亚洲 | 电影一区二区在线观看| 久久国产午夜精品理论片最新版本| 成人一级视频在线观看| 国产在线一区视频| 日韩国产精品视频| 怡红院成人在线| 亚洲二区三区四区| 激情另类小说区图片区视频区| 黑人巨大精品一区二区在线| 日韩午夜激情av| 国产夫妻在线播放| 欧美人xxxxx| 久久国产精品色婷婷| 欧美国产日韩在线观看成人 | 亚洲自拍av在线| 国产精品红桃| 中文字幕5566| 欧美日韩一级二级| 91精选在线| 九九九九精品| 免费日本视频一区| 午夜爽爽爽男女免费观看| 欧美草草影院在线视频| 桃色av一区二区| 亚洲一区二区高清视频| 国产精品99久久久久久久vr| 国产精品suv一区二区69| 亚洲女人天堂网| 青娱乐极品盛宴一区二区| 成人免费在线视频播放| 久久蜜桃一区二区| 国产精品久久久久久久成人午夜| 欧美精品videos另类日本| 伊甸园亚洲一区| 97人人模人人爽人人澡| 欧美日韩亚洲高清| 黄色网在线免费看| 久久波多野结衣| 狠狠色丁香久久婷婷综合_中 | 欧美一级专区免费大片| 这里有精品可以观看| 五月天男人天堂| 91在线观看污| 国产熟女一区二区三区四区| 日本午夜在线亚洲.国产| 欧美成人高清| 五月天免费网站| 日韩高清人体午夜| 精品国产亚洲一区二区在线观看 | 成人51免费| 无码内射中文字幕岛国片| 亚洲综合一区在线|