কীভাবে চিত্রটি সুইফটআইআইয়ের সাথে পুনরায় আকার দেবেন?


97

আমার Assets.xcassets এ একটি বিশাল চিত্র রয়েছে। কীভাবে এই চিত্রটিকে ছোট করে তুলতে সুইফটুআইয়ের সাথে এটি পুনরায় আকার দেবেন?

আমি ফ্রেম সেট করার চেষ্টা করেছি কিন্তু এটি কার্যকর হয় না:

Image(room.thumbnailImage)
    .frame(width: 32.0, height: 32.0)

উত্তর:


217

আপনার .resizable()কোনও আকারের পরিবর্তনগুলি প্রয়োগ করার আগে ব্যবহার করা উচিত Image

Image(room.thumbnailImage).resizable()
.frame(width: 32.0, height: 32.0)

4
এবং আপনি অনুপাতটি অনুপাত রেখে কীভাবে চিত্রটির আকার পরিবর্তন করবেন?
মার্ক কাং

@ মার্কক্যাং আমি চেষ্টা করে দেখিনি, তবে একটি পদ্ধতি রয়েছেaspectRatio(_:contentMode:)
রাফেল

4
চিত্র ("চিত্র01")। পরিবর্তনযোগ্য () .স্পেক্টরেটিও (ইউআইআইমেজ (নাম: "চিত্র01")! আকার, কন্টেন্টমোড:। ফিট)
মার্ক কাং

4
সেটা ভালো হবে. তবে আমি মনে করি ফিটের সাথে একটি বাগ রয়েছে। hackingwithswift.com/swiftui/…
মার্ক কাং

17
Image("name").resizable().scaledToFit()বগড না, যদিও। সুতরাং আপনি নিজের ইমেজটিকে একটি দৃশ্যে মুড়িয়ে রাখতে পারেন, ভিউটির ফ্রেমটি আপনার যা আকারের প্রয়োজন তা সামঞ্জস্য করতে পারেন, তারপরে scaledToFit()চিত্রটি অনুপাতের অনুপাত বজায় রাখার সময় যতটা আকারের হতে পারে তত বড় করে তুলবে।
জেমনস

38

এটি সম্পর্কে:

struct ResizedImage: View {
    var body: some View {

            Image("myImage")
                .resizable()
                .scaledToFit()
                .frame(width: 200.0,height:200)

    }
}

চিত্রের ভিউ 200x200, তবে চিত্রটি মূল দিক অনুপাত বজায় রেখেছে (সেই ফ্রেমের মধ্যে পুনরুদ্ধার করছে)


এই সমাধানটি আমার ক্ষেত্রে মূল দিক অনুপাত রাখে না।
pm89

@ pm89 আপনার মূল এবং চূড়ান্ত চিত্র / দর্শনটি কোন আকার?
বিভ্রান্ত ভোরলন

4
আসল দিক অনুপাত 3/2 হয় এবং ফলাফলটি 1/1 হয় যা চিত্রটি প্রসারিত করে। এটি একটি SwiftUI বাগ বলে মনে হচ্ছে। আমি গ্রহণযোগ্য উত্তরের মন্তব্যে মার্ক কংয়ের প্রস্তাবিত পদ্ধতিটি ব্যবহার করে শেষ করেছি, Image(uiImage: image!).resizable().aspectRatio(image!.size, contentMode: .fill)যেখানে imageপ্রকারের UIImageকারণ Imageকোনও আকারের সম্পত্তি প্রকাশ করে না।
pm89

আমার জন্য এটি দিক অনুপাত রাখার সাথে এটির মতো কাজ করে, ধন্যবাদ 👍
লাকা

17

@ রাফেলের উত্তর এবং মন্তব্যগুলিতে প্রসারিত:

এক্সকোড 11 বিটা 2 হিসাবে, আপনি কোনও উপাদানটিকে অন্য উপাদানগুলিতে মোড়ানো দ্বারা আসল দিক অনুপাত বজায় রেখে স্বেচ্ছাসেবী আকারগুলিতে একটি চিত্র স্কেল করতে পারেন।

যেমন

