在新的 WatchOS 7.2 中创建复杂功能的基本方法是什么?

问题描述

在 WatchOS 中创建静态复杂功能的最基本方法是什么? 我已经遇到了让它工作的问题。所以我设置了一些 在预览中正确显示的并发症视图。 我有 SampleTemplate ,它似乎也能正常工作。我提供 当前的时间线条目和未来的时间线条目。 但是当我运行模拟器时,圆形时间线条目没有出现在 实际表盘见下图。有人可以展示它是如何完成的吗?

//// ComplicationController.swift

import ClockKit
import SwiftUI


class ComplicationController: NSObject,CLKComplicationDataSource {
    let headlines = MainViewModel()
    // MARK: - Complication Configuration

    func getComplicationDescriptors(handler: @escaping ([CLKComplicationDescriptor]) -> Void) {
        let descriptors = [
            CLKComplicationDescriptor(identifier: "complication",displayName: "TFwatch",supportedFamilies: CLKComplicationFamily.allCases)
            // Multiple complication support can be added here with more descriptors
        ]
        
        // Call the handler with the currently supported complication descriptors
        handler(descriptors)
    }
    
    func handleSharedComplicationDescriptors(_ complicationDescriptors: [CLKComplicationDescriptor]) {
        // Do any necessary work to support these newly shared complication descriptors
    }

    // MARK: - Timeline Configuration
    
    func getTimelineEndDate(for complication: CLKComplication,withHandler handler: @escaping (Date?) -> Void) {
        // Call the handler with the last entry date you can currently provide or nil if you can't support future timelines
        handler(nil)
    }
    
    func getPrivacyBehavior(for complication: CLKComplication,withHandler handler: @escaping (CLKComplicationPrivacyBehavior) -> Void) {
        // Call the handler with your desired behavior when the device is locked
        handler(.showOnLockScreen)
    }

    // MARK: - Timeline Population
    
    func getCurrentTimelineEntry(for complication: CLKComplication,withHandler handler: @escaping (CLKComplicationTimelineEntry?) -> Void) {
        // Call the handler with the current timeline entry
        handler(nil)//
        if let ctemplate = makeTemplate(for: headlines,complication: complication) {
          let entry = CLKComplicationTimelineEntry(
            date: Date(),complicationTemplate: ctemplate)
          handler(entry)
        } else {
          handler(nil)
        }
    }
    
    func getTimelineEntries(for complication: CLKComplication,after date: Date,limit: Int,withHandler handler: @escaping ([CLKComplicationTimelineEntry]?) -> Void) {
        // Call the handler with the timeline entries after the given date
        //handler(nil)
        let fiveMinutes = 5.0 * 60.0
        var entries: [CLKComplicationTimelineEntry] = []
        var current = date
        let endDate = Date()
            //= (timeline.last?.date ?? date).addingTimeInterval(Appointment.oneHour)

        while (current.compare(endDate) == .orderedAscending) && (entries.count < limit) {
          if let ctemplate = makeTemplate(for: headlines,complication: complication) {
            let entry = CLKComplicationTimelineEntry(
              date: current,complicationTemplate: ctemplate)
            entries.append(entry)
          }
          current = current.addingTimeInterval(fiveMinutes)
        }
        handler(entries)
    }

    // MARK: - Sample Templates
    
    func getLocalizableSampleTemplate(for complication: CLKComplication,withHandler handler: @escaping (CLKComplicationTemplate?) -> Void) {
        // This method will be called once per supported complication,and the results will be cached
        let ctemplate = makeTemplate(for: headlines,complication: complication)
        handler(ctemplate)
        //handler(nil)
    }
}


extension ComplicationController {
  func makeTemplate(
    for headlines: MainViewModel,complication: CLKComplication
  ) -> CLKComplicationTemplate? {
    switch complication.family {
    case .graphicCircular:
      return CLKComplicationTemplateGraphicCircularView(
        ComplicationViewCircular(headlines: headlines))
    case .graphicCorner:
      return CLKComplicationTemplateGraphicCornerCircularView(
        ComplicationViewCornerCircular(headlines: headlines))
    default:
      return nil
    }
  }
}

//// ComplicationViews.swift