struct FittedImage: View
{
    let imageName: String
    let width: CGFloat
    let height: CGFloat

    var body: some View {
        VStack {
            Image(systemName: imageName)
                .resizable()
                .aspectRatio(1, contentMode: .fit)
        }
        .frame(width: width, height: height)
    }
}


struct FittedImagesView: View
{
    private let _name = "checkmark"

    var body: some View {

        VStack {

            FittedImage(imageName: _name, width: 50, height: 50)
            .background(Color.yellow)

            FittedImage(imageName: _name, width: 100, height: 50)
            .background(Color.yellow)

            FittedImage(imageName: _name, width: 50, height: 100)
            .background(Color.yellow)

            FittedImage(imageName: _name, width: 100, height: 100)
            .background(Color.yellow)

        }
    }
}

ফলাফল

দিক অনুপাত সংরক্ষণ করে লাগানো ছবি

(কোনও কারণে চিত্রটি কিছুটা অস্পষ্ট হিসাবে দেখানো হচ্ছে Rest আশ্বাস দিন যে আসল আউটপুটটি তীক্ষ্ণ।


আপনি সম্ভবত একটি অস্পষ্ট চিত্র দেখতে পাচ্ছেন কারণ আপনি একটি উচ্চ-ডিপিআই মনিটর ব্যবহার করছেন। আমি এটি একটি নিয়মিত-ডিপিআই মনিটরে
রেখেছি

4
এটি আসল দিক অনুপাত রাখে, কেবলমাত্র কারণ মূল চিত্রটির অনুপাত 1 (চিত্রটি একটি বর্গক্ষেত্র) এবং আপনি ব্যবহার করছেন .aspectRatio(1, ...। এটি বলার অপেক্ষা রাখে না যে এখানে অন্য কোনও সমাধান আমার পক্ষে এখনও কাজ করেছে ...
pm89

10

SwiftUI এ .resizable()কোনও চিত্রের আকার পরিবর্তন করতে পদ্ধতিটি ব্যবহার করুন । এটিকে .aspectRatio()নির্দিষ্ট করে নির্দিষ্ট করে ContentModeআপনি যথাযথভাবে "ফিট" বা "ফিল" করতে পারেন।

উদাহরণস্বরূপ, এখানে এমন কোড যা ফিটিংয়ের মাধ্যমে চিত্রটির আকার পরিবর্তন করে:

Image("example-image")
.resizable()
.aspectRatio(contentMode: .fit)

3
struct AvatarImage: View {
    var body: some View {

            Image("myImage")
                .resizable()
                .scaledToFill() // <=== Saves aspect ratio
                .frame(width: 60.0, height:60)
                .clipShape(Circle())

    }
}

3

দ্রষ্টব্য: আমার চিত্রের নামটি img_Logoএবং আপনি চিত্রের নামটি চিত্রের বৈশিষ্ট্যগুলি সংজ্ঞায়িত করতে এটি পরিবর্তন করতে পারেন:

 VStack(alignment: .leading, spacing: 1) {
                        //Image Logo Start
                        Image("img_Logo")
                            .resizable()
                            .padding(.all, 10.0)
                            .frame(width: UIScreen.main.bounds.width * 0.4, height: UIScreen.main.bounds.height * 0.2)
                        //Image Logo Done
                    }

আমি আপনাকে আপনার কোড সহ কিছুটা ব্যাখ্যা সহ একটি সংক্ষিপ্ত লেখার জন্য সুপারিশ করব : দয়া করে এখানে আচরণ বিধি কটাক্ষপাত আছে stackoverflow.com/conduct
disp_name

2

আপনি যদি পুনরায় আকারের সাথে দিক অনুপাত ব্যবহার করতে চান তবে নীচের কোডটি ব্যবহার করতে পারেন:

Image(landmark.imageName).resizable()
                .frame(width: 56.0, height: 56.0)
                .aspectRatio(CGSize(width:50, height: 50), contentMode: .fit)

2

যেহেতু আমাদের হার্ডকোড / চিত্রের আকার ঠিক করা উচিত নয়। বিভিন্ন ডিভাইসে স্ক্রিনের রেজোলিউশন অনুযায়ী সামঞ্জস্য করার জন্য এখানে পরিসর সরবরাহ করার একটি আরও ভাল উপায়।

Image("ImageName Here")
       .resizable()
       .frame(minWidth: 60.0, idealWidth: 75.0, maxWidth: 95.0, minHeight: 80.0, idealHeight: 95.0, maxHeight: 110.0, alignment: .center)
       .scaledToFit()
       .clipShape(Capsule())
       .shadow(color: Color.black.opacity(5.0), radius: 5, x: 5, y: 5)


1

আপনি যদি swiftUI এ চিত্রটির আকার পরিবর্তন করতে চান তবে কেবল নীচের কোডটি ব্যবহার করুন:

import SwiftUI

    struct ImageViewer : View{
        var body : some View {
            Image("Ssss")
            .resizable()
            .frame(width:50,height:50)
        }
    }

তবে এখানে এটি নিয়ে সমস্যা। আপনি যদি এই ছবিটি কোনও বোতামের মধ্যে যুক্ত করেন তবে চিত্রটি প্রদর্শিত হবে না, কেবল নীল রঙের একটি ব্লক থাকবে। এই সমস্যাটি সমাধান করার জন্য, কেবল এটি করুন:

import SwiftUI

struct ImageViewer : View{
    var body : some View {
        Button(action:{}){
        Image("Ssss")
        .renderingMode(.original)
        .resizable()
        .frame(width:50,height:50)
    }
   }
}

1

ওয়েল, এটি সুইফটিউআইতে / তারা প্রদত্ত ডেমো অনুসরণ করে বেশ সহজ বলে মনে হচ্ছে : https://developer.apple.com/videos/play/wwdc2019/204

struct RoomDetail: View {
     let room: Room
     var body: some View {

     Image(room.imageName)
       .resizable()
       .aspectRatio(contentMode: .fit)
 }

আশা করি এটা সাহায্য করবে.


1

আপনি চিত্রের বৈশিষ্ট্যগুলি নিম্নলিখিত হিসাবে সংজ্ঞায়িত করতে পারেন: -

   Image("\(Image Name)")
   .resizable() // Let you resize the images
   .frame(width: 20, height: 20) // define frame size as required
   .background(RoundedRectangle(cornerRadius: 12) // Set round corners
   .foregroundColor(Color("darkGreen"))      // define foreground colour 

1

কোডের যৌক্তিক কাঠামো বোঝা খুব গুরুত্বপূর্ণ। SwiftUI এর মতো একটি চিত্রও ডিফল্টরূপে পুনরায় আকার পরিবর্তন করতে পারে না। সুতরাং, যে কোনও চিত্রকে পুনরায় আকার দিতে আপনার কোনও চিত্রের দৃশ্যের ঘোষণার পরপরই .resizable () পরিবর্তনকারী প্রয়োগ করে এটিকে পুনরায় আকার পরিবর্তন করতে হবে।

Image("An Image file name")
    .resizable()

1

ডিফল্টরূপে চিত্রের দর্শনগুলি তাদের বিষয়বস্তুগুলিতে স্বয়ংক্রিয়ভাবে আকার দেয়, যা তাদের পর্দার বাইরে যেতে পারে। আপনি যদি পুনরায় আকার পরিবর্তনযোগ্য () সংশোধক যোগ করেন তবে চিত্রটি এর পরিবর্তে স্বয়ংক্রিয় আকারযুক্ত হবে যাতে এটি সমস্ত উপলব্ধ স্থান পূরণ করে:

Image("example-image")
    .resizable()

যাইহোক, এটি চিত্রটির মূল দিক অনুপাতটিকে বিকৃত করতেও কারণ হতে পারে কারণ এটি স্থান পূরণ করতে যে পরিমাণ পরিমাণ প্রয়োজন তা দিয়ে এটি সমস্ত মাত্রায় প্রসারিত হবে।

আপনি যদি তার দিক অনুপাত রাখতে চান তবে আপনার .Pill বা। ফিট ব্যবহার করে একটি অনুপাত রেশি সংশোধক যুক্ত করা উচিত:

Image("example-image")
    .resizable()
    .aspectRatio(contentMode: .fit)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.