import SwiftUI
import ClockKit

// 1
struct CircularProgressArc: Shape {
  @State var progress: Double = 0.5

  func path(in rect: CGRect) -> Path {
    var path = Path()
    let limit = 0.99
    let halfarc: Double = max(0.01,min(progress,limit)) * 180.0
    path.addArc(
      center: CGPoint(x: rect.midX,y: rect.midY),radius: rect.width / 2,startAngle: .degrees(90 - halfarc),endAngle: .degrees(90 + halfarc),clockwise: true)
    return path
  }
}

// 2
struct ProgressArc<S>: ProgressViewStyle where S: ShapeStyle {
  // 3
  var strokeContent: S
  var strokeStyle: StrokeStyle

  init(
    _ strokeContent: S,strokeStyle style: StrokeStyle =
      StrokeStyle(lineWidth: 10.0,lineCap: .round)
  ) {
    self.strokeContent = strokeContent
    self.strokeStyle = style
  }

  // 4
  func makeBody(configuration: Configuration) -> some View {
    CircularProgressArc(progress: configuration.fractionCompleted ?? 0.0)
      .stroke(strokeContent,style: strokeStyle)
      .shadow(radius: 5.0)
  }
}


// 1
struct ComplicationViewCircular: View {
  // 2
    @ObservedObject var headlines : MainViewModel

  var body: some View {
    // 3
    ZStack {
        ProgressView(
          "PPP",value: (1.0 - 0.25),total: 1.0)
          .progressViewStyle(
            CircularProgressViewStyle(tint: Color.blue))

    }
  }
}

// 1
struct ComplicationViewCornerCircular: View {
  // 2
  @ObservedObject var headlines : MainViewModel

  var body: some View {
    
    ZStack {
//      Circle()
//        .fill(Color.white)
     CircleView()
        .complicationForeground()
    }
    // 3
  }
}

struct ComplicationViewRectangular: View {
  //@State var appointment: Appointment

  var body: some View {
    HStack(spacing: 10) {
      ComplicationViewCircular( headlines: MainViewModel())
      VStack(alignment: .leading) {
        Text("XYSS")
          .font(.title)
          // 1
          .minimumScaleFactor(0.4)
          .lineLimit(2)
          .multilineTextAlignment(.leading)
        HStack(spacing: 4.0) {
          Spacer()
          Text("at")
          // 2
            Text("2hrs")
          //Text(appointment.date,style: .time)
        }
        .font(.footnote)
        // 3
        .complicationForeground()
      }
    }
    .padding()
    .background(
      RoundedRectangle(cornerRadius: 10.0)
        .stroke(lineWidth: 1.5)
        .foregroundColor(Color.blue)
        .complicationForeground())
  }
}


struct ComplicationViewExtraLargeCircular: View {
  // 1
 // @State var appointment: Appointment

  var body: some View {
    // 2
    ZStack(alignment: .center) {
      // 3
      Circle()
        .foregroundColor(Color.blue)
      ProgressView(
        value: 0.5)
        .progressViewStyle(ProgressArc(Color.white))
        .complicationForeground()

      // 4

        VStack(alignment: .center,spacing: 3.0) {
          // 5
          Text("In 2hrx")
            .font(.footnote)
            .minimumScaleFactor(0.4)
            .lineLimit(2)
          Text("meet here")
            .font(.headline)
            .minimumScaleFactor(0.4)
            .lineLimit(2)
          Text("at this location")
            .font(.footnote)
        }
        .multilineTextAlignment(.center)
        .foregroundColor(.black)
        .complicationForeground()
      
    }
    .padding([.leading,.trailing],5)
  }
}


struct ComplicationViewCircular_Previews: PreviewProvider {
    static var previews: some View {
        // 1
        Group {
          // 2
            CLKComplicationTemplateGraphicCircularView(
                ComplicationViewCircular( headlines: MainViewModel())
                // 3
            ).previewContext()
            
            CLKComplicationTemplateGraphicCornerCircularView(
                ComplicationViewCornerCircular(headlines: MainViewModel())
            )
            //.previewContext(faceColor: .red)
            .previewContext()
            
        }

    }
}

enter image description here

enter image description here

enter image description here

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...